renamed org.eclipse.jpt.eclipselink.core.tests to org.eclipse.jpt.jpa.eclipselink.core.tests
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.classpath b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.classpath
new file mode 100644
index 0000000..db34e47
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.classpath
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+		<accessrules>
+			<accessrule kind="accessible" pattern="org/eclipse/wst/**"/>
+			<accessrule kind="accessible" pattern="org/eclipse/jst/**"/>
+			<accessrule kind="accessible" pattern="org/eclipse/jpt/**"/>
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.cvsignore b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.cvsignore
new file mode 100644
index 0000000..c4ba612
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.cvsignore
@@ -0,0 +1,5 @@
+bin
+@dot
+temp.folder
+build.xml
+javaCompiler...args
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.project b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.project
new file mode 100644
index 0000000..0dcf45f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jpt.jpa.eclipselink.core.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.settings/org.eclipse.core.resources.prefs b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..11155f4
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Mon Apr 07 14:26:54 EDT 2008
+eclipse.preferences.version=1
+encoding/<project>=ISO-8859-1
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.settings/org.eclipse.jdt.core.prefs b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8bab913
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Mon Jul 07 20:13:24 EDT 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/META-INF/MANIFEST.MF b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d02b16e
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,46 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-SymbolicName: org.eclipse.jpt.jpa.eclipselink.core.tests
+Bundle-Version: 1.4.0.qualifier
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.core.commands;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.jpt.common.core;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.jpt.common.core.tests;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.jpt.common.utility;bundle-version="[1.2.0,2.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.jpt.jpa.core;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.jpt.jpa.eclipselink.core;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.jpt.jpa.core.tests;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.wst.common.emf;bundle-version="[1.1.201,2.0.0)",
+ org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.201,2.0.0)",
+ org.eclipse.wst.common.frameworks;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.wst.common.modulecore;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.wst.common.project.facet.core;bundle-version="[1.3.0,2.0.0)",
+ org.junit;bundle-version="3.8.0"
+Export-Package: org.eclipse.jpt.jpa.eclipselink.core.tests.internal;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.caching;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.connection;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.customization;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.general;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.logging;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.options;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.schema.generation;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context.orm;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_2.context;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;x-internal:=true,
+ org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.persistence;x-internal:=true
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/about.html b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/about.html
new file mode 100644
index 0000000..be534ba
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/about.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<HTML>
+
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+
+<BODY lang="EN-US">
+
+<H3>About This Content</H3>
+
+<P>May 02, 2008</P>
+
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in 
+("Content"). Unless otherwise indicated below, the Content is provided to you 
+under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at
+<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the 
+Content is being redistributed by another party ("Redistributor") and different 
+terms and conditions may apply to your use of any object code in the Content. 
+Check the Redistributor's license that was provided with the Content. If no such 
+license exists, contact the Redistributor. Unless otherwise indicated below, the 
+terms and conditions of the EPL still apply to any source code in the Content 
+and such source code may be obtained at
+<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
+
+</BODY>
+</HTML>
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/build.properties b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/build.properties
new file mode 100644
index 0000000..96de1ee
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/build.properties
@@ -0,0 +1,18 @@
+################################################################################
+# Copyright (c) 2006, 2008 Oracle. All rights reserved.
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v1.0, which accompanies this distribution
+# and is available at http://www.eclipse.org/legal/epl-v10.html.
+# 
+# Contributors:
+#     Oracle - initial API and implementation
+################################################################################
+javacSource = 1.5
+javacTarget = 1.5
+bin.includes = .,\
+               META-INF/,\
+               about.html,\
+               test.xml,\
+               plugin.properties
+source.. = src/
+output.. = bin/
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/plugin.properties b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/plugin.properties
new file mode 100644
index 0000000..5b9cfcd
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/plugin.properties
@@ -0,0 +1,23 @@
+################################################################################
+# Copyright (c) 2006, 2009 Oracle. All rights reserved.
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v1.0, which accompanies this distribution
+# and is available at http://www.eclipse.org/legal/epl-v10.html.
+# 
+# Contributors:
+#     Oracle - initial API and implementation
+################################################################################
+# ====================================================================
+# To code developer:
+#   Do NOT change the properties between this line and the
+#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
+#   Make a new property name, append to the end of the file and change
+#   the code to use the new property.
+# ====================================================================
+
+# ====================================================================
+# %%% END OF TRANSLATED PROPERTIES %%%
+# ====================================================================
+
+pluginName=Dali Java Persistence Tools - EclipseLink Support - Core Tests
+providerName=Eclipse Web Tools Platform
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/JptJpaEclipseLinkCoreTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/JptJpaEclipseLinkCoreTests.java
new file mode 100644
index 0000000..8b2340b
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/JptJpaEclipseLinkCoreTests.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal;
+
+import java.io.File;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.eclipse.jpt.jpa.core.tests.internal.projects.TestJpaProject;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.JptEclipseLinkCoreContextModelTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.JptJpaEclipselinkCoreResourceModelTests;
+
+/**
+ * decentralize test creation code
+ * 
+ * Required Java system property:
+ *    -Dorg.eclipse.jpt.jpa.jar=<jpa.jar path>
+ *    -Dorg.eclipse.jpt.eclipselink.jar=<eclipselink.jar path>
+ */
+@SuppressWarnings("nls")
+public class JptJpaEclipseLinkCoreTests
+{
+	private static final String JPA_JAR_PROPERTY = TestJpaProject.JPA_JAR_NAME_SYSTEM_PROPERTY;
+	private static final String ECLIPSELINK_JAR_PROPERTY = TestJpaProject.ECLIPSELINK_JAR_NAME_SYSTEM_PROPERTY;
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptJpaEclipseLinkCoreTests.class.getPackage().getName());
+		suite.addTest(JptJpaEclipselinkCoreResourceModelTests.suite());
+		suite.addTest(JptEclipseLinkCoreContextModelTests.suite());
+		return suite;
+	}
+
+	public static boolean requiredJarsExists() {
+		return jpaJarPropertyExists()
+			&& jpaJarFileExists()
+			&& eclipselinkJarPropertyExists()
+			&& eclipselinkJarFileExists();
+	}
+	
+	public static boolean jpaJarPropertyExists() {
+		return getSystemProperty(JPA_JAR_PROPERTY) != null;
+	}
+	
+	public static boolean jpaJarFileExists() {
+		return (new File(getSystemProperty(JPA_JAR_PROPERTY))).exists();
+	}
+	
+	public static boolean eclipselinkJarPropertyExists() {
+		return getSystemProperty(ECLIPSELINK_JAR_PROPERTY) != null;
+	}
+	
+	public static boolean eclipselinkJarFileExists() {
+		return (new File(getSystemProperty(ECLIPSELINK_JAR_PROPERTY))).exists();
+	}
+
+	public static String buildMissingJarErrorMessage() {
+		if( ! jpaJarPropertyExists()) {
+			return errorMissingProperty(JPA_JAR_PROPERTY);
+		}
+		else if( ! jpaJarFileExists()) {
+			return errorJarFileDoesNotExist(getSystemProperty(JPA_JAR_PROPERTY));
+		}
+		else if( ! eclipselinkJarPropertyExists()) {
+			return errorMissingProperty(ECLIPSELINK_JAR_PROPERTY);
+		}
+		return errorJarFileDoesNotExist(getSystemProperty(ECLIPSELINK_JAR_PROPERTY));
+	}
+
+	/*********** private **********/
+
+	private static String errorMissingProperty(String propertyName) {
+		return "missing Java system property: \"" + propertyName + "\"";
+	}
+
+	private static String errorJarFileDoesNotExist(String propertyValue) {
+		return "JAR file doesn't exist: \"" + propertyValue + "\"";
+	}
+
+	private static String getSystemProperty(String propertyName) {
+		return System.getProperty(propertyName);
+	}
+	
+	private JptJpaEclipseLinkCoreTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/EclipseLinkContextModelTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/EclipseLinkContextModelTestCase.java
new file mode 100644
index 0000000..921d920
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/EclipseLinkContextModelTestCase.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ *  Copyright (c) 2008, 2010 Oracle. 
+ *  All rights reserved.  This program and the accompanying materials are 
+ *  made available under the terms of the Eclipse Public License v1.0 which 
+ *  accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context;
+
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.core.tests.internal.context.ContextModelTestCase;
+import org.eclipse.jpt.jpa.eclipselink.core.EclipseLinkJpaProject;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.platform.EclipseLinkPlatform;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public abstract class EclipseLinkContextModelTestCase
+	extends ContextModelTestCase
+{
+	protected EclipseLinkContextModelTestCase(String name) {
+		super(name);
+	}
+	
+	
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.PLATFORM, EclipseLinkPlatform.VERSION_1_0);
+		return dataModel;
+	}
+	
+	@Override
+	protected EclipseLinkJpaProject getJpaProject() {
+		return (EclipseLinkJpaProject) super.getJpaProject();
+	}
+	
+	@Override
+	protected EclipseLinkPersistenceUnit getPersistenceUnit() {
+		return (EclipseLinkPersistenceUnit) super.getPersistenceUnit();
+	}
+	
+	@Override
+	protected JavaEclipseLinkEntity getJavaEntity() {
+		return (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/EclipseLinkJpaProjectTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/EclipseLinkJpaProjectTests.java
new file mode 100644
index 0000000..40cf67f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/EclipseLinkJpaProjectTests.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.eclipselink.core.JptJpaEclipseLinkCorePlugin;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJpaProjectTests extends EclipseLinkContextModelTestCase
+{
+	
+	public EclipseLinkJpaProjectTests(String name) {
+		super(name);
+	}
+	
+	
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		// don't build orm.xml
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.CREATE_ORM_XML, Boolean.FALSE);
+		return dataModel;
+	}
+	
+	public void testGetDefaultOrmXmlResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNull(resource);
+		
+		//add the orm.xml file with eclipselink orm content type
+		createDefaultOrmXmlFileWithEclipseLinkContentType();
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		
+		//delete the orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNull(resource);
+		
+		
+		//add the orm.xml file this time with orm content type
+		createDefaultOrmXmlFile();
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaCorePlugin.ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());
+	}
+	
+	public void testGetDefaultEclipseLinkOrmXmlResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+		assertNull(resource);
+		
+		//add the eclipselink-orm.xml file
+		createDefaultEclipseLinkOrmXmlFile();
+		resource = this.getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/eclipselink-orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		
+		//delete the eclipselink-orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+		assertNull(resource);
+	}
+	
+	private void createDefaultOrmXmlFile() throws Exception {
+		IDataModel config =
+			DataModelFactory.createDataModel(new OrmFileCreationDataModelProvider());
+		config.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				getJpaProject().getProject().getFolder("src/META-INF").getFullPath());
+		config.getDefaultOperation().execute(null, null);
+	}
+	
+	private void createDefaultOrmXmlFileWithEclipseLinkContentType() throws Exception {
+		createEclipseLinkOrmXmlFile(JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.lastSegment());
+	}
+	
+	private void createDefaultEclipseLinkOrmXmlFile() throws Exception {
+		createEclipseLinkOrmXmlFile(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH.lastSegment());
+	}
+	
+	private void createEclipseLinkOrmXmlFile(String fileName) throws Exception {
+		IDataModel config =
+			DataModelFactory.createDataModel(new EclipseLinkOrmFileCreationDataModelProvider());
+		config.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				getJpaProject().getProject().getFolder("src/META-INF").getFullPath());
+		config.setProperty(JptFileCreationDataModelProperties.FILE_NAME, fileName);
+		config.getDefaultOperation().execute(null, null);
+	}
+	
+	public void testGetMappingFileResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getMappingFileXmlResource(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH);
+		assertNull(resource);
+		
+		//add the eclipselink-orm.xml file
+		createDefaultEclipseLinkOrmXmlFile();
+		resource = this.getJpaProject().getMappingFileXmlResource(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH);
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/eclipselink-orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		//delete the eclipselink-orm.xml file and verify it is not returned from getMappingFileResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getMappingFileXmlResource(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH);
+		assertNull(resource);
+	}
+	
+	public void testGetDifferentlyNamedMappingFileResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNull(resource);
+
+		//create the orm2.xml file
+		createEclipseLinkOrmXmlFile("orm2.xml");
+		resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm2.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		//delete the orm2.xml file and verify it is not returned from getMappingFileResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNull(resource);
+		
+		//add the orm2.xml file back
+		createEclipseLinkOrmXmlFile("orm2.xml");
+		resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm2.xml", resource.getFile().getProjectRelativePath().toString());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/JptEclipseLink1_0CoreContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/JptEclipseLink1_0CoreContextModelTests.java
new file mode 100644
index 0000000..308284a
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/JptEclipseLink1_0CoreContextModelTests.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java.JptEclipseLinkCoreJavaContextModelTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm.JptEclipseLinkCoreOrmContextModelTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.JptEclipseLinkCorePersistenceContextModelTests;
+
+public class JptEclipseLink1_0CoreContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLink1_0CoreContextModelTests.class.getName());
+		suite.addTestSuite(EclipseLinkJpaProjectTests.class);
+		suite.addTest(JptEclipseLinkCorePersistenceContextModelTests.suite());
+		suite.addTest(JptEclipseLinkCoreJavaContextModelTests.suite());
+		suite.addTest(JptEclipseLinkCoreOrmContextModelTests.suite());
+		return suite;
+	}
+
+	private JptEclipseLink1_0CoreContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/JptEclipseLinkCoreContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/JptEclipseLinkCoreContextModelTests.java
new file mode 100644
index 0000000..db87f11
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/JptEclipseLinkCoreContextModelTests.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.JptJpaEclipseLinkCoreTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context.JptEclipseLink1_1CoreContextModelTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_2.context.JptEclipseLink1_2CoreContextModelTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.JptEclipseLink2_0CoreContextModelTests;
+
+/**
+ * Required Java system property:
+ *    -Dorg.eclipse.jpt.jpa.jar=<jpa.jar path>
+ *    -Dorg.eclipse.jpt.eclipselink.jar=<eclipselink.jar path>
+ */
+public class JptEclipseLinkCoreContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkCoreContextModelTests.class.getName());
+		if(JptJpaEclipseLinkCoreTests.requiredJarsExists()) {
+			suite.addTest(JptEclipseLink1_0CoreContextModelTests.suite());
+			suite.addTest(JptEclipseLink1_1CoreContextModelTests.suite());
+			suite.addTest(JptEclipseLink1_2CoreContextModelTests.suite());
+			suite.addTest(JptEclipseLink2_0CoreContextModelTests.suite());
+		}
+		else {
+			suite.addTest(TestSuite.warning(JptJpaEclipseLinkCoreTests.buildMissingJarErrorMessage()));
+		}
+		return suite;
+	}
+
+	private JptEclipseLinkCoreContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaBasicMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaBasicMappingTests.java
new file mode 100644
index 0000000..c6f779f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaBasicMappingTests.java
@@ -0,0 +1,322 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.TemporalConverter;
+import org.eclipse.jpt.jpa.core.context.TemporalType;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.TemporalAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkBasicMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkMutable;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkConvertAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkMutableAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaBasicMappingTests extends EclipseLinkContextModelTestCase
+{	
+	
+	private ICompilationUnit createTestEntityWithBasicMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+			}
+		});
+	}
+
+	
+	private ICompilationUnit createTestEntityWithConvert() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"class-instance\")").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithMutableBasic() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC, EclipseLink.MUTABLE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+				sb.append("@Mutable").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithMutableBasicDate() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC, EclipseLink.MUTABLE, "java.util.Date");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+				sb.append("    @Mutable").append(CR);
+				sb.append("    private Date myDate;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+
+	public EclipseLinkJavaBasicMappingTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetConvert() throws Exception {
+		createTestEntityWithBasicMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.addAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+
+		assertEquals(EclipseLinkConvert.class, basicMapping.getConverter().getType());
+	}
+	
+	public void testGetConvert2() throws Exception {
+		createTestEntityWithConvert();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+
+		assertEquals(EclipseLinkConvert.class, basicMapping.getConverter().getType());
+		assertEquals(EclipseLinkConvert.CLASS_INSTANCE_CONVERTER, ((EclipseLinkConvert) basicMapping.getConverter()).getConverterName());
+	}
+
+	public void testSetConvert() throws Exception {
+		createTestEntityWithBasicMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		assertNull(basicMapping.getConverter().getType());
+		
+		basicMapping.setConverter(TemporalConverter.class);
+		((TemporalConverter) basicMapping.getConverter()).setTemporalType(TemporalType.TIME);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		TemporalAnnotation temporal = (TemporalAnnotation) attributeResource.getAnnotation(TemporalAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.core.resource.java.TemporalType.TIME, temporal.getValue());
+		
+		basicMapping.setConverter(null);
+		assertNull(attributeResource.getAnnotation(TemporalAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testGetConvertUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithBasicMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+
+		assertNull(basicMapping.getConverter().getType());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkConvertAnnotation convert = (EclipseLinkConvertAnnotation) attributeResource.addAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		convert.setValue("foo");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(EclipseLinkConvert.class, basicMapping.getConverter().getType());
+		assertEquals("foo", ((EclipseLinkConvert) basicMapping.getConverter()).getConverterName());
+		
+		attributeResource.removeAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(basicMapping.getConverter().getType());
+		assertFalse(basicMapping.isDefault());
+		assertSame(basicMapping, persistentAttribute.getMapping());
+	}
+	
+	public void testGetSpecifiedMutable() throws Exception {
+		createTestEntityWithMutableBasic();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkBasicMapping basicMapping = (EclipseLinkBasicMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = basicMapping.getMutable();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkMutableAnnotation mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		mutableAnnotation.setValue(Boolean.TRUE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+
+		mutableAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+
+		mutableAnnotation.setValue(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.FALSE, mutable.getSpecifiedMutable());
+		
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, mutable.getSpecifiedMutable());
+		
+		attributeResource.addAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+	}
+	
+	public void testSetSpecifiedMutable() throws Exception {
+		createTestEntityWithMutableBasic();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkBasicMapping basicMapping = (EclipseLinkBasicMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = basicMapping.getMutable();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkMutableAnnotation mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertEquals(null, mutableAnnotation.getValue());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertEquals(null, mutableAnnotation.getValue());
+
+		mutable.setSpecifiedMutable(null);
+		mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertEquals(null, mutableAnnotation);
+		
+		mutable.setSpecifiedMutable(Boolean.FALSE);	
+		mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertEquals(Boolean.FALSE, mutableAnnotation.getValue());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertEquals(Boolean.TRUE, mutableAnnotation.getValue());
+	}
+	
+	public void testIsDefaultMutable() throws Exception {
+		createTestEntityWithMutableBasic();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkBasicMapping basicMapping = (EclipseLinkBasicMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = basicMapping.getMutable();
+		assertTrue(mutable.isDefaultMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertTrue(mutable.isDefaultMutable());
+		
+		mutable.setSpecifiedMutable(Boolean.FALSE);	
+		assertTrue(mutable.isDefaultMutable());
+		
+		//set mutable default to false in the persistence unit properties, verify default in java still true since this is not a Date/Calendar
+		getPersistenceUnit().getOptions().setTemporalMutable(Boolean.FALSE);
+		assertTrue(mutable.isDefaultMutable());
+	}
+	
+	public void testIsDefaultMutableForDate() throws Exception {
+		createTestEntityWithMutableBasicDate();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkBasicMapping basicMapping = (EclipseLinkBasicMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = basicMapping.getMutable();
+		assertFalse(mutable.isDefaultMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertFalse(mutable.isDefaultMutable());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertFalse(mutable.isDefaultMutable());
+		
+		//set mutable default to false in the persistence unit properties, verify default in java still true since this is not a Date/Calendar
+		getPersistenceUnit().getOptions().setTemporalMutable(Boolean.TRUE);
+		assertTrue(mutable.isDefaultMutable());
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(Boolean.FALSE);
+		assertFalse(mutable.isDefaultMutable());
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(null);
+		assertFalse(mutable.isDefaultMutable());
+	}
+	
+	public void testIsMutable() throws Exception {
+		createTestEntityWithMutableBasic();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkBasicMapping basicMapping = (EclipseLinkBasicMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = basicMapping.getMutable();
+		assertTrue(mutable.isMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertTrue(mutable.isMutable());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertTrue(mutable.isMutable());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaCachingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaCachingTests.java
new file mode 100644
index 0000000..9f44676
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaCachingTests.java
@@ -0,0 +1,646 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCacheCoordinationType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCacheType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkExistenceType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTimeOfDay;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkCaching;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkCacheAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkExistenceCheckingAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaCachingTests extends EclipseLinkContextModelTestCase
+{	
+	public EclipseLinkJavaCachingTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestEntity() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+		});
+	}
+	
+	public void testSetSpecifiedShared() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(true, caching.isShared());
+		
+		caching.setSpecifiedShared(Boolean.FALSE);
+		
+		
+		assertEquals(Boolean.FALSE, entity.getCaching().getSpecifiedShared());
+		assertEquals(false, entity.getCaching().isShared());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		assertEquals(Boolean.FALSE, cacheAnnotation.getShared());		
+	}
+	
+	public void testSetSpecifiedSharedFalseUnsetsOtherCacheSettings() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		caching.setSpecifiedType(EclipseLinkCacheType.HARD_WEAK);
+		caching.setSpecifiedSize(Integer.valueOf(500));
+		caching.setSpecifiedAlwaysRefresh(Boolean.FALSE);
+		caching.setSpecifiedRefreshOnlyIfNewer(Boolean.FALSE);
+		caching.setSpecifiedDisableHits(Boolean.FALSE);
+		caching.setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS);
+		caching.setExistenceChecking(true);
+		caching.setSpecifiedExistenceType(EclipseLinkExistenceType.CHECK_CACHE);
+		caching.setExpiry(Integer.valueOf(8000));
+		
+		caching.setSpecifiedShared(Boolean.FALSE);
+		
+		assertEquals(null, caching.getSpecifiedType());
+		assertEquals(null, caching.getSpecifiedSize());
+		assertEquals(null, caching.getSpecifiedAlwaysRefresh());
+		assertEquals(null, caching.getSpecifiedRefreshOnlyIfNewer());
+		assertEquals(null, caching.getSpecifiedDisableHits());
+		assertEquals(null, caching.getSpecifiedCoordinationType());
+		assertEquals(null, caching.getExpiry());
+		
+		
+		//existence checking is the only thing that isn't unset when shared is set to false
+		assertTrue(caching.isExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_CACHE, caching.getSpecifiedExistenceType());
+		
+		caching.setSpecifiedShared(null);
+		EclipseLinkTimeOfDay timeOfDayExpiry = caching.addExpiryTimeOfDay();
+		timeOfDayExpiry.setHour(Integer.valueOf(5));
+		
+		caching.setSpecifiedShared(Boolean.FALSE);
+		assertNull(caching.getExpiryTimeOfDay());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		assertEquals(Boolean.FALSE, cacheAnnotation.getShared());
+		assertNull(cacheAnnotation.getExpiryTimeOfDay());
+	}
+	
+	public void testGetSpecifiedShared() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(true, caching.isShared());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+		cacheAnnotation.setShared(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(Boolean.FALSE, cacheAnnotation.getShared());				
+		assertEquals(Boolean.FALSE, entity.getCaching().getSpecifiedShared());
+		assertEquals(false, entity.getCaching().isShared());
+	}
+	
+	public void testSetSpecifiedType() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, caching.getType());
+		
+		caching.setSpecifiedType(EclipseLinkCacheType.HARD_WEAK);
+		
+		
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, entity.getCaching().getSpecifiedType());
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, entity.getCaching().getType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheType.HARD_WEAK, cacheAnnotation.getType());		
+
+	
+		//set specified type to the same as the default, verify it is not set to default
+		caching.setSpecifiedType(EclipseLinkCacheType.SOFT_WEAK);
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, caching.getSpecifiedType());
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheType.SOFT_WEAK, cacheAnnotation.getType());		
+		
+		caching.setSpecifiedType(null);
+		assertNull(caching.getSpecifiedType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, caching.getType());
+	}
+	
+	public void testGetSpecifiedType() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, caching.getType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+		cacheAnnotation.setType(org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheType.HARD_WEAK);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheType.HARD_WEAK, cacheAnnotation.getType());				
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, entity.getCaching().getSpecifiedType());
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, entity.getCaching().getType());
+	}
+
+	public void testSetSpecifiedAlwaysRefresh() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(false, caching.isAlwaysRefresh());
+		
+		caching.setSpecifiedAlwaysRefresh(Boolean.FALSE);
+		
+		
+		assertEquals(Boolean.FALSE, entity.getCaching().getSpecifiedAlwaysRefresh());
+		assertEquals(false, entity.getCaching().isAlwaysRefresh());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		assertEquals(Boolean.FALSE, cacheAnnotation.getAlwaysRefresh());		
+	}
+	
+	public void testGetSpecifiedAlwaysRefresh() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(false, caching.isAlwaysRefresh());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+		cacheAnnotation.setAlwaysRefresh(Boolean.TRUE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(Boolean.TRUE, cacheAnnotation.getAlwaysRefresh());				
+		assertEquals(Boolean.TRUE, entity.getCaching().getSpecifiedAlwaysRefresh());
+		assertEquals(true, entity.getCaching().isAlwaysRefresh());
+	}
+	
+	public void testSetSpecifiedRefreshOnlyIfNewer() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(false, caching.isRefreshOnlyIfNewer());
+		
+		caching.setSpecifiedRefreshOnlyIfNewer(Boolean.TRUE);
+		
+		
+		assertEquals(Boolean.TRUE, entity.getCaching().getSpecifiedRefreshOnlyIfNewer());
+		assertEquals(true, entity.getCaching().isRefreshOnlyIfNewer());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		assertEquals(Boolean.TRUE, cacheAnnotation.getRefreshOnlyIfNewer());		
+	}
+	
+	public void testGetSpecifiedRefreshOnlyIfNewer() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(false, caching.isRefreshOnlyIfNewer());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+		cacheAnnotation.setRefreshOnlyIfNewer(Boolean.TRUE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(Boolean.TRUE, cacheAnnotation.getRefreshOnlyIfNewer());				
+		assertEquals(Boolean.TRUE, entity.getCaching().getSpecifiedRefreshOnlyIfNewer());
+		assertEquals(true, entity.getCaching().isRefreshOnlyIfNewer());
+	}
+
+	public void testSetSpecifiedDisableHits() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(false, caching.isDisableHits());
+		
+		caching.setSpecifiedDisableHits(Boolean.TRUE);
+		
+		
+		assertEquals(Boolean.TRUE, entity.getCaching().getSpecifiedDisableHits());
+		assertEquals(true, entity.getCaching().isDisableHits());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		assertEquals(Boolean.TRUE, cacheAnnotation.getDisableHits());		
+	}
+	
+	public void testGetSpecifiedDisableHits() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(false, caching.isDisableHits());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+		cacheAnnotation.setDisableHits(Boolean.TRUE);
+		getJpaProject().synchronizeContextModel();
+	
+		assertEquals(Boolean.TRUE, cacheAnnotation.getDisableHits());				
+		assertEquals(Boolean.TRUE, entity.getCaching().getSpecifiedDisableHits());
+		assertEquals(true, entity.getCaching().isDisableHits());
+	}
+
+	public void testSetSpecifiedCoordinationType() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, caching.getCoordinationType());
+		
+		caching.setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS);
+		
+		
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, entity.getCaching().getSpecifiedCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, entity.getCaching().getCoordinationType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, cacheAnnotation.getCoordinationType());		
+
+	
+		//set specified coordination type to the same as the default, verify it is not set to default
+		caching.setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES);
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, caching.getSpecifiedCoordinationType());
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheCoordinationType.SEND_OBJECT_CHANGES, cacheAnnotation.getCoordinationType());		
+		
+		caching.setSpecifiedCoordinationType(null);
+		assertNull(caching.getSpecifiedCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, caching.getCoordinationType());
+	}
+	
+	public void testGetSpecifiedCoordinationType() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, caching.getCoordinationType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+		cacheAnnotation.setCoordinationType(org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, cacheAnnotation.getCoordinationType());				
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, entity.getCaching().getSpecifiedCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, entity.getCaching().getCoordinationType());
+	}
+	
+	public void testHasExistenceChecking() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(false, caching.isExistenceChecking());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		typeResource.addAnnotation(EclipseLink.EXISTENCE_CHECKING);	
+		getJpaProject().synchronizeContextModel();
+		assertEquals(true, caching.isExistenceChecking());
+	
+		typeResource.removeAnnotation(EclipseLink.EXISTENCE_CHECKING);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(false, caching.isExistenceChecking());
+	}
+	
+	public void testSetExistenceChecking() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		assertEquals(false, caching.isExistenceChecking());
+		assertNull(typeResource.getAnnotation(EclipseLink.EXISTENCE_CHECKING));
+		
+		caching.setExistenceChecking(true);
+		
+		assertEquals(true, caching.isExistenceChecking());
+		assertNotNull(typeResource.getAnnotation(EclipseLink.EXISTENCE_CHECKING));
+	}
+	
+	public void testGetDefaultExistenceType() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, caching.getDefaultExistenceType());
+
+		caching.setExistenceChecking(true);
+		assertEquals(EclipseLinkExistenceType.CHECK_CACHE, caching.getDefaultExistenceType());
+	}
+	
+	public void testGetSpecifiedExistenceType() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, caching.getExistenceType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkExistenceCheckingAnnotation existenceCheckingAnnotation = (EclipseLinkExistenceCheckingAnnotation) typeResource.addAnnotation(EclipseLink.EXISTENCE_CHECKING);
+		existenceCheckingAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ExistenceType.ASSUME_NON_EXISTENCE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ExistenceType.ASSUME_NON_EXISTENCE, existenceCheckingAnnotation.getValue());				
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, entity.getCaching().getSpecifiedExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, entity.getCaching().getExistenceType());
+	}
+	
+	public void testSetSpecifiedExistenceType() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, caching.getExistenceType());
+		
+		caching.setExistenceChecking(true);
+		caching.setSpecifiedExistenceType(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE);
+		
+		
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, entity.getCaching().getSpecifiedExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, entity.getCaching().getExistenceType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkExistenceCheckingAnnotation existenceCheckingAnnotation = (EclipseLinkExistenceCheckingAnnotation) typeResource.getAnnotation(EclipseLink.EXISTENCE_CHECKING);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ExistenceType.ASSUME_NON_EXISTENCE, existenceCheckingAnnotation.getValue());		
+
+	
+		//set specified coordination type to the same as the default, verify it is not set to default
+		caching.setSpecifiedExistenceType(EclipseLinkExistenceType.CHECK_DATABASE);
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, caching.getSpecifiedExistenceType());
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ExistenceType.CHECK_DATABASE, existenceCheckingAnnotation.getValue());		
+		
+		caching.setSpecifiedExistenceType(null);
+		assertNull(caching.getSpecifiedExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_CACHE, caching.getExistenceType());
+	}
+
+	public void testGetExpiry() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		
+		assertNull(entity.getCaching().getExpiry());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+		assertNull(entity.getCaching().getExpiry());
+		
+		cacheAnnotation.setExpiry(Integer.valueOf(57));
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(Integer.valueOf(57), entity.getCaching().getExpiry());
+		
+		typeResource.removeAnnotation(EclipseLink.CACHE);
+		getJpaProject().synchronizeContextModel();
+		assertNull(entity.getCaching().getExpiry());	
+	}
+	
+	public void testSetExpiry() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		caching.setExpiry(Integer.valueOf(58));
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Integer.valueOf(58), cacheAnnotation.getExpiry());
+		
+		
+		caching.setExpiry(null);
+		cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertNull(cacheAnnotation.getExpiry());
+	}
+	
+	public void testSetExpiryUnsetsExpiryTimeOfDay() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		caching.addExpiryTimeOfDay();
+		caching.getExpiryTimeOfDay().setHour(Integer.valueOf(5));
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Integer.valueOf(5), cacheAnnotation.getExpiryTimeOfDay().getHour());
+		
+		caching.setExpiry(Integer.valueOf(900));
+		
+		assertNull(caching.getExpiryTimeOfDay());
+		assertNull(cacheAnnotation.getExpiryTimeOfDay());
+		assertEquals(Integer.valueOf(900), cacheAnnotation.getExpiry());	
+		assertEquals(Integer.valueOf(900), caching.getExpiry());	
+	}
+	
+	public void testGetTimeOfDayExpiry() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertNull(caching.getExpiryTimeOfDay());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+
+		cacheAnnotation.addExpiryTimeOfDay();
+		getJpaProject().synchronizeContextModel();
+		
+		assertNotNull(caching.getExpiryTimeOfDay());
+	}
+	
+	public void testAddTimeOfDayExpiry() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertNull(caching.getExpiryTimeOfDay());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+
+		EclipseLinkTimeOfDay timeOfDayExpiry = caching.addExpiryTimeOfDay();
+		
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertNotNull(cacheAnnotation.getExpiryTimeOfDay());
+		assertNotNull(caching.getExpiryTimeOfDay());
+		assertEquals(timeOfDayExpiry, caching.getExpiryTimeOfDay());
+	}
+	
+	public void testRemoveTimeOfDayExpiry() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertNull(caching.getExpiryTimeOfDay());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+		cacheAnnotation.addExpiryTimeOfDay();
+		getJpaProject().synchronizeContextModel();
+
+		assertNotNull(caching.getExpiryTimeOfDay());
+		
+		caching.removeExpiryTimeOfDay();
+		getJpaProject().synchronizeContextModel();
+		assertNull(caching.getExpiryTimeOfDay());
+	}
+	
+	public void testAddTimeOfDayExpiryUnsetsExpiry() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		caching.setExpiry(Integer.valueOf(800));
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Integer.valueOf(800), cacheAnnotation.getExpiry());	
+		
+		
+		caching.addExpiryTimeOfDay();
+
+		
+		assertNull(caching.getExpiry());
+		assertNull(cacheAnnotation.getExpiry());
+		assertNotNull(cacheAnnotation.getExpiryTimeOfDay());
+	}
+
+	
+	public void testSetSpecifiedSize() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(100, caching.getSize());
+		
+		caching.setSpecifiedSize(new Integer(50));
+		
+		
+		assertEquals(new Integer(50), entity.getCaching().getSpecifiedSize());
+		assertEquals(50, entity.getCaching().getSize());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		assertEquals(new Integer(50), cacheAnnotation.getSize());		
+	}
+	
+	public void testGetSpecifiedSize() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaEclipseLinkEntity entity = (JavaEclipseLinkEntity) getJavaPersistentType().getMapping();
+		JavaEclipseLinkCaching caching = entity.getCaching();
+		
+		assertEquals(100, caching.getSize());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCacheAnnotation cacheAnnotation = (EclipseLinkCacheAnnotation) typeResource.addAnnotation(EclipseLink.CACHE);
+		cacheAnnotation.setSize(new Integer(50));
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(new Integer(50), cacheAnnotation.getSize());				
+		assertEquals(new Integer(50), entity.getCaching().getSpecifiedSize());
+		assertEquals(50, entity.getCaching().getSize());
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaConvertTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaConvertTests.java
new file mode 100644
index 0000000..cbf6b68
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaConvertTests.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkConvertAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkStructConverterAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkTypeConverterAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaConvertTests extends EclipseLinkContextModelTestCase
+{
+
+	private ICompilationUnit createTestEntityWithBasicMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+			}
+		});
+	}
+
+	
+	private ICompilationUnit createTestEntityWithConvert() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"class-instance\")").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithConvertAndTypeConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.TYPE_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"class-instance\")").append(CR);
+				sb.append("    @TypeConverter");
+			}
+		});
+	}
+	
+	public EclipseLinkJavaConvertTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetConverterName() throws Exception {
+		createTestEntityWithBasicMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.addAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		
+		assertEquals(EclipseLinkConvert.NO_CONVERTER, eclipseLinkConvert.getConverterName());
+		assertEquals(EclipseLinkConvert.NO_CONVERTER, eclipseLinkConvert.getDefaultConverterName());
+		assertEquals(null, eclipseLinkConvert.getSpecifiedConverterName());
+	}
+	
+	public void testGetConvertName2() throws Exception {
+		createTestEntityWithConvert();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+
+		assertEquals(EclipseLinkConvert.CLASS_INSTANCE_CONVERTER, eclipseLinkConvert.getConverterName());
+	}
+
+	public void testSetSpecifiedConverterName() throws Exception {
+		createTestEntityWithBasicMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		basicMapping.setConverter(EclipseLinkConvert.class);
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		assertEquals(null, eclipseLinkConvert.getSpecifiedConverterName());
+		
+		eclipseLinkConvert.setSpecifiedConverterName("foo");
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkConvertAnnotation convertAnnotation = (EclipseLinkConvertAnnotation) attributeResource.getAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("foo", convertAnnotation.getValue());
+		
+		eclipseLinkConvert.setSpecifiedConverterName(null);
+		convertAnnotation = (EclipseLinkConvertAnnotation) attributeResource.getAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		assertNotNull(convertAnnotation);
+		assertEquals(null, convertAnnotation.getValue());
+	}
+	
+	public void testGetConverterNameUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithBasicMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+
+		assertNull(basicMapping.getConverter().getType());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkConvertAnnotation convert = (EclipseLinkConvertAnnotation) attributeResource.addAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		convert.setValue("foo");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(EclipseLinkConvert.class, basicMapping.getConverter().getType());
+		assertEquals("foo", ((EclipseLinkConvert) basicMapping.getConverter()).getConverterName());
+		
+		attributeResource.removeAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(basicMapping.getConverter().getType());
+		assertFalse(basicMapping.isDefault());
+		assertSame(basicMapping, persistentAttribute.getMapping());
+	}
+	
+
+	public void testGetConverter() throws Exception {
+		createTestEntityWithConvertAndTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		
+		assertEquals(EclipseLinkTypeConverter.class, eclipseLinkConvert.getConverter().getType());
+	}
+	
+	public void testSetConverter() throws Exception {
+		createTestEntityWithConvert();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		eclipseLinkConvert.setConverter(EclipseLinkTypeConverter.class);	
+		assertEquals(EclipseLinkTypeConverter.class, eclipseLinkConvert.getConverter().getType());
+	
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNotNull(attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME));
+		
+		eclipseLinkConvert.setConverter(EclipseLinkStructConverter.class);
+		assertEquals(EclipseLinkStructConverter.class, eclipseLinkConvert.getConverter().getType());
+		assertNotNull(attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME));
+
+		eclipseLinkConvert.setConverter(null);
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		assertNull(attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME));
+		
+		eclipseLinkConvert.setConverter(EclipseLinkStructConverter.class);
+		assertEquals(EclipseLinkStructConverter.class, eclipseLinkConvert.getConverter().getType());
+		assertNotNull(attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME));
+
+		
+		basicMapping.setConverter(null);
+		assertNull(attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME));
+		
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaConverterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaConverterTests.java
new file mode 100644
index 0000000..2446e01
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaConverterTests.java
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkConverterAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaConverterTests extends EclipseLinkContextModelTestCase
+{
+
+	
+	private ICompilationUnit createTestEntityWithConvertAndConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @Converter(name=\"foo\"");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithConvertAndConverterClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @Converter(converterClass=Foo.class");
+			}
+		});
+	}
+	
+	public EclipseLinkJavaConverterTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetName() throws Exception {
+		createTestEntityWithConvertAndConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkCustomConverter converter = (EclipseLinkCustomConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("foo", converter.getName());
+	}
+
+	public void testSetName() throws Exception {
+		createTestEntityWithConvertAndConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkCustomConverter converter = (EclipseLinkCustomConverter) eclipseLinkConvert.getConverter();
+		assertEquals("foo", converter.getName());
+		
+		converter.setName("bar");
+		assertEquals("bar", converter.getName());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkConverterAnnotation converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("bar", converterAnnotation.getName());
+
+		
+		converter.setName(null);
+		assertEquals(null, converter.getName());
+		converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getName());
+
+
+		converter.setName("bar");
+		assertEquals("bar", converter.getName());
+		converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("bar", converterAnnotation.getName());
+	}
+	
+	public void testGetNameUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkCustomConverter converter = (EclipseLinkCustomConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("foo", converter.getName());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkConverterAnnotation converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setName("bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("bar", converter.getName());
+		
+		attributeResource.removeAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.addAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", eclipseLinkConvert.getConverter().getName());	
+	}
+	
+
+	public void testGetConverterClass() throws Exception {
+		createTestEntityWithConvertAndConverterClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkCustomConverter converter = (EclipseLinkCustomConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("Foo", converter.getConverterClass());
+	}
+
+	public void testSetConverterClass() throws Exception {
+		createTestEntityWithConvertAndConverterClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkCustomConverter converter = (EclipseLinkCustomConverter) eclipseLinkConvert.getConverter();
+		assertEquals("Foo", converter.getConverterClass());
+		
+		converter.setConverterClass("Bar");
+		assertEquals("Bar", converter.getConverterClass());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkConverterAnnotation converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getConverterClass());
+
+		
+		converter.setConverterClass(null);
+		assertEquals(null, converter.getConverterClass());
+		converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getConverterClass());
+
+
+		converter.setConverterClass("Bar");
+		assertEquals("Bar", converter.getConverterClass());
+		converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getConverterClass());
+	}
+	
+	public void testGetConverterClassUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndConverterClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkCustomConverter converter = (EclipseLinkCustomConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("Foo", converter.getConverterClass());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkConverterAnnotation converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setConverterClass("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", converter.getConverterClass());
+		
+		attributeResource.removeAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkConverterAnnotation) attributeResource.addAnnotation(EclipseLinkConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setConverterClass("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", ((EclipseLinkCustomConverter) eclipseLinkConvert.getConverter()).getConverterClass());	
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaEmbeddableTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaEmbeddableTests.java
new file mode 100644
index 0000000..f35c289
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaEmbeddableTests.java
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTracking;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomizer;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkEmbeddable;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkChangeTrackingAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkCustomizerAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaEmbeddableTests extends EclipseLinkContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEmbeddableWithConvertAndCustomizerClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.EMBEDDABLE, EclipseLink.CUSTOMIZER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Embeddable").append(CR);
+				sb.append("    @Customizer(Foo.class");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEmbeddableWithChangeTracking() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.EMBEDDABLE, EclipseLink.CHANGE_TRACKING);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Embeddable").append(CR);
+				sb.append("    @ChangeTracking").append(CR);
+			}
+		});
+	}
+
+	public EclipseLinkJavaEmbeddableTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetCustomizerClass() throws Exception {
+		createTestEmbeddableWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCustomizer customizer = ((EclipseLinkEmbeddable) getJavaPersistentType().getMapping()).getCustomizer();
+		
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+	}
+
+	public void testSetCustomizerClass() throws Exception {
+		createTestEmbeddableWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCustomizer customizer = ((EclipseLinkEmbeddable) getJavaPersistentType().getMapping()).getCustomizer();
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+		
+		customizer.setSpecifiedCustomizerClass("Bar");
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCustomizerAnnotation customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", customizerAnnotation.getValue());
+
+		
+		customizer.setSpecifiedCustomizerClass(null);
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, customizerAnnotation);
+
+
+		customizer.setSpecifiedCustomizerClass("Bar");
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", customizerAnnotation.getValue());
+	}
+	
+	public void testGetCustomizerClassUpdatesFromResourceModelChange() throws Exception {
+		createTestEmbeddableWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkEmbeddable embeddable = (EclipseLinkEmbeddable) getJavaPersistentType().getMapping();
+		EclipseLinkCustomizer customizer = embeddable.getCustomizer();
+
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCustomizerAnnotation customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);
+		customizerAnnotation.setValue("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+		
+		typeResource.removeAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.addAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		
+		customizerAnnotation.setValue("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", customizer.getSpecifiedCustomizerClass());	
+	}
+	
+	public void testGetChangeTracking() throws Exception {
+		createTestEmbeddableWithChangeTracking();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEmbeddable embeddable = (EclipseLinkEmbeddable) getJavaPersistentType().getMapping();
+		EclipseLinkChangeTracking contextChangeTracking = embeddable.getChangeTracking();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkChangeTrackingAnnotation resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test context value
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to ATTRIBUTE specifically, test context
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to OBJECT specifically, test context
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to DEFERRED specifically, test context
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to AUTO specifically, test context
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// remove value from resource, test context
+		resourceChangeTracking.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// remove annotation, text context
+		typeResource.removeAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertNull(contextChangeTracking.getSpecifiedType());
+	}
+	
+	public void testSetChangeTracking() throws Exception {
+		createTestEmbeddableWithChangeTracking();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEmbeddable embeddable = (EclipseLinkEmbeddable) getJavaPersistentType().getMapping();
+		EclipseLinkChangeTracking contextChangeTracking = embeddable.getChangeTracking();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkChangeTrackingAnnotation resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test resource value
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change context to AUTO specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change context to ATTRIBUTE specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getSpecifiedType());
+		
+		// change context to OBJECT specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.OBJECT);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getSpecifiedType());
+		
+		// change context to DEFERRED specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.DEFERRED);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getSpecifiedType());
+		
+		// change context to null, test resource
+		
+		contextChangeTracking.setSpecifiedType(null);
+		
+		assertNull(typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME));
+		assertNull(contextChangeTracking.getSpecifiedType());
+		
+		// change context to AUTO specifically (this time from no annotation), test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+	}
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaEntityTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaEntityTests.java
new file mode 100644
index 0000000..8ac6d21
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaEntityTests.java
@@ -0,0 +1,387 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.EclipseLinkMappingKeys;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTracking;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomizer;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkReadOnly;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkChangeTrackingAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkCustomizerAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkReadOnlyAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaEntityTests extends EclipseLinkContextModelTestCase
+{
+
+	private ICompilationUnit createTestEntity() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithConvertAndCustomizerClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CUSTOMIZER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+				sb.append("    @Customizer(Foo.class");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithChangeTracking() throws Exception {		
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CHANGE_TRACKING);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+				sb.append("    @ChangeTracking").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityWithReadOnly() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.READ_ONLY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+				sb.append("@ReadOnly").append(CR);
+			}
+		});
+	}
+
+	public EclipseLinkJavaEntityTests(String name) {
+		super(name);
+	}
+
+	public void testAttributeMappingKeyAllowed() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Entity entity = (Entity) getJavaPersistentType().getMapping();
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.EMBEDDED_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(EclipseLinkMappingKeys.BASIC_COLLECTION_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(EclipseLinkMappingKeys.BASIC_MAP_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(EclipseLinkMappingKeys.TRANSFORMATION_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(EclipseLinkMappingKeys.VARIABLE_ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY));
+	}
+
+
+	public void testGetCustomizerClass() throws Exception {
+		createTestEntityWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCustomizer customizer = ((EclipseLinkEntity) getJavaPersistentType().getMapping()).getCustomizer();
+		
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+	}
+
+	public void testSetCustomizerClass() throws Exception {
+		createTestEntityWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCustomizer customizer = ((EclipseLinkEntity) getJavaPersistentType().getMapping()).getCustomizer();
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+		
+		customizer.setSpecifiedCustomizerClass("Bar");
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCustomizerAnnotation customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", customizerAnnotation.getValue());
+
+		
+		customizer.setSpecifiedCustomizerClass(null);
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, customizerAnnotation);
+
+
+		customizer.setSpecifiedCustomizerClass("Bar");
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", customizerAnnotation.getValue());
+	}
+	
+	public void testGetCustomizerClassUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkEntity entity = (EclipseLinkEntity) getJavaPersistentType().getMapping();
+		EclipseLinkCustomizer customizer = entity.getCustomizer();
+
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCustomizerAnnotation customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);
+		customizerAnnotation.setValue("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+		
+		typeResource.removeAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.addAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		
+		customizerAnnotation.setValue("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", customizer.getSpecifiedCustomizerClass());	
+	}
+	
+	public void testGetChangeTracking() throws Exception {
+		createTestEntityWithChangeTracking();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEntity entity = (EclipseLinkEntity) getJavaPersistentType().getMapping();
+		EclipseLinkChangeTracking contextChangeTracking = entity.getChangeTracking();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkChangeTrackingAnnotation resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test context value
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to ATTRIBUTE specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to OBJECT specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to DEFERRED specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to AUTO specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// remove value from resource, test context
+		
+		resourceChangeTracking.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// remove annotation, text context
+		
+		typeResource.removeAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertNull(contextChangeTracking.getSpecifiedType());
+	}
+	
+	public void testSetChangeTracking() throws Exception {
+		createTestEntityWithChangeTracking();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEntity entity = (EclipseLinkEntity) getJavaPersistentType().getMapping();
+		EclipseLinkChangeTracking contextChangeTracking = entity.getChangeTracking();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkChangeTrackingAnnotation resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test resource value
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change context to AUTO specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change context to ATTRIBUTE specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getSpecifiedType());
+		
+		// change context to OBJECT specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.OBJECT);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getSpecifiedType());
+		
+		// change context to DEFERRED specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.DEFERRED);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getSpecifiedType());
+		
+		// change context to null, test resource
+		
+		contextChangeTracking.setSpecifiedType(null);
+		
+		assertNull(typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME));
+		assertNull(contextChangeTracking.getSpecifiedType());
+		
+		// change context to AUTO specifically (this time from no annotation), test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+	}
+	
+	public void testGetReadOnly() throws Exception {
+		createTestEntityWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEntity mappedSuperclass = (EclipseLinkEntity) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(true, readOnly.isReadOnly());
+	}
+
+	public void testGetSpecifiedReadOnly() throws Exception {
+		createTestEntityWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEntity mappedSuperclass = (EclipseLinkEntity) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+	}
+
+	//TODO test inheriting a default readonly from you superclass
+	public void testGetDefaultReadOnly() throws Exception {
+		createTestEntityWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEntity mappedSuperclass = (EclipseLinkEntity) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(false, readOnly.isDefaultReadOnly());
+	}
+
+	public void testSetSpecifiedReadOnly() throws Exception {
+		createTestEntityWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEntity mappedSuperclass = (EclipseLinkEntity) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(true, readOnly.isReadOnly());
+		
+		readOnly.setSpecifiedReadOnly(Boolean.FALSE);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		assertNull(typeResource.getAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME));
+		assertNull(readOnly.getSpecifiedReadOnly());//Boolean.FALSE and null really mean the same thing since there are only 2 states in the java resource model
+
+		readOnly.setSpecifiedReadOnly(Boolean.TRUE);
+		assertNotNull(typeResource.getAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME));
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+
+		readOnly.setSpecifiedReadOnly(null);
+		assertNull(typeResource.getAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME));
+		assertNull(readOnly.getSpecifiedReadOnly());//Boolean.FALSE and null really mean the same thing since there are only 2 states in the java resource model
+	}
+	
+	public void testSpecifiedReadOnlyUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEntity mappedSuperclass = (EclipseLinkEntity) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		typeResource.removeAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(readOnly.getSpecifiedReadOnly());
+		assertEquals(false, readOnly.isDefaultReadOnly());
+		
+		typeResource.addAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+	}
+
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaIdMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaIdMappingTests.java
new file mode 100644
index 0000000..74970ea
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaIdMappingTests.java
@@ -0,0 +1,323 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.TemporalConverter;
+import org.eclipse.jpt.jpa.core.context.TemporalType;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.TemporalAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkIdMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkMutable;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkConvertAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkMutableAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaIdMappingTests extends EclipseLinkContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithIdMapping() throws Exception {		
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Id").append(CR);
+			}
+		});
+	}
+
+	
+	private ICompilationUnit createTestEntityWithConvert() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, EclipseLink.CONVERT);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Id").append(CR);
+				sb.append("@Convert(\"class-instance\")").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithMutableId() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, EclipseLink.MUTABLE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Id").append(CR);
+				sb.append("@Mutable").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithMutableIdDate() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, EclipseLink.MUTABLE, "java.util.Date");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Id").append(CR);
+				sb.append("    @Mutable").append(CR);
+				sb.append("    private Date myDate;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+		
+	public EclipseLinkJavaIdMappingTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetConvert() throws Exception {
+		createTestEntityWithIdMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.addAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		IdMapping idMapping = (IdMapping) persistentAttribute.getMapping();
+
+		assertEquals(EclipseLinkConvert.class, idMapping.getConverter().getType());
+	}
+	
+	public void testGetConvert2() throws Exception {
+		createTestEntityWithConvert();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		IdMapping idMapping = (IdMapping) persistentAttribute.getMapping();
+
+		assertEquals(EclipseLinkConvert.class, idMapping.getConverter().getType());
+		assertEquals(EclipseLinkConvert.CLASS_INSTANCE_CONVERTER, ((EclipseLinkConvert) idMapping.getConverter()).getConverterName());
+	}
+
+	public void testSetConvert() throws Exception {
+		createTestEntityWithIdMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		IdMapping idMapping = (IdMapping) persistentAttribute.getMapping();
+		assertNull(idMapping.getConverter().getType());
+		
+		idMapping.setConverter(TemporalConverter.class);
+		((TemporalConverter) idMapping.getConverter()).setTemporalType(TemporalType.TIME);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		TemporalAnnotation temporal = (TemporalAnnotation) attributeResource.getAnnotation(TemporalAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.core.resource.java.TemporalType.TIME, temporal.getValue());
+		
+		idMapping.setConverter(null);
+		assertNull(attributeResource.getAnnotation(TemporalAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testGetConvertUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithIdMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		IdMapping idMapping = (IdMapping) persistentAttribute.getMapping();
+
+		assertNull(idMapping.getConverter().getType());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkConvertAnnotation convert = (EclipseLinkConvertAnnotation) attributeResource.addAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		convert.setValue("foo");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(EclipseLinkConvert.class, idMapping.getConverter().getType());
+		assertEquals("foo", ((EclipseLinkConvert) idMapping.getConverter()).getConverterName());
+		
+		attributeResource.removeAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(idMapping.getConverter().getType());
+		assertFalse(idMapping.isDefault());
+		assertSame(idMapping, persistentAttribute.getMapping());
+	}
+	
+	public void testGetSpecifiedMutable() throws Exception {
+		createTestEntityWithMutableId();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkIdMapping idMapping = (EclipseLinkIdMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = idMapping.getMutable();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkMutableAnnotation mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		mutableAnnotation.setValue(Boolean.TRUE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+
+		mutableAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+
+		mutableAnnotation.setValue(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.FALSE, mutable.getSpecifiedMutable());
+		
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, mutable.getSpecifiedMutable());
+		
+		attributeResource.addAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+	}
+	
+	public void testSetSpecifiedMutable() throws Exception {
+		createTestEntityWithMutableId();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkIdMapping idMapping = (EclipseLinkIdMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = idMapping.getMutable();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkMutableAnnotation mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertEquals(null, mutableAnnotation.getValue());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertEquals(null, mutableAnnotation.getValue());
+
+		mutable.setSpecifiedMutable(null);
+		mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertEquals(null, mutableAnnotation);
+		
+		mutable.setSpecifiedMutable(Boolean.FALSE);	
+		mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertEquals(Boolean.FALSE, mutableAnnotation.getValue());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertEquals(Boolean.TRUE, mutableAnnotation.getValue());
+	}
+	
+	public void testIsDefaultMutable() throws Exception {
+		createTestEntityWithMutableId();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkIdMapping idMapping = (EclipseLinkIdMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = idMapping.getMutable();
+		assertTrue(mutable.isDefaultMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertTrue(mutable.isDefaultMutable());
+		
+		mutable.setSpecifiedMutable(Boolean.FALSE);	
+		assertTrue(mutable.isDefaultMutable());
+		
+		//set mutable default to false in the persistence unit properties, verify default in java still true since this is not a Date/Calendar
+		(getPersistenceUnit()).getOptions().setTemporalMutable(Boolean.FALSE);
+		assertTrue(mutable.isDefaultMutable());
+	}
+	
+	public void testIsDefaultMutableForDate() throws Exception {
+		createTestEntityWithMutableIdDate();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkIdMapping idMapping = (EclipseLinkIdMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = idMapping.getMutable();
+		assertFalse(mutable.isDefaultMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertFalse(mutable.isDefaultMutable());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertFalse(mutable.isDefaultMutable());
+		
+		//set mutable default to false in the persistence unit properties, verify default in java still true since this is not a Date/Calendar
+		(getPersistenceUnit()).getOptions().setTemporalMutable(Boolean.TRUE);
+		assertTrue(mutable.isDefaultMutable());
+		
+		(getPersistenceUnit()).getOptions().setTemporalMutable(Boolean.FALSE);
+		assertFalse(mutable.isDefaultMutable());
+		
+		(getPersistenceUnit()).getOptions().setTemporalMutable(null);
+		assertFalse(mutable.isDefaultMutable());
+	}
+	
+	public void testIsMutable() throws Exception {
+		createTestEntityWithMutableId();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkIdMapping idMapping = (EclipseLinkIdMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = idMapping.getMutable();
+		assertTrue(mutable.isMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertTrue(mutable.isMutable());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertTrue(mutable.isMutable());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaManyToManyMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaManyToManyMappingTests.java
new file mode 100644
index 0000000..fd7a5bb
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaManyToManyMappingTests.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetch;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkRelationshipMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkJoinFetchAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaManyToManyMappingTests extends EclipseLinkContextModelTestCase
+{
+		
+	private ICompilationUnit createTestEntityWithJoinFetchManyToMany() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, EclipseLink.JOIN_FETCH);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ManyToMany").append(CR);
+				sb.append("@JoinFetch").append(CR);
+			}
+		});
+	}
+
+	public EclipseLinkJavaManyToManyMappingTests(String name) {
+		super(name);
+	}
+	
+	
+	public void testGetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchManyToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test context value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to INNER specifically, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to OUTER, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// remove value from resource, test context
+		
+		joinFetchAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// remove annotation, text context
+		
+		attributeResource.removeAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertNull(contextJoinFetch.getValue());
+	}
+	
+	public void testSetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchManyToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test resource value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to INNER specifically, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to OUTER, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.OUTER);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// set context to null, test resource
+		
+		contextJoinFetch.setValue(null);
+		
+		assertNull(attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME));
+		assertNull(contextJoinFetch.getValue());
+		
+		// change context to INNER specifically (this time from no annotation), test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaManyToOneMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaManyToOneMappingTests.java
new file mode 100644
index 0000000..3aa48ff
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaManyToOneMappingTests.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetch;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkRelationshipMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkJoinFetchAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaManyToOneMappingTests extends EclipseLinkContextModelTestCase
+{
+		
+	private ICompilationUnit createTestEntityWithJoinFetchManyToOne() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE, EclipseLink.JOIN_FETCH);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ManyToOne").append(CR);
+				sb.append("@JoinFetch").append(CR);
+			}
+		});
+	}
+
+	public EclipseLinkJavaManyToOneMappingTests(String name) {
+		super(name);
+	}
+
+	
+	public void testGetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchManyToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test context value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to INNER specifically, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to OUTER, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// remove value from resource, test context
+		
+		joinFetchAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// remove annotation, text context
+		
+		attributeResource.removeAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertNull(contextJoinFetch.getValue());
+	}
+	
+	public void testSetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchManyToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test resource value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to INNER specifically, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to OUTER, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.OUTER);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// set context to null, test resource
+		
+		contextJoinFetch.setValue(null);
+		
+		assertNull(attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME));
+		assertNull(contextJoinFetch.getValue());
+		
+		// change context to INNER specifically (this time from no annotation), test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaMappedSuperclassTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaMappedSuperclassTests.java
new file mode 100644
index 0000000..4d15562
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaMappedSuperclassTests.java
@@ -0,0 +1,348 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTracking;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomizer;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkMappedSuperclass;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkReadOnly;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkChangeTrackingAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkCustomizerAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkReadOnlyAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaMappedSuperclassTests extends EclipseLinkContextModelTestCase
+{
+
+	private ICompilationUnit createTestMappedSuperclassWithReadOnly() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.READ_ONLY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+				sb.append("@ReadOnly").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclassWithConvertAndCustomizerClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.CUSTOMIZER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+				sb.append("    @Customizer(Foo.class");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclassWithChangeTracking() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.CHANGE_TRACKING);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+				sb.append("    @ChangeTracking").append(CR);
+			}
+		});
+	}
+
+	public EclipseLinkJavaMappedSuperclassTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetReadOnly() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(true, readOnly.isReadOnly());
+	}
+
+	public void testGetSpecifiedReadOnly() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+	}
+
+	//TODO test inheriting a default readonly from you superclass
+	public void testGetDefaultReadOnly() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(false, readOnly.isDefaultReadOnly());
+	}
+
+	public void testSetSpecifiedReadOnly() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(true, readOnly.isReadOnly());
+		
+		readOnly.setSpecifiedReadOnly(Boolean.FALSE);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		assertNull(typeResource.getAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME));
+		assertNull(readOnly.getSpecifiedReadOnly());//Boolean.FALSE and null really mean the same thing since there are only 2 states in the java resource model
+
+		readOnly.setSpecifiedReadOnly(Boolean.TRUE);
+		assertNotNull(typeResource.getAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME));
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+
+		readOnly.setSpecifiedReadOnly(null);
+		assertNull(typeResource.getAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME));
+		assertNull(readOnly.getSpecifiedReadOnly());//Boolean.FALSE and null really mean the same thing since there are only 2 states in the java resource model
+	}
+	
+	public void testSpecifiedReadOnlyUpdatesFromResourceModelChange() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		typeResource.removeAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(readOnly.getSpecifiedReadOnly());
+		assertEquals(false, readOnly.isDefaultReadOnly());
+		
+		typeResource.addAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+	}
+
+	public void testGetCustomizerClass() throws Exception {
+		createTestMappedSuperclassWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCustomizer customizer = ((EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping()).getCustomizer();
+		
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+	}
+
+	public void testSetCustomizerClass() throws Exception {
+		createTestMappedSuperclassWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCustomizer customizer = ((EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping()).getCustomizer();
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+		
+		customizer.setSpecifiedCustomizerClass("Bar");
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCustomizerAnnotation customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", customizerAnnotation.getValue());
+
+		
+		customizer.setSpecifiedCustomizerClass(null);
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, customizerAnnotation);
+
+
+		customizer.setSpecifiedCustomizerClass("Bar");
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", customizerAnnotation.getValue());
+	}
+	
+	public void testGetCustomizerClassUpdatesFromResourceModelChange() throws Exception {
+		createTestMappedSuperclassWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkCustomizer customizer = mappedSuperclass.getCustomizer();
+
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCustomizerAnnotation customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);
+		customizerAnnotation.setValue("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+		
+		typeResource.removeAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.addAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		
+		customizerAnnotation.setValue("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", customizer.getSpecifiedCustomizerClass());	
+	}
+	
+	public void testGetChangeTracking() throws Exception {
+		createTestMappedSuperclassWithChangeTracking();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkChangeTracking contextChangeTracking = mappedSuperclass.getChangeTracking();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkChangeTrackingAnnotation resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test context value
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to ATTRIBUTE specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to OBJECT specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to DEFERRED specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to AUTO specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// remove value from resource, test context
+		
+		resourceChangeTracking.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// remove annotation, text context
+		
+		typeResource.removeAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertNull(contextChangeTracking.getSpecifiedType());
+	}
+	
+	public void testSetChangeTracking() throws Exception {
+		createTestMappedSuperclassWithChangeTracking();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkChangeTracking contextChangeTracking = mappedSuperclass.getChangeTracking();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkChangeTrackingAnnotation resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test resource value
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change context to AUTO specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change context to ATTRIBUTE specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getSpecifiedType());
+		
+		// change context to OBJECT specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.OBJECT);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getSpecifiedType());
+		
+		// change context to DEFERRED specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.DEFERRED);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getSpecifiedType());
+		
+		// change context to null, test resource
+		
+		contextChangeTracking.setSpecifiedType(null);
+		
+		assertNull(typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME));
+		assertNull(contextChangeTracking.getSpecifiedType());
+		
+		// change context to AUTO specifically (this time from no annotation), test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaObjectTypeConverterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaObjectTypeConverterTests.java
new file mode 100644
index 0000000..bc40bca
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaObjectTypeConverterTests.java
@@ -0,0 +1,644 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConversionValue;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkConversionValueAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkObjectTypeConverterAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaObjectTypeConverterTests extends EclipseLinkContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithConvertAndObjectTypeConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.OBJECT_TYPE_CONVERTER, EclipseLink.CONVERSION_VALUE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @ObjectTypeConverter(name=\"foo\", defaultObjectValue=\"bar\")");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithConvertAndDataType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.OBJECT_TYPE_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @ObjectTypeConverter(dataType=Foo.class)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithConvertAndObjectType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.OBJECT_TYPE_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @ObjectTypeConverter(objectType=Foo.class)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithConvertAndObjectTypeConverterConversionValue() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.OBJECT_TYPE_CONVERTER, EclipseLink.CONVERSION_VALUE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @ObjectTypeConverter(name=\"foo\", defaultObjectValue=\"bar\", conversionValues = @ConversionValue(dataValue=\"f\", objectValue=\"female\"))");
+			}
+		});
+	}
+
+	public EclipseLinkJavaObjectTypeConverterTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetName() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("foo", converter.getName());
+	}
+
+	public void testSetName() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		assertEquals("foo", converter.getName());
+		
+		converter.setName("bar");
+		assertEquals("bar", converter.getName());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("bar", converterAnnotation.getName());
+
+		
+		converter.setName(null);
+		assertEquals(null, converter.getName());
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getName());
+
+
+		converter.setName("bar");
+		assertEquals("bar", converter.getName());
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("bar", converterAnnotation.getName());
+	}
+	
+	public void testGetNameUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("foo", converter.getName());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setName("bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("bar", converter.getName());
+		
+		attributeResource.removeAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.addAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", eclipseLinkConvert.getConverter().getName());	
+	}
+
+	public void testGetDataType() throws Exception {
+		createTestEntityWithConvertAndDataType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("Foo", converter.getDataType());
+	}
+
+	public void testSetDataType() throws Exception {
+		createTestEntityWithConvertAndDataType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		assertEquals("Foo", converter.getDataType());
+		
+		converter.setDataType("Bar");
+		assertEquals("Bar", converter.getDataType());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getDataType());
+
+		
+		converter.setDataType(null);
+		assertEquals(null, converter.getDataType());
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getDataType());
+
+
+		converter.setDataType("Bar");
+		assertEquals("Bar", converter.getDataType());
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getDataType());
+	}
+	
+	public void testGetDataTypeUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndDataType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("Foo", converter.getDataType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setDataType("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", converter.getDataType());
+		
+		attributeResource.removeAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.addAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setDataType("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", ((EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter()).getDataType());	
+	}
+	
+	public void testGetObjectType() throws Exception {
+		createTestEntityWithConvertAndObjectType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("Foo", converter.getObjectType());
+	}
+
+	public void testSetObjectType() throws Exception {
+		createTestEntityWithConvertAndObjectType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		assertEquals("Foo", converter.getObjectType());
+		
+		converter.setObjectType("Bar");
+		assertEquals("Bar", converter.getObjectType());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getObjectType());
+
+		
+		converter.setObjectType(null);
+		assertEquals(null, converter.getObjectType());
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getObjectType());
+
+
+		converter.setObjectType("Bar");
+		assertEquals("Bar", converter.getObjectType());
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getObjectType());
+	}
+	
+	public void testGetObjectTypeUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndObjectType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("Foo", converter.getObjectType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setObjectType("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", converter.getObjectType());
+		
+		attributeResource.removeAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.addAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setObjectType("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", ((EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter()).getObjectType());	
+	}
+	
+	
+	public void testAddConversionValue() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		
+		EclipseLinkConversionValue conversionValue = converter.addConversionValue(0);
+		conversionValue.setDataValue("F");
+		conversionValue.setObjectValue("female");
+		
+		ListIterator<EclipseLinkConversionValueAnnotation> resourceConversionValues = converterAnnotation.conversionValues();
+		EclipseLinkConversionValueAnnotation resourceConversionValue = resourceConversionValues.next();
+		assertEquals("F", resourceConversionValue.getDataValue());
+		assertEquals("female", resourceConversionValue.getObjectValue());
+		
+		EclipseLinkConversionValue conversionValue2 = converter.addConversionValue(0);
+		conversionValue2.setDataValue("M");
+		conversionValue2.setObjectValue("male");
+		
+		resourceConversionValues = converterAnnotation.conversionValues();
+		resourceConversionValue = resourceConversionValues.next();
+		assertEquals("M", resourceConversionValue.getDataValue());
+		assertEquals("male", resourceConversionValue.getObjectValue());
+		resourceConversionValue = resourceConversionValues.next();
+		assertEquals("F", resourceConversionValue.getDataValue());
+		assertEquals("female", resourceConversionValue.getObjectValue());
+		
+		EclipseLinkConversionValue conversionValue3 = converter.addConversionValue(1);
+		conversionValue3.setDataValue("O");
+		conversionValue3.setObjectValue("male");
+		
+		resourceConversionValues = converterAnnotation.conversionValues();
+		resourceConversionValue = resourceConversionValues.next();
+		assertEquals("M", resourceConversionValue.getDataValue());
+		assertEquals("male", resourceConversionValue.getObjectValue());
+		resourceConversionValue = resourceConversionValues.next();
+		assertEquals("O", resourceConversionValue.getDataValue());
+		assertEquals("male", resourceConversionValue.getObjectValue());
+		resourceConversionValue = resourceConversionValues.next();
+		assertEquals("F", resourceConversionValue.getDataValue());
+		assertEquals("female", resourceConversionValue.getObjectValue());
+		
+		ListIterator<EclipseLinkConversionValue> conversionValues = converter.conversionValues();
+		assertEquals(conversionValue2, conversionValues.next());
+		assertEquals(conversionValue3, conversionValues.next());
+		assertEquals(conversionValue, conversionValues.next());
+		
+		conversionValues = converter.conversionValues();
+		assertEquals("M", conversionValues.next().getDataValue());
+		assertEquals("O", conversionValues.next().getDataValue());
+		assertEquals("F", conversionValues.next().getDataValue());
+	}
+	
+	public void testRemoveConversionValue() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		
+		converter.addConversionValue(0).setDataValue("F");
+		converter.addConversionValue(1).setDataValue("M");
+		converter.addConversionValue(2).setDataValue("O");
+		
+		ListIterator<EclipseLinkConversionValueAnnotation> resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals(3, CollectionTools.size(resourceConversionValues));
+		
+		converter.removeConversionValue(0);
+		resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals(2, CollectionTools.size(resourceConversionValues));
+		resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals("M", resourceConversionValues.next().getDataValue());
+		assertEquals("O", resourceConversionValues.next().getDataValue());
+
+		converter.removeConversionValue(0);
+		resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals(1, CollectionTools.size(resourceConversionValues));
+		resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals("O", resourceConversionValues.next().getDataValue());
+		
+		converter.removeConversionValue(0);
+		resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals(0, CollectionTools.size(resourceConversionValues));
+	}
+
+	public void testMoveConversionValue() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+
+		converter.addConversionValue(0).setDataValue("F");
+		converter.addConversionValue(1).setDataValue("M");
+		converter.addConversionValue(2).setDataValue("O");
+		
+		ListIterator<EclipseLinkConversionValueAnnotation> resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals(3, CollectionTools.size(resourceConversionValues));
+		
+		converter.moveConversionValue(2,0);
+		resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals(3, CollectionTools.size(resourceConversionValues));
+		resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals("M", resourceConversionValues.next().getDataValue());
+		assertEquals("O", resourceConversionValues.next().getDataValue());
+		assertEquals("F", resourceConversionValues.next().getDataValue());
+		
+		converter.moveConversionValue(0,1);
+		resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals(3, CollectionTools.size(resourceConversionValues));
+		resourceConversionValues = converterAnnotation.conversionValues();
+		assertEquals("O", resourceConversionValues.next().getDataValue());
+		assertEquals("M", resourceConversionValues.next().getDataValue());
+		assertEquals("F", resourceConversionValues.next().getDataValue());
+	}
+	
+	public void testUpdateConversionValues() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		
+		converterAnnotation.addConversionValue(0).setDataValue("F");
+		converterAnnotation.addConversionValue(1).setDataValue("M");
+		converterAnnotation.addConversionValue(2).setDataValue("O");
+		getJpaProject().synchronizeContextModel();
+
+		ListIterator<EclipseLinkConversionValue> conversionValues = converter.conversionValues();
+		assertEquals("F", conversionValues.next().getDataValue());
+		assertEquals("M", conversionValues.next().getDataValue());
+		assertEquals("O", conversionValues.next().getDataValue());
+		assertFalse(conversionValues.hasNext());
+		
+		converterAnnotation.moveConversionValue(2, 0);
+		getJpaProject().synchronizeContextModel();
+		conversionValues = converter.conversionValues();
+		assertEquals("M", conversionValues.next().getDataValue());
+		assertEquals("O", conversionValues.next().getDataValue());
+		assertEquals("F", conversionValues.next().getDataValue());
+		assertFalse(conversionValues.hasNext());
+		
+		converterAnnotation.moveConversionValue(0, 1);
+		getJpaProject().synchronizeContextModel();
+		conversionValues = converter.conversionValues();
+		assertEquals("O", conversionValues.next().getDataValue());
+		assertEquals("M", conversionValues.next().getDataValue());
+		assertEquals("F", conversionValues.next().getDataValue());
+		assertFalse(conversionValues.hasNext());
+		
+		converterAnnotation.removeConversionValue(1);
+		getJpaProject().synchronizeContextModel();
+		conversionValues = converter.conversionValues();
+		assertEquals("O", conversionValues.next().getDataValue());
+		assertEquals("F", conversionValues.next().getDataValue());
+		assertFalse(conversionValues.hasNext());
+		
+		converterAnnotation.removeConversionValue(1);
+		getJpaProject().synchronizeContextModel();
+		conversionValues = converter.conversionValues();
+		assertEquals("O", conversionValues.next().getDataValue());
+		assertFalse(conversionValues.hasNext());
+		
+		converterAnnotation.removeConversionValue(0);
+		getJpaProject().synchronizeContextModel();
+		conversionValues = converter.conversionValues();
+		assertFalse(conversionValues.hasNext());
+	}
+	
+	public void testConversionValuesSize() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+	
+		assertEquals(0, converter.conversionValuesSize());
+		
+		converterAnnotation.addConversionValue(0).setDataValue("F");
+		converterAnnotation.addConversionValue(1).setDataValue("M");
+		converterAnnotation.addConversionValue(2).setDataValue("O");
+		
+		this.getJpaProject().synchronizeContextModel();
+		assertEquals(3, converter.conversionValuesSize());
+	}
+
+
+	public void testGetDefaultObjectValue() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("bar", converter.getDefaultObjectValue());
+	}
+
+	public void testSetDefaultObjectValue() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+		assertEquals("bar", converter.getDefaultObjectValue());
+		
+		converter.setDefaultObjectValue("baz");
+		assertEquals("baz", converter.getDefaultObjectValue());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("baz", converterAnnotation.getDefaultObjectValue());
+
+		
+		converter.setDefaultObjectValue(null);
+		assertEquals(null, converter.getDefaultObjectValue());
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getDefaultObjectValue());
+
+
+		converter.setDefaultObjectValue("bar");
+		assertEquals("bar", converter.getDefaultObjectValue());
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("bar", converterAnnotation.getDefaultObjectValue());
+	}
+	
+	public void testGetDefaultObjectValueUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("bar", converter.getDefaultObjectValue());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkObjectTypeConverterAnnotation converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setDefaultObjectValue("baz");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("baz", converter.getDefaultObjectValue());
+		
+		attributeResource.removeAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.addAnnotation(EclipseLinkObjectTypeConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setDefaultObjectValue("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", ((EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter()).getDefaultObjectValue());	
+	}
+	
+	public void testInitializeConversionValues() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverterConversionValue();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals(1, converter.conversionValuesSize());
+		assertEquals("f", converter.conversionValues().next().getDataValue());
+		assertEquals("female", converter.conversionValues().next().getObjectValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaOneToManyMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaOneToManyMappingTests.java
new file mode 100644
index 0000000..34217a7
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaOneToManyMappingTests.java
@@ -0,0 +1,579 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.OneToManyAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetch;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkOneToManyMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkOneToManyRelationship;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkPrivateOwned;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkRelationshipMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkJoinFetchAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkPrivateOwnedAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaOneToManyMappingTests extends EclipseLinkContextModelTestCase
+{
+	private ICompilationUnit createTestEntityWithOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToMany").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithPrivateOwnedOneToMany() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, EclipseLink.PRIVATE_OWNED);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToMany").append(CR);
+				sb.append("@PrivateOwned").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithJoinFetchOneToMany() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, EclipseLink.JOIN_FETCH);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToMany").append(CR);
+				sb.append("@JoinFetch").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithDefaultOneToMany() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY);
+			}
+			
+			@Override
+			public void appendExtendsImplementsTo(StringBuilder sb) {
+				sb.append("implements java.io.Serializable");
+			}
+
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("private java.util.Collection<" + TYPE_NAME + "> myTypes;").append(CR);
+				sb.append(CR);
+			}
+		});
+	}
+
+	public EclipseLinkJavaOneToManyMappingTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetPrivateOwned() throws Exception {
+		createTestEntityWithPrivateOwnedOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		EclipseLinkPrivateOwned privateOwnable = oneToManyMapping.getPrivateOwned();
+		assertEquals(true, privateOwnable.isPrivateOwned());
+	}
+
+	public void testSetPrivateOwned() throws Exception {
+		createTestEntityWithPrivateOwnedOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		EclipseLinkPrivateOwned privateOwnable = oneToManyMapping.getPrivateOwned();
+		assertEquals(true, privateOwnable.isPrivateOwned());
+		
+		privateOwnable.setPrivateOwned(false);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(EclipseLinkPrivateOwnedAnnotation.ANNOTATION_NAME));
+		assertEquals(false, privateOwnable.isPrivateOwned());
+
+		privateOwnable.setPrivateOwned(true);
+		assertNotNull(attributeResource.getAnnotation(EclipseLinkPrivateOwnedAnnotation.ANNOTATION_NAME));
+		assertEquals(true, privateOwnable.isPrivateOwned());
+	}
+	
+	public void testPrivateOwnedUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithPrivateOwnedOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		EclipseLinkPrivateOwned privateOwnable = oneToManyMapping.getPrivateOwned();
+		assertEquals(true, privateOwnable.isPrivateOwned());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkPrivateOwnedAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(false, privateOwnable.isPrivateOwned());
+		
+		attributeResource.addAnnotation(EclipseLinkPrivateOwnedAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(true, privateOwnable.isPrivateOwned());
+	}
+	
+	public void testGetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test context value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to INNER specifically, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to OUTER, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// remove value from resource, test context
+		
+		joinFetchAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// remove annotation, text context
+		
+		attributeResource.removeAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertNull(contextJoinFetch.getValue());
+	}
+	
+	public void testSetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test resource value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to INNER specifically, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to OUTER, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.OUTER);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// set context to null, test resource
+		
+		contextJoinFetch.setValue(null);
+		
+		assertNull(attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME));
+		assertNull(contextJoinFetch.getValue());
+		
+		// change context to INNER specifically (this time from no annotation), test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+	}
+	
+	public void testModifyPredominantJoiningStrategy() throws Exception {
+		createTestEntityWithOneToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaResourcePersistentAttribute resourceAttribute = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME).persistableAttributes().next();
+		OneToManyAnnotation annotation = (OneToManyAnnotation) resourceAttribute.getAnnotation(JPA.ONE_TO_MANY);
+		PersistentAttribute contextAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkOneToManyMapping mapping = (EclipseLinkOneToManyMapping) contextAttribute.getMapping();
+		EclipseLinkOneToManyRelationship rel = mapping.getRelationship();
+		
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToJoinColumn();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToMappedBy();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNotNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToJoinTable();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+	}
+	
+	public void testUpdatePredominantJoiningStrategy() throws Exception {
+		createTestEntityWithOneToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaResourcePersistentAttribute resourceAttribute = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME).persistableAttributes().next();
+		OneToManyAnnotation annotation = (OneToManyAnnotation) resourceAttribute.getAnnotation(JPA.ONE_TO_MANY);
+		PersistentAttribute contextAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkOneToManyMapping mapping = (EclipseLinkOneToManyMapping) contextAttribute.getMapping();
+		EclipseLinkOneToManyRelationship rel = mapping.getRelationship();
+		
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		annotation.setMappedBy("foo");
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNotNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceAttribute.addAnnotation(JPA.JOIN_TABLE);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNotNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceAttribute.addAnnotation(JPA.JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNotNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		annotation.setMappedBy(null);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceAttribute.removeAnnotation(JPA.JOIN_TABLE);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceAttribute.removeAnnotation(JPA.JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+	}
+	
+	public void testDefaultOneToMany() throws Exception {
+		createTestEntityWithDefaultOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		assertEquals(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, attributes.next().getDefaultMappingKey());
+	}
+	
+	public void testDefaultOneToManySetFetch() throws Exception {
+		createTestEntityWithDefaultOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		oneToManyMapping.setSpecifiedFetch(FetchType.LAZY);
+		
+		EclipseLinkOneToManyMapping specifiedOneToManyMapping = (EclipseLinkOneToManyMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(FetchType.LAZY, specifiedOneToManyMapping.getFetch());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToManyAnnotation annotation = 
+				(OneToManyAnnotation) attributeResource.getAnnotation(OneToManyAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(org.eclipse.jpt.jpa.core.resource.java.FetchType.LAZY, annotation.getFetch());
+	}
+	
+	public void testDefaultOneToManySetTargetEntity() throws Exception {
+		createTestEntityWithDefaultOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		oneToManyMapping.setSpecifiedTargetEntity("Foo");
+		
+		EclipseLinkOneToManyMapping specifiedOneToManyMapping = (EclipseLinkOneToManyMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals("Foo", specifiedOneToManyMapping.getSpecifiedTargetEntity());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToManyAnnotation annotation = 
+				(OneToManyAnnotation) attributeResource.getAnnotation(OneToManyAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals("Foo", annotation.getTargetEntity());
+	}
+	
+	public void testDefaultOneToManySetMappedBy() throws Exception {
+		createTestEntityWithDefaultOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		oneToManyMapping.getRelationship().getMappedByStrategy().setMappedByAttribute("Foo");
+		
+		EclipseLinkOneToManyMapping specifiedOneToManyMapping = (EclipseLinkOneToManyMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals("Foo", specifiedOneToManyMapping.getRelationship().getMappedByStrategy().getMappedByAttribute());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToManyAnnotation annotation = 
+				(OneToManyAnnotation) attributeResource.getAnnotation(OneToManyAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals("Foo", annotation.getMappedBy());
+	}
+	
+	public void testDefaultOneToManySetCascadeAll() throws Exception {
+		createTestEntityWithDefaultOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		oneToManyMapping.getCascade().setAll(true);
+		
+		EclipseLinkOneToManyMapping specifiedOneToManyMapping = (EclipseLinkOneToManyMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToManyMapping.getCascade().isAll());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToManyAnnotation annotation = 
+				(OneToManyAnnotation) attributeResource.getAnnotation(OneToManyAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(true, annotation.isCascadeAll());
+	}
+	
+	public void testDefaultOneToManySetCascadeMerge() throws Exception {
+		createTestEntityWithDefaultOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		oneToManyMapping.getCascade().setMerge(true);
+		
+		EclipseLinkOneToManyMapping specifiedOneToManyMapping = (EclipseLinkOneToManyMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToManyMapping.getCascade().isMerge());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToManyAnnotation annotation = 
+				(OneToManyAnnotation) attributeResource.getAnnotation(OneToManyAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(true, annotation.isCascadeMerge());
+	}
+	
+	public void testDefaultOneToManySetCascadePersist() throws Exception {
+		createTestEntityWithDefaultOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		oneToManyMapping.getCascade().setPersist(true);
+		
+		EclipseLinkOneToManyMapping specifiedOneToManyMapping = (EclipseLinkOneToManyMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToManyMapping.getCascade().isPersist());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToManyAnnotation annotation = 
+				(OneToManyAnnotation) attributeResource.getAnnotation(OneToManyAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(true, annotation.isCascadePersist());
+	}
+	
+	public void testDefaultOneToManySetCascadeRefresh() throws Exception {
+		createTestEntityWithDefaultOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		oneToManyMapping.getCascade().setRefresh(true);
+		
+		EclipseLinkOneToManyMapping specifiedOneToManyMapping = (EclipseLinkOneToManyMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToManyMapping.getCascade().isRefresh());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToManyAnnotation annotation = 
+				(OneToManyAnnotation) attributeResource.getAnnotation(OneToManyAnnotation.ANNOTATION_NAME);
+		assertEquals(true, annotation.isCascadeRefresh());
+	}
+	
+	public void testDefaultOneToManySetCascadeRemove() throws Exception {
+		createTestEntityWithDefaultOneToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToManyMapping oneToManyMapping = (EclipseLinkOneToManyMapping) persistentAttribute.getMapping();
+		oneToManyMapping.getCascade().setRemove(true);
+		
+		EclipseLinkOneToManyMapping specifiedOneToManyMapping = (EclipseLinkOneToManyMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToManyMapping.getCascade().isRemove());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToManyAnnotation annotation = 
+				(OneToManyAnnotation) attributeResource.getAnnotation(OneToManyAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(true, annotation.isCascadeRemove());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaOneToOneMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaOneToOneMappingTests.java
new file mode 100644
index 0000000..38894d1
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaOneToOneMappingTests.java
@@ -0,0 +1,448 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.OneToOneAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetch;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkOneToOneMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkPrivateOwned;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkRelationshipMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkJoinFetchAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkPrivateOwnedAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaOneToOneMappingTests extends EclipseLinkContextModelTestCase
+{	
+
+	private ICompilationUnit createTestEntityWithPrivateOwnedOneToOne() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, EclipseLink.PRIVATE_OWNED);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToOne").append(CR);
+				sb.append("@PrivateOwned").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithJoinFetchOneToOne() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, EclipseLink.JOIN_FETCH);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToOne").append(CR);
+				sb.append("@JoinFetch").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithDefaultOneToOne() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY);
+			}
+			
+			@Override
+			public void appendExtendsImplementsTo(StringBuilder sb) {
+				sb.append("implements java.io.Serializable");
+			}
+			
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("private " + TYPE_NAME + " myType;").append(CR);
+				sb.append(CR);
+			}
+		});
+	}
+
+	public EclipseLinkJavaOneToOneMappingTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetPrivateOwned() throws Exception {
+		createTestEntityWithPrivateOwnedOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		EclipseLinkPrivateOwned privateOwnable = oneToOneMapping.getPrivateOwned();
+		assertEquals(true, privateOwnable.isPrivateOwned());
+	}
+
+	public void testSetPrivateOwned() throws Exception {
+		createTestEntityWithPrivateOwnedOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		EclipseLinkPrivateOwned privateOwnable = oneToOneMapping.getPrivateOwned();
+		assertEquals(true, privateOwnable.isPrivateOwned());
+		
+		privateOwnable.setPrivateOwned(false);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(EclipseLinkPrivateOwnedAnnotation.ANNOTATION_NAME));
+		assertEquals(false, privateOwnable.isPrivateOwned());
+
+		privateOwnable.setPrivateOwned(true);
+		assertNotNull(attributeResource.getAnnotation(EclipseLinkPrivateOwnedAnnotation.ANNOTATION_NAME));
+		assertEquals(true, privateOwnable.isPrivateOwned());
+	}
+	
+	public void testPrivateOwnedUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithPrivateOwnedOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		EclipseLinkPrivateOwned privateOwnable = oneToOneMapping.getPrivateOwned();
+		assertEquals(true, privateOwnable.isPrivateOwned());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkPrivateOwnedAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(false, privateOwnable.isPrivateOwned());
+		
+		attributeResource.addAnnotation(EclipseLinkPrivateOwnedAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(true, privateOwnable.isPrivateOwned());
+	}
+	
+	public void testGetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test context value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to INNER specifically, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to OUTER, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// remove value from resource, test context
+		
+		joinFetchAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// remove annotation, text context
+		
+		attributeResource.removeAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertNull(contextJoinFetch.getValue());
+	}
+	
+	public void testSetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test resource value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to INNER specifically, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to OUTER, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.OUTER);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// set context to null, test resource
+		
+		contextJoinFetch.setValue(null);
+		
+		assertNull(attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME));
+		assertNull(contextJoinFetch.getValue());
+		
+		// change context to INNER specifically (this time from no annotation), test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+	}
+	
+	public void testDefaultOneToOne() throws Exception {
+		createTestEntityWithDefaultOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());	
+		
+		assertEquals(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, attributes.next().getDefaultMappingKey());
+	}
+	
+	public void testDefaultOneToOneSetFetch() throws Exception {
+		createTestEntityWithDefaultOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		oneToOneMapping.setSpecifiedFetch(FetchType.LAZY);
+		
+		EclipseLinkOneToOneMapping specifiedOneToOneMapping = (EclipseLinkOneToOneMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(FetchType.LAZY, specifiedOneToOneMapping.getFetch());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOneAnnotation annotation = 
+				(OneToOneAnnotation) attributeResource.getAnnotation(OneToOneAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(org.eclipse.jpt.jpa.core.resource.java.FetchType.LAZY, annotation.getFetch());
+	}
+	
+	public void testDefaultOneToOneSetTargetEntity() throws Exception {
+		createTestEntityWithDefaultOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		oneToOneMapping.setSpecifiedTargetEntity("Foo");
+		
+		EclipseLinkOneToOneMapping specifiedOneToOneMapping = (EclipseLinkOneToOneMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals("Foo", specifiedOneToOneMapping.getSpecifiedTargetEntity());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOneAnnotation annotation = 
+				(OneToOneAnnotation) attributeResource.getAnnotation(OneToOneAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals("Foo", annotation.getTargetEntity());
+	}
+	
+	public void testDefaultOneToOneSetMappedBy() throws Exception {
+		createTestEntityWithDefaultOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		oneToOneMapping.getRelationship().getMappedByStrategy().setMappedByAttribute("Foo");
+		
+		EclipseLinkOneToOneMapping specifiedOneToOneMapping = (EclipseLinkOneToOneMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals("Foo", specifiedOneToOneMapping.getRelationship().getMappedByStrategy().getMappedByAttribute());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOneAnnotation annotation = 
+				(OneToOneAnnotation) attributeResource.getAnnotation(OneToOneAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals("Foo", annotation.getMappedBy());
+	}
+	
+	public void testDefaultOneToOneSetCascadeAll() throws Exception {
+		createTestEntityWithDefaultOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		oneToOneMapping.getCascade().setAll(true);
+		
+		EclipseLinkOneToOneMapping specifiedOneToOneMapping = (EclipseLinkOneToOneMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToOneMapping.getCascade().isAll());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOneAnnotation annotation = 
+				(OneToOneAnnotation) attributeResource.getAnnotation(OneToOneAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(true, annotation.isCascadeAll());
+	}
+	
+	public void testDefaultOneToOneSetCascadeMerge() throws Exception {
+		createTestEntityWithDefaultOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		oneToOneMapping.getCascade().setMerge(true);
+		
+		EclipseLinkOneToOneMapping specifiedOneToOneMapping = (EclipseLinkOneToOneMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToOneMapping.getCascade().isMerge());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOneAnnotation annotation = 
+				(OneToOneAnnotation) attributeResource.getAnnotation(OneToOneAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(true, annotation.isCascadeMerge());
+	}
+	
+	public void testDefaultOneToOneSetCascadePersist() throws Exception {
+		createTestEntityWithDefaultOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		oneToOneMapping.getCascade().setPersist(true);
+		
+		EclipseLinkOneToOneMapping specifiedOneToOneMapping = (EclipseLinkOneToOneMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToOneMapping.getCascade().isPersist());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOneAnnotation annotation = 
+				(OneToOneAnnotation) attributeResource.getAnnotation(OneToOneAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(true, annotation.isCascadePersist());
+	}
+	
+	public void testDefaultOneToOneSetCascadeRefresh() throws Exception {
+		createTestEntityWithDefaultOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		oneToOneMapping.getCascade().setRefresh(true);
+		
+		EclipseLinkOneToOneMapping specifiedOneToOneMapping = (EclipseLinkOneToOneMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToOneMapping.getCascade().isRefresh());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOneAnnotation annotation = 
+				(OneToOneAnnotation) attributeResource.getAnnotation(OneToOneAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(true, annotation.isCascadeRefresh());
+	}
+	
+	public void testDefaultOneToOneSetCascadeRemove() throws Exception {
+		createTestEntityWithDefaultOneToOne();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<JavaPersistentAttribute> attributes = getJavaPersistentType().attributes();
+		JavaPersistentAttribute persistentAttribute = attributes.next();
+		assertTrue(persistentAttribute.getMapping().isDefault());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getDefaultMappingKey());
+		
+		EclipseLinkOneToOneMapping oneToOneMapping = (EclipseLinkOneToOneMapping) persistentAttribute.getMapping();
+		oneToOneMapping.getCascade().setRemove(true);
+		
+		EclipseLinkOneToOneMapping specifiedOneToOneMapping = (EclipseLinkOneToOneMapping) getJavaPersistentType().attributes().next().getMapping();
+		assertEquals(true, specifiedOneToOneMapping.getCascade().isRemove());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOneAnnotation annotation = 
+				(OneToOneAnnotation) attributeResource.getAnnotation(OneToOneAnnotation.ANNOTATION_NAME);
+		assertNotNull(annotation);
+		assertEquals(true, annotation.isCascadeRemove());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaStructConverterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaStructConverterTests.java
new file mode 100644
index 0000000..6cc3883
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaStructConverterTests.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkStructConverterAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaStructConverterTests extends EclipseLinkContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithConvertAndStructConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.STRUCT_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @StructConverter(name=\"foo\"");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithConvertAndStructConverterClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.STRUCT_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @StructConverter(converter=\"Foo\"");
+			}
+		});
+	}
+	
+	public EclipseLinkJavaStructConverterTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetName() throws Exception {
+		createTestEntityWithConvertAndStructConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkStructConverter converter = (EclipseLinkStructConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("foo", converter.getName());
+	}
+
+	public void testSetName() throws Exception {
+		createTestEntityWithConvertAndStructConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkStructConverter converter = (EclipseLinkStructConverter) eclipseLinkConvert.getConverter();
+		assertEquals("foo", converter.getName());
+		
+		converter.setName("bar");
+		assertEquals("bar", converter.getName());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkStructConverterAnnotation converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("bar", converterAnnotation.getName());
+
+		
+		converter.setName(null);
+		assertEquals(null, converter.getName());
+		converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getName());
+
+
+		converter.setName("bar");
+		assertEquals("bar", converter.getName());
+		converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("bar", converterAnnotation.getName());
+	}
+	
+	public void testGetNameUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndStructConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkStructConverter converter = (EclipseLinkStructConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("foo", converter.getName());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkStructConverterAnnotation converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setName("bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("bar", converter.getName());
+		
+		attributeResource.removeAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.addAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", eclipseLinkConvert.getConverter().getName());	
+	}
+	
+
+	public void testGetConverterClass() throws Exception {
+		createTestEntityWithConvertAndStructConverterClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkStructConverter converter = (EclipseLinkStructConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("Foo", converter.getConverterClass());
+	}
+
+	public void testSetConverterClass() throws Exception {
+		createTestEntityWithConvertAndStructConverterClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkStructConverter converter = (EclipseLinkStructConverter) eclipseLinkConvert.getConverter();
+		assertEquals("Foo", converter.getConverterClass());
+		
+		converter.setConverterClass("Bar");
+		assertEquals("Bar", converter.getConverterClass());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkStructConverterAnnotation converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getConverter());
+
+		
+		converter.setConverterClass(null);
+		assertEquals(null, converter.getConverterClass());
+		converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getConverter());
+
+
+		converter.setConverterClass("Bar");
+		assertEquals("Bar", converter.getConverterClass());
+		converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getConverter());
+	}
+	
+	public void testGetConverterClassUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndStructConverterClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkStructConverter converter = (EclipseLinkStructConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("Foo", converter.getConverterClass());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkStructConverterAnnotation converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setConverter("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", converter.getConverterClass());
+		
+		attributeResource.removeAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkStructConverterAnnotation) attributeResource.addAnnotation(EclipseLinkStructConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setConverter("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", ((EclipseLinkStructConverter) eclipseLinkConvert.getConverter()).getConverterClass());	
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaTypeConverterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaTypeConverterTests.java
new file mode 100644
index 0000000..93769d3
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaTypeConverterTests.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkTypeConverterAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaTypeConverterTests extends EclipseLinkContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithConvertAndTypeConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.TYPE_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @TypeConverter(name=\"foo\"");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithConvertAndDataType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.TYPE_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @TypeConverter(dataType=Foo.class");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithConvertAndObjectType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.TYPE_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @TypeConverter(objectType=Foo.class");
+			}
+		});
+	}
+	
+	public EclipseLinkJavaTypeConverterTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetName() throws Exception {
+		createTestEntityWithConvertAndTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkTypeConverter converter = (EclipseLinkTypeConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("foo", converter.getName());
+	}
+
+	public void testSetName() throws Exception {
+		createTestEntityWithConvertAndTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkTypeConverter converter = (EclipseLinkTypeConverter) eclipseLinkConvert.getConverter();
+		assertEquals("foo", converter.getName());
+		
+		converter.setName("bar");
+		assertEquals("bar", converter.getName());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkTypeConverterAnnotation converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("bar", converterAnnotation.getName());
+
+		
+		converter.setName(null);
+		assertEquals(null, converter.getName());
+		converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getName());
+
+
+		converter.setName("bar");
+		assertEquals("bar", converter.getName());
+		converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("bar", converterAnnotation.getName());
+	}
+	
+	public void testGetNameUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndTypeConverter();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkTypeConverter converter = (EclipseLinkTypeConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("foo", converter.getName());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkTypeConverterAnnotation converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setName("bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("bar", converter.getName());
+		
+		attributeResource.removeAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.addAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", eclipseLinkConvert.getConverter().getName());	
+	}
+
+	public void testGetDataType() throws Exception {
+		createTestEntityWithConvertAndDataType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkTypeConverter converter = (EclipseLinkTypeConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("Foo", converter.getDataType());
+	}
+
+	public void testSetDataType() throws Exception {
+		createTestEntityWithConvertAndDataType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkTypeConverter converter = (EclipseLinkTypeConverter) eclipseLinkConvert.getConverter();
+		assertEquals("Foo", converter.getDataType());
+		
+		converter.setDataType("Bar");
+		assertEquals("Bar", converter.getDataType());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkTypeConverterAnnotation converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getDataType());
+
+		
+		converter.setDataType(null);
+		assertEquals(null, converter.getDataType());
+		converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getDataType());
+
+
+		converter.setDataType("Bar");
+		assertEquals("Bar", converter.getDataType());
+		converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getDataType());
+	}
+	
+	public void testGetDataTypeUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndDataType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkTypeConverter converter = (EclipseLinkTypeConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("Foo", converter.getDataType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkTypeConverterAnnotation converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setDataType("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", converter.getDataType());
+		
+		attributeResource.removeAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.addAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setDataType("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", ((EclipseLinkTypeConverter) eclipseLinkConvert.getConverter()).getDataType());	
+	}
+	
+	public void testGetObjectType() throws Exception {
+		createTestEntityWithConvertAndObjectType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkTypeConverter converter = (EclipseLinkTypeConverter) eclipseLinkConvert.getConverter();
+		
+		assertEquals("Foo", converter.getObjectType());
+	}
+
+	public void testSetObjectType() throws Exception {
+		createTestEntityWithConvertAndObjectType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkTypeConverter converter = (EclipseLinkTypeConverter) eclipseLinkConvert.getConverter();
+		assertEquals("Foo", converter.getObjectType());
+		
+		converter.setObjectType("Bar");
+		assertEquals("Bar", converter.getObjectType());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkTypeConverterAnnotation converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getObjectType());
+
+		
+		converter.setObjectType(null);
+		assertEquals(null, converter.getObjectType());
+		converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, converterAnnotation.getObjectType());
+
+
+		converter.setObjectType("Bar");
+		assertEquals("Bar", converter.getObjectType());
+		converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", converterAnnotation.getObjectType());
+	}
+	
+	public void testGetObjectTypeUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithConvertAndObjectType();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+				
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		BasicMapping basicMapping = (BasicMapping) persistentAttribute.getMapping();
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) basicMapping.getConverter();
+		EclipseLinkTypeConverter converter = (EclipseLinkTypeConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals("Foo", converter.getObjectType());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkTypeConverterAnnotation converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);
+		converterAnnotation.setObjectType("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", converter.getObjectType());
+		
+		attributeResource.removeAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, eclipseLinkConvert.getConverter());
+		
+		converterAnnotation = (EclipseLinkTypeConverterAnnotation) attributeResource.addAnnotation(EclipseLinkTypeConverterAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(eclipseLinkConvert.getConverter());
+		
+		converterAnnotation.setObjectType("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", ((EclipseLinkTypeConverter) eclipseLinkConvert.getConverter()).getObjectType());	
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaVersionMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaVersionMappingTests.java
new file mode 100644
index 0000000..61c98c5
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/EclipseLinkJavaVersionMappingTests.java
@@ -0,0 +1,322 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.TemporalConverter;
+import org.eclipse.jpt.jpa.core.context.TemporalType;
+import org.eclipse.jpt.jpa.core.context.VersionMapping;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.TemporalAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkMutable;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkVersionMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkConvertAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkMutableAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLinkJavaVersionMappingTests extends EclipseLinkContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithVersionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.VERSION);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Version").append(CR);
+			}
+		});
+	}
+
+	
+	private ICompilationUnit createTestEntityWithConvert() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.VERSION, EclipseLink.CONVERT);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Version").append(CR);
+				sb.append("@Convert(\"class-instance\")").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithMutableVersion() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.VERSION, EclipseLink.MUTABLE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Version").append(CR);
+				sb.append("@Mutable").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithMutableVersionDate() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.VERSION, EclipseLink.MUTABLE, "java.util.Date");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Version").append(CR);
+				sb.append("    @Mutable").append(CR);
+				sb.append("    private Date myDate;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+	
+	public EclipseLinkJavaVersionMappingTests(String name) {
+		super(name);
+	}
+
+	public void testGetConvert() throws Exception {
+		createTestEntityWithVersionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.addAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		VersionMapping versionMapping = (VersionMapping) persistentAttribute.getMapping();
+
+		assertEquals(EclipseLinkConvert.class, versionMapping.getConverter().getType());
+	}
+	
+	public void testGetConvert2() throws Exception {
+		createTestEntityWithConvert();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		VersionMapping versionMapping = (VersionMapping) persistentAttribute.getMapping();
+
+		assertEquals(EclipseLinkConvert.class, versionMapping.getConverter().getType());
+		assertEquals(EclipseLinkConvert.CLASS_INSTANCE_CONVERTER, ((EclipseLinkConvert) versionMapping.getConverter()).getConverterName());
+	}
+
+	public void testSetConvert() throws Exception {
+		createTestEntityWithVersionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		VersionMapping versionMapping = (VersionMapping) persistentAttribute.getMapping();
+		assertNull(versionMapping.getConverter().getType());
+		
+		versionMapping.setConverter(TemporalConverter.class);
+		((TemporalConverter) versionMapping.getConverter()).setTemporalType(TemporalType.TIME);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		TemporalAnnotation temporal = (TemporalAnnotation) attributeResource.getAnnotation(TemporalAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.core.resource.java.TemporalType.TIME, temporal.getValue());
+		
+		versionMapping.setConverter(null);
+		assertNull(attributeResource.getAnnotation(TemporalAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testGetConvertUpdatesFromResourceModelChange() throws Exception {
+		createTestEntityWithVersionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		VersionMapping versionMapping = (VersionMapping) persistentAttribute.getMapping();
+
+		assertNull(versionMapping.getConverter().getType());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkConvertAnnotation convert = (EclipseLinkConvertAnnotation) attributeResource.addAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		convert.setValue("foo");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(EclipseLinkConvert.class, versionMapping.getConverter().getType());
+		assertEquals("foo", ((EclipseLinkConvert) versionMapping.getConverter()).getConverterName());
+		
+		attributeResource.removeAnnotation(EclipseLinkConvertAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(versionMapping.getConverter().getType());
+		assertFalse(versionMapping.isDefault());
+		assertSame(versionMapping, persistentAttribute.getMapping());
+	}
+	
+	public void testGetSpecifiedMutable() throws Exception {
+		createTestEntityWithMutableVersion();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkVersionMapping versionMapping = (EclipseLinkVersionMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = versionMapping.getMutable();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkMutableAnnotation mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		mutableAnnotation.setValue(Boolean.TRUE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+
+		mutableAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+
+		mutableAnnotation.setValue(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.FALSE, mutable.getSpecifiedMutable());
+		
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, mutable.getSpecifiedMutable());
+		
+		attributeResource.addAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+	}
+	
+	public void testSetSpecifiedMutable() throws Exception {
+		createTestEntityWithMutableVersion();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkVersionMapping versionMapping = (EclipseLinkVersionMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = versionMapping.getMutable();
+		assertEquals(Boolean.TRUE, mutable.getSpecifiedMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkMutableAnnotation mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertEquals(null, mutableAnnotation.getValue());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertEquals(null, mutableAnnotation.getValue());
+
+		mutable.setSpecifiedMutable(null);
+		mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertEquals(null, mutableAnnotation);
+		
+		mutable.setSpecifiedMutable(Boolean.FALSE);	
+		mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertEquals(Boolean.FALSE, mutableAnnotation.getValue());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertEquals(Boolean.TRUE, mutableAnnotation.getValue());
+	}
+	
+	public void testIsDefaultMutable() throws Exception {
+		createTestEntityWithMutableVersion();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkVersionMapping versionMapping = (EclipseLinkVersionMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = versionMapping.getMutable();
+		assertTrue(mutable.isDefaultMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertTrue(mutable.isDefaultMutable());
+		
+		mutable.setSpecifiedMutable(Boolean.FALSE);	
+		assertTrue(mutable.isDefaultMutable());
+		
+		//set mutable default to false in the persistence unit properties, verify default in java still true since this is not a Date/Calendar
+		(getPersistenceUnit()).getOptions().setTemporalMutable(Boolean.FALSE);
+		assertTrue(mutable.isDefaultMutable());
+	}
+	
+	public void testIsDefaultMutableForDate() throws Exception {
+		createTestEntityWithMutableVersionDate();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkVersionMapping versionMapping = (EclipseLinkVersionMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = versionMapping.getMutable();
+		assertFalse(mutable.isDefaultMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertFalse(mutable.isDefaultMutable());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertFalse(mutable.isDefaultMutable());
+		
+		//set mutable default to false in the persistence unit properties, verify default in java still true since this is not a Date/Calendar
+		(getPersistenceUnit()).getOptions().setTemporalMutable(Boolean.TRUE);
+		assertTrue(mutable.isDefaultMutable());
+		
+		(getPersistenceUnit()).getOptions().setTemporalMutable(Boolean.FALSE);
+		assertFalse(mutable.isDefaultMutable());
+		
+		(getPersistenceUnit()).getOptions().setTemporalMutable(null);
+		assertFalse(mutable.isDefaultMutable());
+	}
+	
+	public void testIsMutable() throws Exception {
+		createTestEntityWithMutableVersion();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkVersionMapping versionMapping = (EclipseLinkVersionMapping) persistentAttribute.getMapping();
+		EclipseLinkMutable mutable = versionMapping.getMutable();
+		assertTrue(mutable.isMutable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		attributeResource.removeAnnotation(EclipseLinkMutableAnnotation.ANNOTATION_NAME);
+		assertTrue(mutable.isMutable());
+		
+		mutable.setSpecifiedMutable(Boolean.TRUE);	
+		assertTrue(mutable.isMutable());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/JptEclipseLinkCoreJavaContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/JptEclipseLinkCoreJavaContextModelTests.java
new file mode 100644
index 0000000..cbf3a30
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/java/JptEclipseLinkCoreJavaContextModelTests.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.java;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class JptEclipseLinkCoreJavaContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkCoreJavaContextModelTests.class.getName());	
+		suite.addTestSuite(EclipseLinkJavaBasicMappingTests.class);
+		suite.addTestSuite(EclipseLinkJavaCachingTests.class);
+		suite.addTestSuite(EclipseLinkJavaConverterTests.class);
+		suite.addTestSuite(EclipseLinkJavaConvertTests.class);
+		suite.addTestSuite(EclipseLinkJavaEmbeddableTests.class);
+		suite.addTestSuite(EclipseLinkJavaEntityTests.class);
+		suite.addTestSuite(EclipseLinkJavaIdMappingTests.class);
+		suite.addTestSuite(EclipseLinkJavaManyToManyMappingTests.class);		
+		suite.addTestSuite(EclipseLinkJavaManyToOneMappingTests.class);		
+		suite.addTestSuite(EclipseLinkJavaMappedSuperclassTests.class);
+		suite.addTestSuite(EclipseLinkJavaObjectTypeConverterTests.class);
+		suite.addTestSuite(EclipseLinkJavaOneToManyMappingTests.class);
+		suite.addTestSuite(EclipseLinkJavaOneToOneMappingTests.class);		
+		suite.addTestSuite(EclipseLinkJavaStructConverterTests.class);
+		suite.addTestSuite(EclipseLinkJavaTypeConverterTests.class);
+		suite.addTestSuite(EclipseLinkJavaVersionMappingTests.class);
+		return suite;
+	}
+
+	private JptEclipseLinkCoreJavaContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkEntityMappingsTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkEntityMappingsTests.java
new file mode 100644
index 0000000..c20458c
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkEntityMappingsTests.java
@@ -0,0 +1,675 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkEntityMappings;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkConverterContainer;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntityMappings;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTypeConverter;
+
+@SuppressWarnings("nls")
+public class EclipseLinkEntityMappingsTests extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkEntityMappingsTests(String name) {
+		super(name);
+	}
+
+	
+	public void testUpdateCustomConverters() throws Exception {
+		XmlEntityMappings resourceEntityMappings = getXmlEntityMappings();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		EclipseLinkEntityMappings contextEntityMappings = getEntityMappings();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = contextEntityMappings.getConverterContainer();
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceEntityMappings.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//add a converter to the resource model, check context model
+		XmlConverter resourceConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceEntityMappings.getConverters().add(resourceConverter);
+		resourceConverter.setClassName("Foo");
+		resourceConverter.setName("myConverter");
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(1, resourceEntityMappings.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//add another converter to the resource model, check context model
+		XmlConverter resourceConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceEntityMappings.getConverters().add(0, resourceConverter2);
+		resourceConverter2.setClassName("Foo2");
+		resourceConverter2.setName("myConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(2, resourceEntityMappings.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//move a converter in the resource model, check context model
+		resourceEntityMappings.getConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(2, resourceEntityMappings.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//remove a converter from the resource model, check context model
+		resourceEntityMappings.getConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(1, resourceEntityMappings.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//remove a converter from the resource model, check context model
+		resourceEntityMappings.getConverters().remove(resourceConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceEntityMappings.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyCustomConverters() throws Exception {
+		XmlEntityMappings resourceEntityMappings = getXmlEntityMappings();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		EclipseLinkEntityMappings contextEntityMappings = getEntityMappings();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = contextEntityMappings.getConverterContainer();
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceEntityMappings.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter.setConverterClass("Foo");
+		contextConverter.setName("myConverter");
+		
+		assertEquals(1, resourceEntityMappings.getConverters().size());
+		assertEquals("Foo", resourceEntityMappings.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceEntityMappings.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter2 = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter2.setConverterClass("Foo2");
+		contextConverter2.setName("myConverter2");
+		
+		assertEquals(2, resourceEntityMappings.getConverters().size());
+		assertEquals("Foo2", resourceEntityMappings.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceEntityMappings.getConverters().get(0).getName());
+		assertEquals("Foo", resourceEntityMappings.getConverters().get(1).getClassName());
+		assertEquals("myConverter", resourceEntityMappings.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveCustomConverter(0, 1);
+		
+		assertEquals(2, resourceEntityMappings.getConverters().size());
+		assertEquals("Foo", resourceEntityMappings.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceEntityMappings.getConverters().get(0).getName());
+		assertEquals("Foo2", resourceEntityMappings.getConverters().get(1).getClassName());
+		assertEquals("myConverter2", resourceEntityMappings.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(0);
+		
+		assertEquals(1, resourceEntityMappings.getConverters().size());
+		assertEquals("Foo2", resourceEntityMappings.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceEntityMappings.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(contextConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceEntityMappings.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateTypeConverters() throws Exception {
+		XmlEntityMappings resourceEntityMappings = getXmlEntityMappings();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		EclipseLinkEntityMappings contextEntityMappings = getEntityMappings();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = contextEntityMappings.getConverterContainer();
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceEntityMappings.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));	
+		
+		//add a converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceEntityMappings.getTypeConverters().add(resourceTypeConverter);
+		resourceTypeConverter.setDataType("Foo");
+		resourceTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, resourceEntityMappings.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));	
+	
+		//add another converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceEntityMappings.getTypeConverters().add(0, resourceTypeConverter2);
+		resourceTypeConverter2.setDataType("Foo2");
+		resourceTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, resourceEntityMappings.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));	
+		
+		//move a converter in the resource model, check context model
+		resourceEntityMappings.getTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, resourceEntityMappings.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));	
+		
+		//remove a converter from the resource model, check context model
+		resourceEntityMappings.getTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, resourceEntityMappings.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));	
+		
+		//remove a converter from the resource model, check context model
+		resourceEntityMappings.getTypeConverters().remove(resourceTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceEntityMappings.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));	
+	}
+
+	public void testModifyTypeConverters() throws Exception {
+		XmlEntityMappings resourceEntityMappings = getXmlEntityMappings();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		EclipseLinkEntityMappings contextEntityMappings = getEntityMappings();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = contextEntityMappings.getConverterContainer();
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceEntityMappings.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter.setDataType("Foo");
+		contextTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, resourceEntityMappings.getTypeConverters().size());
+		assertEquals("Foo", resourceEntityMappings.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceEntityMappings.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter2 = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter2.setDataType("Foo2");
+		contextTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, resourceEntityMappings.getTypeConverters().size());
+		assertEquals("Foo2", resourceEntityMappings.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceEntityMappings.getTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceEntityMappings.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter", resourceEntityMappings.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveTypeConverter(0, 1);
+		
+		assertEquals(2, resourceEntityMappings.getTypeConverters().size());
+		assertEquals("Foo", resourceEntityMappings.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceEntityMappings.getTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceEntityMappings.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter2", resourceEntityMappings.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(0);
+		
+		assertEquals(1, resourceEntityMappings.getTypeConverters().size());
+		assertEquals("Foo2", resourceEntityMappings.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceEntityMappings.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(contextTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceEntityMappings.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateObjectTypeConverters() throws Exception {
+		XmlEntityMappings resourceEntityMappings = getXmlEntityMappings();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		EclipseLinkEntityMappings contextEntityMappings = getEntityMappings();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = contextEntityMappings.getConverterContainer();
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//add a converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceEntityMappings.getObjectTypeConverters().add(resourceObjectTypeConverter);
+		resourceObjectTypeConverter.setDataType("Foo");
+		resourceObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//add another converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceEntityMappings.getObjectTypeConverters().add(0, resourceObjectTypeConverter2);
+		resourceObjectTypeConverter2.setDataType("Foo2");
+		resourceObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//move a converter in the resource model, check context model
+		resourceEntityMappings.getObjectTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//remove a converter from the resource model, check context model
+		resourceEntityMappings.getObjectTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));		
+		
+		//remove a converter from the resource model, check context model
+		resourceEntityMappings.getObjectTypeConverters().remove(resourceObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));	
+	}
+
+	public void testModifyObjectTypeConverters() throws Exception {
+		XmlEntityMappings resourceEntityMappings = getXmlEntityMappings();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		EclipseLinkEntityMappings contextEntityMappings = getEntityMappings();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = contextEntityMappings.getConverterContainer();
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter.setDataType("Foo");
+		contextObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceEntityMappings.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceEntityMappings.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter2 = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter2.setDataType("Foo2");
+		contextObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceEntityMappings.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceEntityMappings.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceEntityMappings.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter", resourceEntityMappings.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveObjectTypeConverter(0, 1);
+		
+		assertEquals(2, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceEntityMappings.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceEntityMappings.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceEntityMappings.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceEntityMappings.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(0);
+		
+		assertEquals(1, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceEntityMappings.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceEntityMappings.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(contextObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceEntityMappings.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateStructConverters() throws Exception {
+		XmlEntityMappings resourceEntityMappings = getXmlEntityMappings();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		EclipseLinkEntityMappings contextEntityMappings = getEntityMappings();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = contextEntityMappings.getConverterContainer();
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceEntityMappings.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));	
+		
+		//add a converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceEntityMappings.getStructConverters().add(resourceStructConverter);
+		resourceStructConverter.setConverter("Foo");
+		resourceStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, resourceEntityMappings.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));	
+		
+		//add another converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceEntityMappings.getStructConverters().add(0, resourceStructConverter2);
+		resourceStructConverter2.setConverter("Foo2");
+		resourceStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, resourceEntityMappings.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));	
+		
+		//move a converter in the resource model, check context model
+		resourceEntityMappings.getStructConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, resourceEntityMappings.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));	
+		
+		//remove a converter from the resource model, check context model
+		resourceEntityMappings.getStructConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, resourceEntityMappings.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));	
+		
+		//remove a converter from the resource model, check context model
+		resourceEntityMappings.getStructConverters().remove(resourceStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceEntityMappings.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));	
+	}
+
+	public void testModifyStructConverters() throws Exception {
+		XmlEntityMappings resourceEntityMappings = getXmlEntityMappings();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		EclipseLinkEntityMappings contextEntityMappings = getEntityMappings();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = contextEntityMappings.getConverterContainer();
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceEntityMappings.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter.setConverterClass("Foo");
+		contextStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, resourceEntityMappings.getStructConverters().size());
+		assertEquals("Foo", resourceEntityMappings.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceEntityMappings.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter2 = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter2.setConverterClass("Foo2");
+		contextStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, resourceEntityMappings.getStructConverters().size());
+		assertEquals("Foo2", resourceEntityMappings.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceEntityMappings.getStructConverters().get(0).getName());
+		assertEquals("Foo", resourceEntityMappings.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter", resourceEntityMappings.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveStructConverter(0, 1);
+		
+		assertEquals(2, resourceEntityMappings.getStructConverters().size());
+		assertEquals("Foo", resourceEntityMappings.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceEntityMappings.getStructConverters().get(0).getName());
+		assertEquals("Foo2", resourceEntityMappings.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter2", resourceEntityMappings.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(0);
+		
+		assertEquals(1, resourceEntityMappings.getStructConverters().size());
+		assertEquals("Foo2", resourceEntityMappings.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceEntityMappings.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(contextStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceEntityMappings.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmBasicMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmBasicMappingTests.java
new file mode 100644
index 0000000..3434ef5
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmBasicMappingTests.java
@@ -0,0 +1,389 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkBasicMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkBasicMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlBasic;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntity;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmBasicMappingTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithBasicMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithMutableBasicDate() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC, EclipseLink.MUTABLE, "java.util.Date");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+				sb.append("    @Mutable").append(CR);
+				sb.append("    private Date myDate;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+	
+	public EclipseLinkOrmBasicMappingTests(String name) {
+		super(name);
+	}
+	
+	
+	public void testUpdateMutable() throws Exception {
+		createTestEntityWithBasicMapping();
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmEclipseLinkBasicMapping contextBasic = 
+			(OrmEclipseLinkBasicMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlBasic resourceBasic = 
+			(XmlBasic) resourceEntity.getAttributes().getBasics().get(0);
+		EclipseLinkBasicMapping javaBasicMapping = (EclipseLinkBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		// check defaults
+		
+		assertNull(resourceBasic.getMutable());
+		assertTrue(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(contextBasic.getMutable().isMutable());
+		
+		// set xml mutable to false, check context
+		
+		resourceBasic.setMutable(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceBasic.getMutable());
+		assertTrue(contextBasic.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		
+		// set xml mutable to true, check context
+		
+		resourceBasic.setMutable(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceBasic.getMutable());
+		assertTrue(contextBasic.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, contextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(contextBasic.getMutable().isMutable());
+		
+		// clear xml mutable, check context
+		
+		resourceBasic.setMutable(null);
+		
+		assertNull(resourceBasic.getMutable());
+		assertTrue(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(contextBasic.getMutable().isMutable());
+		
+		// TODO - test defaults for java serializable and date/time types, 
+		// with and without persistence property
+		
+		// set mutable on java basic mapping
+		
+		javaBasicMapping.getMutable().setSpecifiedMutable(Boolean.FALSE);
+		assertNull(resourceBasic.getMutable());
+		assertTrue(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(contextBasic.getMutable().isMutable());
+		assertFalse(javaBasicMapping.getMutable().isMutable());
+		
+		// remove attribute from xml, test default mutable from java
+		
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		EclipseLinkBasicMapping virtualContextBasic = (EclipseLinkBasicMapping) ormPersistentAttribute2.getMapping();
+		
+		assertNull(resourceBasic.getMutable());
+		assertTrue(virtualContextBasic.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, virtualContextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(virtualContextBasic.getMutable().isMutable());
+		assertFalse(javaBasicMapping.getMutable().isMutable());
+		
+		// set metadata complete
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualContextBasic = (EclipseLinkBasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(resourceBasic.getMutable());
+		assertTrue(virtualContextBasic.getMutable().isDefaultMutable());
+		assertNull(virtualContextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(virtualContextBasic.getMutable().isMutable());
+		assertFalse(javaBasicMapping.getMutable().isMutable());
+	}
+	
+	public void testUpdateMutableDate() throws Exception {
+		createTestEntityWithMutableBasicDate();
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "myDate");
+		OrmEclipseLinkBasicMapping contextBasic = 
+			(OrmEclipseLinkBasicMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlBasic resourceBasic = 
+			(XmlBasic) resourceEntity.getAttributes().getBasics().get(0);
+		EclipseLinkBasicMapping javaBasicMapping = (EclipseLinkBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("myDate").getMapping();
+		
+		// check defaults
+		
+		assertNull(resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		
+		// set xml mutable to false, check context
+		
+		resourceBasic.setMutable(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		
+		// set xml mutable to true, check context
+		
+		resourceBasic.setMutable(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, contextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(contextBasic.getMutable().isMutable());
+		
+		// clear xml mutable, check context
+		
+		resourceBasic.setMutable(null);
+		
+		assertNull(resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(Boolean.TRUE);
+		assertNull(resourceBasic.getMutable());
+		assertTrue(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(contextBasic.getMutable().isMutable());
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(Boolean.FALSE);
+		assertNull(resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(null);
+		assertNull(resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		
+		// set mutable on java basic mapping
+		
+		javaBasicMapping.getMutable().setSpecifiedMutable(Boolean.TRUE);
+		assertNull(resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		assertTrue(javaBasicMapping.getMutable().isMutable());
+		
+		// remove attribute from xml, test default mutable from java
+		
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("myDate");
+		EclipseLinkBasicMapping virtualContextBasic = (EclipseLinkBasicMapping) ormPersistentAttribute2.getMapping();
+		
+		assertNull(resourceBasic.getMutable());
+		assertFalse(virtualContextBasic.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, virtualContextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(virtualContextBasic.getMutable().isMutable());
+		assertTrue(javaBasicMapping.getMutable().isMutable());
+		
+		// set metadata complete
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("myDate");
+		virtualContextBasic = (EclipseLinkBasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(resourceBasic.getMutable());
+		assertFalse(virtualContextBasic.getMutable().isDefaultMutable());
+		assertNull(virtualContextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(virtualContextBasic.getMutable().isMutable());
+		assertTrue(javaBasicMapping.getMutable().isMutable());
+	}
+
+	public void testModifyMutable() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basic");
+		OrmEclipseLinkBasicMapping contextBasic = 
+			(OrmEclipseLinkBasicMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlBasic resourceBasic = 
+			(XmlBasic) resourceEntity.getAttributes().getBasics().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		
+		// set context mutable to true, check resource
+		
+		contextBasic.getMutable().setSpecifiedMutable(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, contextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(contextBasic.getMutable().isMutable());
+		
+		// set context mutable to false, check resource
+		
+		contextBasic.getMutable().setSpecifiedMutable(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		
+		// set context mutable to null, check resource
+		
+		contextBasic.getMutable().setSpecifiedMutable(null);
+		
+		assertNull(resourceBasic.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+	}
+	
+	public void testUpdateConvert() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping();
+		XmlBasic basicResource = (XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0);
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertNull(ormBasicMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+				
+		//set lob in the resource model, verify context model updated
+		basicResource.setConvert("myConvert");
+		assertEquals(EclipseLinkConvert.class, ormBasicMapping.getConverter().getType());
+		assertEquals("myConvert", basicResource.getConvert());
+
+		//set lob to null in the resource model
+		basicResource.setConvert(null);
+		assertNull(ormBasicMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+		
+		
+		javaBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) javaBasicMapping.getConverter()).setSpecifiedConverterName("foo");
+		
+		assertNull(ormBasicMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+		assertEquals("foo", ((EclipseLinkConvert) javaBasicMapping.getConverter()).getSpecifiedConverterName());
+		
+		
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		EclipseLinkBasicMapping virtualBasicMapping = (EclipseLinkBasicMapping) ormPersistentAttribute2.getMapping();
+		
+		assertEquals(EclipseLinkConvert.class, virtualBasicMapping.getConverter().getType());
+		assertEquals("foo", ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getSpecifiedConverterName());
+		assertEquals(null, basicResource.getConvert());
+		assertEquals("foo", ((EclipseLinkConvert) javaBasicMapping.getConverter()).getSpecifiedConverterName());
+		
+		((EclipseLinkConvert) javaBasicMapping.getConverter()).setSpecifiedConverterName("bar");
+		assertEquals(EclipseLinkConvert.class, virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getSpecifiedConverterName());
+		assertEquals(null, basicResource.getConvert());
+		assertEquals("bar", ((EclipseLinkConvert) javaBasicMapping.getConverter()).getSpecifiedConverterName());
+
+		javaBasicMapping.setConverter(null);
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+		assertNull(javaBasicMapping.getConverter().getType());
+	}
+	
+	public void testModifyConvert() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping();
+		XmlBasic basicResource = (XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0);
+	
+		assertNull(ormBasicMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+				
+		//set lob in the context model, verify resource model updated
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		assertEquals("", basicResource.getConvert());
+		assertEquals(EclipseLinkConvert.class, ormBasicMapping.getConverter().getType());
+	
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setSpecifiedConverterName("bar");
+		assertEquals("bar", basicResource.getConvert());
+		assertEquals(EclipseLinkConvert.class, ormBasicMapping.getConverter().getType());
+		assertEquals("bar", ((EclipseLinkConvert) ormBasicMapping.getConverter()).getSpecifiedConverterName());
+
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setSpecifiedConverterName(null);
+
+		assertNull(ormBasicMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+
+		//set lob to false in the context model
+		ormBasicMapping.setConverter(null);
+		assertNull(ormBasicMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmContextModelTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmContextModelTestCase.java
new file mode 100644
index 0000000..f86fac1
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmContextModelTestCase.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.JpaFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.core.tests.internal.projects.TestJpaProject;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkEntityMappings;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationOperation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntityMappings;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("nls")
+public abstract class EclipseLinkOrmContextModelTestCase
+	extends EclipseLinkContextModelTestCase
+{
+	protected JpaXmlResource eclipseLinkOrmXmlResource;
+	
+	
+	protected EclipseLinkOrmContextModelTestCase(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.eclipseLinkOrmXmlResource = getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+	}
+	
+	@Override
+	protected TestJpaProject buildJpaProject(String projectName, boolean autoBuild, IDataModel jpaConfig) throws Exception {
+		TestJpaProject testJpaProject = super.buildJpaProject(projectName, autoBuild, jpaConfig);
+		
+		EclipseLinkOrmFileCreationOperation operation = 
+			new EclipseLinkOrmFileCreationOperation(buildEclipseLinkOrmConfig(testJpaProject));
+		operation.execute(null, null);
+		
+		return testJpaProject;
+	}
+	
+	protected IDataModel buildEclipseLinkOrmConfig(TestJpaProject testJpaProject) {
+		IDataModel dataModel = 
+			DataModelFactory.createDataModel(new EclipseLinkOrmFileCreationDataModelProvider());		
+		dataModel.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				testJpaProject.getProject().getFolder("src/META-INF").getFullPath());
+		dataModel.setProperty(JpaFileCreationDataModelProperties.VERSION, EclipseLink.SCHEMA_VERSION);
+		dataModel.setProperty(OrmFileCreationDataModelProperties.ADD_TO_PERSISTENCE_UNIT, Boolean.TRUE);
+		return dataModel;
+	}
+	
+	@Override
+	protected void tearDown() throws Exception {
+		this.eclipseLinkOrmXmlResource = null;
+		super.tearDown();
+	}
+	
+	@Override
+	protected JpaXmlResource getOrmXmlResource() {
+		return this.eclipseLinkOrmXmlResource;
+	}
+	
+	@Override
+	protected XmlEntityMappings getXmlEntityMappings() {
+		return (XmlEntityMappings) super.getXmlEntityMappings();
+	}
+	
+	@Override
+	protected EclipseLinkEntityMappings getEntityMappings() {
+		return (EclipseLinkEntityMappings) super.getEntityMappings();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmConverterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmConverterTests.java
new file mode 100644
index 0000000..8c8a09f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmConverterTests.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkCustomConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlBasic;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlConverter;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmConverterTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithBasicMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC, EclipseLink.CONVERT, EclipseLink.CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+				sb.append("    @Convert(name=\"foo\")").append(CR);
+				sb.append("    @Converter");
+			}
+		});
+	}
+
+	
+	public EclipseLinkOrmConverterTests(String name) {
+		super(name);
+	}
+	
+	
+	public void testUpdateConverterClass() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping(); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkCustomConverter.class);
+		OrmEclipseLinkCustomConverter ormConverter = (OrmEclipseLinkCustomConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getConverterClass());
+		assertEquals(null, converterResource.getClassName());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setClassName("myConvert");
+		assertEquals("myConvert", ormConverter.getConverterClass());
+		assertEquals("myConvert", converterResource.getClassName());
+
+		//set converter class name to null in the resource model
+		converterResource.setClassName(null);
+		assertEquals(null, ormConverter.getConverterClass());
+		assertEquals(null, converterResource.getClassName());
+		
+		//remove the specified persistent attribute, test virtual mapping	
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		EclipseLinkCustomConverter virtualConverter = (EclipseLinkCustomConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkCustomConverter javaConverter = ((EclipseLinkCustomConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setConverterClass("bar");
+		assertEquals("bar", virtualConverter.getConverterClass());
+		assertEquals("bar", javaConverter.getConverterClass());
+		
+		//set metadata-complete, test virtual mapping	
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getConverterClass());
+	}
+	
+	public void testModifyConverterClass() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkCustomConverter.class);
+		OrmEclipseLinkCustomConverter ormConverter = (OrmEclipseLinkCustomConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getConverter();
+	
+		assertEquals(null, ormConverter.getConverterClass());
+		assertEquals(null, converterResource.getClassName());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setConverterClass("foo");
+		assertEquals("foo", ormConverter.getConverterClass());
+		assertEquals("foo", converterResource.getClassName());
+	
+		ormConverter.setConverterClass(null);
+		assertEquals(null, ormConverter.getConverterClass());
+		assertEquals(null, converterResource.getClassName());
+	}
+	
+	public void testUpdateName() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkCustomConverter.class);
+		OrmEclipseLinkCustomConverter ormConverter = (OrmEclipseLinkCustomConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setName("myConvert");
+		assertEquals("myConvert", ormConverter.getName());
+		assertEquals("myConvert", converterResource.getName());
+
+		//set converter class name to null in the resource model
+		converterResource.setName(null);
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+		
+		//remove the specified persistent attribute, test virtual mapping	
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		EclipseLinkCustomConverter virtualConverter = (EclipseLinkCustomConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkCustomConverter javaConverter = ((EclipseLinkCustomConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setName("bar");
+		assertEquals("bar", virtualConverter.getName());
+		assertEquals("bar", javaConverter.getName());
+		
+		//set metadata-complete, test virtual mapping	
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getName());
+	}
+	
+	public void testModifyName() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkCustomConverter.class);
+		OrmEclipseLinkCustomConverter ormConverter = (OrmEclipseLinkCustomConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getConverter();
+	
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setName("foo");
+		assertEquals("foo", ormConverter.getName());
+		assertEquals("foo", converterResource.getName());
+	
+		ormConverter.setName(null);
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmEmbeddableTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmEmbeddableTests.java
new file mode 100644
index 0000000..1364458
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmEmbeddableTests.java
@@ -0,0 +1,1035 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkEmbeddable;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkConverterContainer;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkEmbeddable;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEmbeddable;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTypeConverter;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmEmbeddableTests extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmEmbeddableTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestEmbeddableForCustomizer() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.EMBEDDABLE, EclipseLink.CUSTOMIZER);
+			}
+			
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Embeddable").append(CR);
+			}
+		});
+	}
+		
+	private ICompilationUnit createTestEmbeddableForChangeTracking() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.EMBEDDABLE, EclipseLink.CHANGE_TRACKING);
+			}
+			
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Embeddable").append(CR);
+			}
+		});
+	}	
+	
+	private ICompilationUnit createTestEmbeddableForCustomConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.EMBEDDABLE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Embeddable").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEmbeddableForTypeConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.EMBEDDABLE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Embeddable").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEmbeddableForObjectTypeConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.EMBEDDABLE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Embeddable").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEmbeddableForStructConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.EMBEDDABLE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Embeddable").append(CR);
+			}
+		});
+	}
+	
+	public void testUpdateCustomizerClass() throws Exception {
+		createTestEmbeddableForCustomizer();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkEmbeddable javaContextEmbeddable = (JavaEclipseLinkEmbeddable) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+
+
+		// check defaults
+		
+		assertNull(resourceEmbeddable.getCustomizer());
+		assertNull(javaContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// set xml customizer, check defaults
+		resourceEmbeddable.setCustomizer(OrmFactory.eINSTANCE.createXmlClassReference());
+		assertNull(resourceEmbeddable.getCustomizer().getClassName());
+		assertNull(javaContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+
+		
+		// set xml customizer class, check override
+		
+		resourceEmbeddable.getCustomizer().setClassName("foo");
+		
+		assertEquals("foo", resourceEmbeddable.getCustomizer().getClassName());
+		assertNull(javaContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertEquals("foo", ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// clear xml customizer class, set java customizer class, check defaults
+		
+		resourceEmbeddable.getCustomizer().setClassName(null);
+		javaContextEmbeddable.getCustomizer().setSpecifiedCustomizerClass("bar");
+		
+		assertNull(resourceEmbeddable.getCustomizer().getClassName());
+		assertEquals("bar", javaContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEmbeddable.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceEmbeddable.getCustomizer().getClassName());
+		assertEquals("bar", javaContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+
+		ormContextEmbeddable.setSpecifiedMetadataComplete(null);
+		
+		// set xml customizer class, check override
+		
+		resourceEmbeddable.getCustomizer().setClassName("foo");
+		
+		assertEquals("foo", resourceEmbeddable.getCustomizer().getClassName());
+		assertEquals("bar", javaContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertEquals("foo", ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+
+		//set xml customizer null
+		javaContextEmbeddable.getCustomizer().setSpecifiedCustomizerClass(null);
+		resourceEmbeddable.setCustomizer(null);
+		assertNull(resourceEmbeddable.getCustomizer());
+		assertNull(javaContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+
+	}
+	
+	public void testModifyCustomizerClass() throws Exception {
+		createTestEmbeddableForCustomizer();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceEmbeddable.getCustomizer());
+		assertNull(ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// set context customizer, check resource
+		
+		ormContextEmbeddable.getCustomizer().setSpecifiedCustomizerClass("foo");
+		
+		assertEquals("foo", resourceEmbeddable.getCustomizer().getClassName());
+		assertEquals("foo", ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+				
+		// set context customizer to null, check resource
+		
+		ormContextEmbeddable.getCustomizer().setSpecifiedCustomizerClass(null);
+		
+		assertNull(resourceEmbeddable.getCustomizer());
+		assertNull(ormContextEmbeddable.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEmbeddable.getCustomizer().getSpecifiedCustomizerClass());
+	}
+	
+	public void testUpdateChangeTracking() throws Exception {
+		createTestEmbeddableForChangeTracking();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkEmbeddable javaContextEmbeddable = (JavaEclipseLinkEmbeddable) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceEmbeddable.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertNull(ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to ATTRIBUTE, check context
+		
+		resourceEmbeddable.setChangeTracking(EclipseLinkOrmFactory.eINSTANCE.createXmlChangeTracking());
+		resourceEmbeddable.getChangeTracking().setType(XmlChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(XmlChangeTrackingType.ATTRIBUTE, resourceEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to OBJECT, check context
+		
+		resourceEmbeddable.getChangeTracking().setType(XmlChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to DEFERRED, check context
+		
+		resourceEmbeddable.getChangeTracking().setType(XmlChangeTrackingType.DEFERRED);
+		
+		assertEquals(XmlChangeTrackingType.DEFERRED, resourceEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to AUTO, check context
+		
+		resourceEmbeddable.getChangeTracking().setType(XmlChangeTrackingType.AUTO);
+		
+		assertEquals(XmlChangeTrackingType.AUTO, resourceEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+		
+		// clear xml change tracking, set java change tracking, check defaults
+		
+		resourceEmbeddable.setChangeTracking(null);
+		javaContextEmbeddable.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertNull(resourceEmbeddable.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertNull(ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEmbeddable.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceEmbeddable.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertNull(ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+		
+		// unset metadataComplete, set xml change tracking to OBJECT, check context
+		
+		ormContextEmbeddable.setSpecifiedMetadataComplete(null);
+		resourceEmbeddable.setChangeTracking(EclipseLinkOrmFactory.eINSTANCE.createXmlChangeTracking());
+		resourceEmbeddable.getChangeTracking().setType(XmlChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+	}
+	
+	public void testModifyChangeTracking() throws Exception  {
+		createTestEmbeddableForChangeTracking();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceEmbeddable.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertNull(ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+		
+		// set context change tracking to ATTRIBUTE, check resource
+		
+		ormContextEmbeddable.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(XmlChangeTrackingType.ATTRIBUTE, resourceEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to OBJECT, check resource
+		
+		ormContextEmbeddable.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to DEFERRED, check resource
+		
+		ormContextEmbeddable.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.DEFERRED);
+		
+		assertEquals(XmlChangeTrackingType.DEFERRED, resourceEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to AUTO, check resource
+		
+		ormContextEmbeddable.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		
+		assertEquals(XmlChangeTrackingType.AUTO, resourceEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to null, check resource
+		
+		ormContextEmbeddable.getChangeTracking().setSpecifiedType(null);
+		
+		assertNull(resourceEmbeddable.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEmbeddable.getChangeTracking().getDefaultType());
+		assertNull(ormContextEmbeddable.getChangeTracking().getSpecifiedType());
+	}
+	
+	public void testUpdateCustomConverters() throws Exception {
+		createTestEmbeddableForCustomConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEmbeddable.getConverterContainer();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceEmbeddable.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlConverter resourceConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceEmbeddable.getConverters().add(resourceConverter);
+		resourceConverter.setClassName("Foo");
+		resourceConverter.setName("myConverter");
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(1, resourceEmbeddable.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlConverter resourceConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceEmbeddable.getConverters().add(0, resourceConverter2);
+		resourceConverter2.setClassName("Foo2");
+		resourceConverter2.setName("myConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(2, resourceEmbeddable.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceEmbeddable.getConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(2, resourceEmbeddable.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEmbeddable.getConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(1, resourceEmbeddable.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEmbeddable.getConverters().remove(resourceConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceEmbeddable.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyCustomConverters() throws Exception {
+		createTestEmbeddableForCustomConverters();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEmbeddable.getConverterContainer();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceEmbeddable.getConverters().size());
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter.setConverterClass("Foo");
+		contextConverter.setName("myConverter");
+		
+		assertEquals(1, resourceEmbeddable.getConverters().size());
+		assertEquals("Foo", resourceEmbeddable.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceEmbeddable.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+	
+		//add another converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter2 = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter2.setConverterClass("Foo2");
+		contextConverter2.setName("myConverter2");
+		
+		assertEquals(2, resourceEmbeddable.getConverters().size());
+		assertEquals("Foo2", resourceEmbeddable.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceEmbeddable.getConverters().get(0).getName());
+		assertEquals("Foo", resourceEmbeddable.getConverters().get(1).getClassName());
+		assertEquals("myConverter", resourceEmbeddable.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+	
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveCustomConverter(0, 1);
+		
+		assertEquals(2, resourceEmbeddable.getConverters().size());
+		assertEquals("Foo", resourceEmbeddable.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceEmbeddable.getConverters().get(0).getName());
+		assertEquals("Foo2", resourceEmbeddable.getConverters().get(1).getClassName());
+		assertEquals("myConverter2", resourceEmbeddable.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(0);
+		
+		assertEquals(1, resourceEmbeddable.getConverters().size());
+		assertEquals("Foo2", resourceEmbeddable.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceEmbeddable.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(contextConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceEmbeddable.getConverters().size());
+	}
+	
+	public void testUpdateTypeConverters() throws Exception {
+		createTestEmbeddableForTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEmbeddable.getConverterContainer();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceEmbeddable.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceEmbeddable.getTypeConverters().add(resourceTypeConverter);
+		resourceTypeConverter.setDataType("Foo");
+		resourceTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, resourceEmbeddable.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceEmbeddable.getTypeConverters().add(0, resourceTypeConverter2);
+		resourceTypeConverter2.setDataType("Foo2");
+		resourceTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, resourceEmbeddable.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceEmbeddable.getTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, resourceEmbeddable.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEmbeddable.getTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, resourceEmbeddable.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEmbeddable.getTypeConverters().remove(resourceTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceEmbeddable.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));	
+	}
+
+	public void testModifyTypeConverters() throws Exception {
+		createTestEmbeddableForTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEmbeddable.getConverterContainer();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceEmbeddable.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter.setDataType("Foo");
+		contextTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, resourceEmbeddable.getTypeConverters().size());
+		assertEquals("Foo", resourceEmbeddable.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceEmbeddable.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter2 = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter2.setDataType("Foo2");
+		contextTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, resourceEmbeddable.getTypeConverters().size());
+		assertEquals("Foo2", resourceEmbeddable.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceEmbeddable.getTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceEmbeddable.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter", resourceEmbeddable.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveTypeConverter(0, 1);
+		
+		assertEquals(2, resourceEmbeddable.getTypeConverters().size());
+		assertEquals("Foo", resourceEmbeddable.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceEmbeddable.getTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceEmbeddable.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter2", resourceEmbeddable.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(0);
+		
+		assertEquals(1, resourceEmbeddable.getTypeConverters().size());
+		assertEquals("Foo2", resourceEmbeddable.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceEmbeddable.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(contextTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceEmbeddable.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateObjectTypeConverters() throws Exception {
+		createTestEmbeddableForObjectTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEmbeddable.getConverterContainer();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceEmbeddable.getObjectTypeConverters().add(resourceObjectTypeConverter);
+		resourceObjectTypeConverter.setDataType("Foo");
+		resourceObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceEmbeddable.getObjectTypeConverters().add(0, resourceObjectTypeConverter2);
+		resourceObjectTypeConverter2.setDataType("Foo2");
+		resourceObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceEmbeddable.getObjectTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEmbeddable.getObjectTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEmbeddable.getObjectTypeConverters().remove(resourceObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyObjectTypeConverters() throws Exception {
+		createTestEmbeddableForObjectTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEmbeddable.getConverterContainer();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter.setDataType("Foo");
+		contextObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceEmbeddable.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceEmbeddable.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter2 = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter2.setDataType("Foo2");
+		contextObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceEmbeddable.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceEmbeddable.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceEmbeddable.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter", resourceEmbeddable.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveObjectTypeConverter(0, 1);
+		
+		assertEquals(2, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceEmbeddable.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceEmbeddable.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceEmbeddable.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceEmbeddable.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(0);
+		
+		assertEquals(1, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceEmbeddable.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceEmbeddable.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(contextObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceEmbeddable.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateStructConverters() throws Exception {
+		createTestEmbeddableForStructConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEmbeddable.getConverterContainer();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceEmbeddable.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceEmbeddable.getStructConverters().add(resourceStructConverter);
+		resourceStructConverter.setConverter("Foo");
+		resourceStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, resourceEmbeddable.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceEmbeddable.getStructConverters().add(0, resourceStructConverter2);
+		resourceStructConverter2.setConverter("Foo2");
+		resourceStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, resourceEmbeddable.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceEmbeddable.getStructConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, resourceEmbeddable.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEmbeddable.getStructConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, resourceEmbeddable.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEmbeddable.getStructConverters().remove(resourceStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceEmbeddable.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyStructConverters() throws Exception {
+		createTestEmbeddableForStructConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEmbeddable ormContextEmbeddable = (OrmEclipseLinkEmbeddable) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEmbeddable.getConverterContainer();
+		XmlEmbeddable resourceEmbeddable = (XmlEmbeddable) getXmlEntityMappings().getEmbeddables().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceEmbeddable.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter.setConverterClass("Foo");
+		contextStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, resourceEmbeddable.getStructConverters().size());
+		assertEquals("Foo", resourceEmbeddable.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceEmbeddable.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter2 = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter2.setConverterClass("Foo2");
+		contextStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, resourceEmbeddable.getStructConverters().size());
+		assertEquals("Foo2", resourceEmbeddable.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceEmbeddable.getStructConverters().get(0).getName());
+		assertEquals("Foo", resourceEmbeddable.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter", resourceEmbeddable.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveStructConverter(0, 1);
+		
+		assertEquals(2, resourceEmbeddable.getStructConverters().size());
+		assertEquals("Foo", resourceEmbeddable.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceEmbeddable.getStructConverters().get(0).getName());
+		assertEquals("Foo2", resourceEmbeddable.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter2", resourceEmbeddable.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(0);
+		
+		assertEquals(1, resourceEmbeddable.getStructConverters().size());
+		assertEquals("Foo2", resourceEmbeddable.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceEmbeddable.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(contextStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceEmbeddable.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmEntityTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmEntityTests.java
new file mode 100644
index 0000000..4e3644c
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmEntityTests.java
@@ -0,0 +1,2394 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCacheCoordinationType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCacheType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCaching;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkExistenceType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTimeOfDay;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkCaching;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkConverterContainer;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTypeConverter;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmEntityTests extends EclipseLinkOrmContextModelTestCase
+{
+
+	
+	public EclipseLinkOrmEntityTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestEntityForReadOnly() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.READ_ONLY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityForCustomizer() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CUSTOMIZER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityForChangeTracking() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CHANGE_TRACKING);
+			}
+			
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityForCaching() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityForConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityForTypeConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityForObjectTypeConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityForStructConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+		});
+	}
+	
+	public void testUpdateReadOnly() throws Exception {
+		createTestEntityForReadOnly();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkEntity javaContextEntity = (JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceEntity.getReadOnly());
+		assertFalse(javaContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to false, check override
+		
+		resourceEntity.setReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceEntity.getReadOnly());
+		assertFalse(javaContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to true, check override
+		
+		resourceEntity.setReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceEntity.getReadOnly());
+		assertFalse(javaContextEntity.getReadOnly().isReadOnly());
+		assertTrue(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+		
+		// clear xml read only, set java read only to true, check defaults
+		
+		resourceEntity.setReadOnly(null);
+		javaContextEntity.getReadOnly().setSpecifiedReadOnly(Boolean.TRUE);
+		
+		assertNull(resourceEntity.getReadOnly());
+		assertTrue(javaContextEntity.getReadOnly().isReadOnly());
+		assertTrue(ormContextEntity.getReadOnly().isReadOnly());
+		assertTrue(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceEntity.getReadOnly());
+		assertTrue(javaContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+		
+		// set xml read only to false, check override
+		
+		resourceEntity.setReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceEntity.getReadOnly());
+		assertTrue(javaContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isReadOnly());
+		assertTrue(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to true, check override
+		
+		resourceEntity.setReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceEntity.getReadOnly());
+		assertTrue(javaContextEntity.getReadOnly().isReadOnly());
+		assertTrue(ormContextEntity.getReadOnly().isReadOnly());
+		assertTrue(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+				
+		// clear xml read only, set java read only to false, check defaults
+		
+		resourceEntity.setReadOnly(null);
+		javaContextEntity.getReadOnly().setSpecifiedReadOnly(Boolean.FALSE);
+		
+		assertNull(resourceEntity.getReadOnly());
+		assertFalse(javaContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+		
+		
+		
+		// set xml read only to false, check override
+		
+		resourceEntity.setReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceEntity.getReadOnly());
+		assertFalse(javaContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to true, check override
+		
+		resourceEntity.setReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceEntity.getReadOnly());
+		assertFalse(javaContextEntity.getReadOnly().isReadOnly());
+		assertTrue(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+	}
+	
+	public void testModifyReadOnly() throws Exception {
+		createTestEntityForReadOnly();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceEntity.getReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+		
+		// set context read only to true, check resource
+		
+		ormContextEntity.getReadOnly().setSpecifiedReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceEntity.getReadOnly());
+		assertTrue(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+		
+		// set context read only to false, check resource
+		
+		ormContextEntity.getReadOnly().setSpecifiedReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceEntity.getReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextEntity.getReadOnly().getSpecifiedReadOnly());
+		
+		// set context read only to null, check resource
+		
+		ormContextEntity.getReadOnly().setSpecifiedReadOnly(null);
+		
+		assertNull(resourceEntity.getReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isReadOnly());
+		assertFalse(ormContextEntity.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextEntity.getReadOnly().getSpecifiedReadOnly());	
+	}
+	
+	
+	public void testUpdateCustomizerClass() throws Exception {
+		createTestEntityForCustomizer();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkEntity javaContextEntity = (JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertNull(resourceEntity.getCustomizer());
+		assertNull(javaContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// set xml customizer, check defaults
+		resourceEntity.setCustomizer(OrmFactory.eINSTANCE.createXmlClassReference());
+		assertNull(resourceEntity.getCustomizer().getClassName());
+		assertNull(javaContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+
+		
+		// set xml customizer class, check override
+		
+		resourceEntity.getCustomizer().setClassName("foo");
+		
+		assertEquals("foo", resourceEntity.getCustomizer().getClassName());
+		assertNull(javaContextEntity.getCustomizer().getCustomizerClass());
+		assertEquals("foo", ormContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// clear xml customizer class, set java customizer class, check defaults
+		
+		resourceEntity.getCustomizer().setClassName(null);
+		javaContextEntity.getCustomizer().setSpecifiedCustomizerClass("bar");
+		
+		assertNull(resourceEntity.getCustomizer().getClassName());
+		assertEquals("bar", javaContextEntity.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextEntity.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceEntity.getCustomizer().getClassName());
+		assertEquals("bar", javaContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+		
+		// set xml customizer class, check override
+		
+		resourceEntity.getCustomizer().setClassName("foo");
+		
+		assertEquals("foo", resourceEntity.getCustomizer().getClassName());
+		assertEquals("bar", javaContextEntity.getCustomizer().getCustomizerClass());
+		assertEquals("foo", ormContextEntity.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+
+		//set xml customizer null
+		javaContextEntity.getCustomizer().setSpecifiedCustomizerClass(null);
+		resourceEntity.setCustomizer(null);
+		assertNull(resourceEntity.getCustomizer());
+		assertNull(javaContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+
+	}
+	
+	public void testModifyCustomizerClass() throws Exception {
+		createTestEntityForCustomizer();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceEntity.getCustomizer());
+		assertNull(ormContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// set context customizer, check resource
+		
+		ormContextEntity.getCustomizer().setSpecifiedCustomizerClass("foo");
+		
+		assertEquals("foo", resourceEntity.getCustomizer().getClassName());
+		assertEquals("foo", ormContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+				
+		// set context customizer to null, check resource
+		
+		ormContextEntity.getCustomizer().setSpecifiedCustomizerClass(null);
+		
+		assertNull(resourceEntity.getCustomizer());
+		assertNull(ormContextEntity.getCustomizer().getCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextEntity.getCustomizer().getSpecifiedCustomizerClass());
+	}
+	
+	public void testUpdateChangeTracking() throws Exception {
+		createTestEntityForChangeTracking();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkEntity javaContextEntity = (JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceEntity.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertNull(ormContextEntity.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to ATTRIBUTE, check context
+		
+		resourceEntity.setChangeTracking(EclipseLinkOrmFactory.eINSTANCE.createXmlChangeTracking());
+		resourceEntity.getChangeTracking().setType(XmlChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(XmlChangeTrackingType.ATTRIBUTE, resourceEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEntity.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to OBJECT, check context
+		
+		resourceEntity.getChangeTracking().setType(XmlChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEntity.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to DEFERRED, check context
+		
+		resourceEntity.getChangeTracking().setType(XmlChangeTrackingType.DEFERRED);
+		
+		assertEquals(XmlChangeTrackingType.DEFERRED, resourceEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextEntity.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to AUTO, check context
+		
+		resourceEntity.getChangeTracking().setType(XmlChangeTrackingType.AUTO);
+		
+		assertEquals(XmlChangeTrackingType.AUTO, resourceEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getSpecifiedType());
+		
+		// clear xml change tracking, set java change tracking, check defaults
+		
+		resourceEntity.setChangeTracking(null);
+		javaContextEntity.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertNull(resourceEntity.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEntity.getChangeTracking().getDefaultType());
+		assertNull(ormContextEntity.getChangeTracking().getSpecifiedType());
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceEntity.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertNull(ormContextEntity.getChangeTracking().getSpecifiedType());
+		
+		// unset metadataComplete, set xml change tracking to OBJECT, check context
+		
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+		resourceEntity.setChangeTracking(EclipseLinkOrmFactory.eINSTANCE.createXmlChangeTracking());
+		resourceEntity.getChangeTracking().setType(XmlChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEntity.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEntity.getChangeTracking().getSpecifiedType());
+	}
+	
+	public void testModifyChangeTracking() throws Exception  {
+		createTestEntityForChangeTracking();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceEntity.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertNull(ormContextEntity.getChangeTracking().getSpecifiedType());
+		
+		// set context change tracking to ATTRIBUTE, check resource
+		
+		ormContextEntity.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(XmlChangeTrackingType.ATTRIBUTE, resourceEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextEntity.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to OBJECT, check resource
+		
+		ormContextEntity.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextEntity.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to DEFERRED, check resource
+		
+		ormContextEntity.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.DEFERRED);
+		
+		assertEquals(XmlChangeTrackingType.DEFERRED, resourceEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextEntity.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to AUTO, check resource
+		
+		ormContextEntity.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		
+		assertEquals(XmlChangeTrackingType.AUTO, resourceEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to null, check resource
+		
+		ormContextEntity.getChangeTracking().setSpecifiedType(null);
+		
+		assertNull(resourceEntity.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextEntity.getChangeTracking().getDefaultType());
+		assertNull(ormContextEntity.getChangeTracking().getSpecifiedType());
+	}
+	
+	public void testUpdateCacheType() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+		
+		// set xml cache, check defaults
+		resourceEntity.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceEntity.getCache().getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+
+		
+		// set xml cache type, check settings
+		resourceEntity.getCache().setType(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.FULL);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.FULL, resourceEntity.getCache().getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getSpecifiedType());
+
+			
+		// set java cache type, check defaults
+		
+		javaContextCaching.setSpecifiedType(EclipseLinkCacheType.WEAK);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.FULL, resourceEntity.getCache().getType());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getSpecifiedType());
+
+		// clear xml cache type, check defaults
+		resourceEntity.getCache().setType(null);
+
+		assertEquals(null, resourceEntity.getCache().getType());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+	
+		
+		// clear xml cache, check defaults
+		resourceEntity.setCache(null);
+
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyCacheType() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+		
+		// set context cache type, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedType(EclipseLinkCacheType.HARD_WEAK);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.HARD_WEAK, resourceEntity.getCache().getType());
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, ormContextCaching.getSpecifiedType());
+				
+		// set context customizer to null, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedType(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+	}
+
+	public void testUpdateCacheCoordinationType() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+		
+		// set xml cache, check defaults
+		resourceEntity.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceEntity.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+
+		
+		// set xml cache type, check settings
+		resourceEntity.getCache().setCoordinationType(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, resourceEntity.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getSpecifiedCoordinationType());
+
+			
+		// set java cache type, check defaults
+		
+		javaContextCaching.setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, resourceEntity.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getSpecifiedCoordinationType());
+
+		// clear xml cache type, check defaults
+		resourceEntity.getCache().setCoordinationType(null);
+
+		assertEquals(null, resourceEntity.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+	
+		
+		// clear xml cache, check defaults
+		resourceEntity.setCache(null);
+
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyCacheCoordinationType() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+		
+		// set context cache coordination type, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, resourceEntity.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getSpecifiedCoordinationType());
+				
+		// set context coordination type to null, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedCoordinationType(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+	}
+
+	
+	public void testUpdateCacheSize() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity xmlEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, xmlEntity.getCache());
+		assertEquals(100, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+		
+		// set xml cache, check defaults
+		xmlEntity.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, xmlEntity.getCache().getSize());
+		assertEquals(100, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+
+		
+		// set xml cache size, check settings
+		xmlEntity.getCache().setSize(new Integer(105));
+		assertEquals(new Integer(105), xmlEntity.getCache().getSize());
+		assertEquals(100, javaContextCaching.getSize());
+		assertEquals(105, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(new Integer(105), ormContextCaching.getSpecifiedSize());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedSize(new Integer(50));
+		
+		assertEquals(new Integer(105), xmlEntity.getCache().getSize());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(105, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(new Integer(105), ormContextCaching.getSpecifiedSize());
+
+		// clear xml cache size, check defaults
+		xmlEntity.getCache().setSize(null);
+
+		assertEquals(null, xmlEntity.getCache().getSize());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+	
+		
+		// clear xml cache, check defaults
+		xmlEntity.setCache(null);
+
+		assertEquals(null, xmlEntity.getCache());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(50, ormContextCaching.getSize());
+		assertEquals(50, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, xmlEntity.getCache());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyCacheSize() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+		
+		// set context cache size, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedSize(new Integer(50));
+		assertEquals(new Integer(50), resourceEntity.getCache().getSize());
+		assertEquals(50, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(new Integer(50), ormContextCaching.getSpecifiedSize());
+				
+		// set context cache size to null, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedSize(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+	}
+
+	public void testUpdateCacheAlwaysRefresh() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+		
+		// set xml cache, check defaults
+		resourceEntity.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceEntity.getCache().getAlwaysRefresh());
+		assertEquals(false, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		
+		// set xml cache always refresh, check settings
+		resourceEntity.getCache().setAlwaysRefresh(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getAlwaysRefresh());
+		assertEquals(false, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+			
+		// set java cache always refresh, check defaults
+		
+		javaContextCaching.setSpecifiedAlwaysRefresh(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getAlwaysRefresh());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		// set xml cache always refresh to false
+		resourceEntity.getCache().setAlwaysRefresh(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceEntity.getCache().getAlwaysRefresh());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		// clear xml cache always refresh, check defaults
+		resourceEntity.getCache().setAlwaysRefresh(null);
+
+		assertEquals(null, resourceEntity.getCache().getAlwaysRefresh());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	
+		
+		// clear xml cache, check defaults
+		resourceEntity.setCache(null);
+
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	}
+	
+	public void testModifyCacheAlwaysRefresh() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+		
+		// set context cache size, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedAlwaysRefresh(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedAlwaysRefresh());
+				
+		// set context cache size to null, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedAlwaysRefresh(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	}
+	
+	public void testUpdateCacheRefreshOnlyIfNewer() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+		
+		// set xml cache, check defaults
+		resourceEntity.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceEntity.getCache().getRefreshOnlyIfNewer());
+		assertEquals(false, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		
+		// set xml cache size, check settings
+		resourceEntity.getCache().setRefreshOnlyIfNewer(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getRefreshOnlyIfNewer());
+		assertEquals(false, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedRefreshOnlyIfNewer(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		// set xml cache always refresh to false
+		resourceEntity.getCache().setRefreshOnlyIfNewer(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceEntity.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		// clear xml cache always refresh, check defaults
+		resourceEntity.getCache().setRefreshOnlyIfNewer(null);
+
+		assertEquals(null, resourceEntity.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	
+		
+		// clear xml cache, check defaults
+		resourceEntity.setCache(null);
+
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	}
+	
+	public void testModifyCacheRefreshOnlyIfNewer() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+		
+		// set context cache size, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedRefreshOnlyIfNewer(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+				
+		// set context cache size to null, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedRefreshOnlyIfNewer(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	}
+	
+	public void testUpdateCacheDisableHits() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+		
+		// set xml cache, check defaults
+		resourceEntity.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceEntity.getCache().getDisableHits());
+		assertEquals(false, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+
+		
+		// set xml cache size, check settings
+		resourceEntity.getCache().setDisableHits(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getDisableHits());
+		assertEquals(false, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedDisableHits());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedDisableHits(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getDisableHits());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedDisableHits());
+
+		// set xml cache always refresh to false
+		resourceEntity.getCache().setDisableHits(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceEntity.getCache().getDisableHits());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedDisableHits());
+
+		// clear xml cache always refresh, check defaults
+		resourceEntity.getCache().setDisableHits(null);
+
+		assertEquals(null, resourceEntity.getCache().getDisableHits());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	
+		
+		// clear xml cache, check defaults
+		resourceEntity.setCache(null);
+
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	}
+	
+	public void testModifyCacheDisableHits() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+		
+		// set context cache size, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedDisableHits(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedDisableHits());
+				
+		// set context cache size to null, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedDisableHits(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	}
+	
+	public void testUpdateCacheShared() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+		
+		// set xml cache, check defaults
+		resourceEntity.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceEntity.getCache().getShared());
+		assertEquals(true, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+
+		
+		// set xml cache size, check settings
+		resourceEntity.getCache().setShared(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceEntity.getCache().getShared());
+		assertEquals(true, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedShared());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedShared(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceEntity.getCache().getShared());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedShared());
+
+		// set xml cache always refresh to false
+		resourceEntity.getCache().setShared(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceEntity.getCache().getShared());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedShared());
+
+		// clear xml cache always refresh, check defaults
+		resourceEntity.getCache().setShared(null);
+
+		assertEquals(null, resourceEntity.getCache().getShared());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	
+		
+		// clear xml cache, check defaults
+		resourceEntity.setCache(null);
+
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	}
+	
+	public void testModifyCacheShared() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+		
+		// set context cache size, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedShared(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceEntity.getCache().getShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedShared());
+				
+		// set context cache size to null, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedShared(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	}
+	public void testSetSpecifiedSharedFalseUnsetsOtherCacheSettings() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		ormContextCaching.setSpecifiedType(EclipseLinkCacheType.HARD_WEAK);
+		ormContextCaching.setSpecifiedSize(Integer.valueOf(500));
+		ormContextCaching.setSpecifiedAlwaysRefresh(Boolean.FALSE);
+		ormContextCaching.setSpecifiedRefreshOnlyIfNewer(Boolean.FALSE);
+		ormContextCaching.setSpecifiedDisableHits(Boolean.FALSE);
+		ormContextCaching.setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS);
+		ormContextCaching.setSpecifiedExistenceType(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE);
+		ormContextCaching.setExpiry(Integer.valueOf(8000));
+		
+		ormContextCaching.setSpecifiedShared(Boolean.FALSE);
+		
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+		assertEquals(null, ormContextCaching.getExpiry());
+		
+		
+		//existence checking is the only thing that isn't unset when shared is set to false
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+		
+		ormContextCaching.setSpecifiedShared(null);
+		EclipseLinkTimeOfDay timeOfDayExpiry = ormContextCaching.addExpiryTimeOfDay();
+		timeOfDayExpiry.setHour(Integer.valueOf(5));
+		
+		ormContextCaching.setSpecifiedShared(Boolean.FALSE);
+		assertNull(ormContextCaching.getExpiryTimeOfDay());		
+		assertEquals(Boolean.FALSE, resourceEntity.getCache().getShared());
+		assertNull(resourceEntity.getCache().getExpiryTimeOfDay());
+	}
+
+	public void testUpdateExistenceChecking() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+		
+		// set xml existence checking, check settings
+		resourceEntity.setExistenceChecking(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE, resourceEntity.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+
+			
+		// set java cache existence checking, check defaults
+		
+		javaContextCaching.setSpecifiedExistenceType(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE, resourceEntity.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+
+		// clear xml existence checking, check defaults
+		resourceEntity.setExistenceChecking(null);
+
+		assertEquals(null, resourceEntity.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceEntity.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyExistenceChecking() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+		
+		// set context cache existence checking, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedExistenceType(EclipseLinkExistenceType.ASSUME_EXISTENCE);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE, resourceEntity.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+				
+		// set context existence checking to null, check resource
+		
+		ormContextEntity.getCaching().setSpecifiedExistenceType(null);
+		
+		assertEquals(null, resourceEntity.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+	}
+	
+	public void testUpdateCacheExpiry() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(null, javaContextCaching.getExpiry());
+		assertEquals(null, ormContextCaching.getExpiry());
+		
+		// set xml cache, check defaults
+		resourceEntity.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceEntity.getCache().getExpiry());
+		assertEquals(null, javaContextCaching.getExpiry());
+		assertEquals(null, ormContextCaching.getExpiry());
+
+		
+		// set xml cache expiry, check settings
+		resourceEntity.getCache().setExpiry(new Integer(45));
+		assertEquals(new Integer(45), resourceEntity.getCache().getExpiry());
+		assertEquals(null, javaContextCaching.getExpiry());
+		assertEquals(new Integer(45), ormContextCaching.getExpiry());
+
+			
+		// set java cache expiry, check defaults
+		
+		javaContextCaching.setExpiry(new Integer(55));
+		
+		assertEquals(new Integer(45), resourceEntity.getCache().getExpiry());
+		assertEquals(new Integer(55), javaContextCaching.getExpiry());
+		assertEquals(new Integer(45), ormContextCaching.getExpiry());
+
+		// clear xml cache expiry to null, check defaults
+		resourceEntity.getCache().setExpiry(null);
+
+		assertEquals(null, resourceEntity.getCache().getExpiry());
+		assertEquals(new Integer(55), javaContextCaching.getExpiry());
+		assertEquals(null, ormContextCaching.getExpiry());
+	
+		
+		// clear xml cache, check defaults
+		resourceEntity.setCache(null);
+
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(new Integer(55), javaContextCaching.getExpiry());
+		assertEquals(null, ormContextCaching.getExpiry());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(new Integer(55), javaContextCaching.getExpiry());
+		assertEquals(null, ormContextCaching.getExpiry());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(new Integer(55), javaContextCaching.getExpiry());
+		assertEquals(null, ormContextCaching.getExpiry());
+	}
+	
+	public void testModifyCacheExpiry() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(null, ormContextCaching.getExpiry());
+		
+		// set context cache expiry, check resource
+		
+		ormContextEntity.getCaching().setExpiry(new Integer(60));
+		assertEquals(new Integer(60), resourceEntity.getCache().getExpiry());
+		assertEquals(new Integer(60), ormContextCaching.getExpiry());
+				
+		// set context cache size to null, check resource
+		
+		ormContextEntity.getCaching().setExpiry(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(null, ormContextCaching.getExpiry());
+	}
+	
+	public void testUpdateCacheExpiryTimeOfDay() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkEntity) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(null, javaContextCaching.getExpiryTimeOfDay());
+		assertEquals(null, ormContextCaching.getExpiryTimeOfDay());
+		
+		// set xml cache, check defaults
+		resourceEntity.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceEntity.getCache().getExpiryTimeOfDay());
+		assertEquals(null, javaContextCaching.getExpiryTimeOfDay());
+		assertEquals(null, ormContextCaching.getExpiryTimeOfDay());
+
+		
+		// set xml cache expiry, check settings
+		resourceEntity.getCache().setExpiryTimeOfDay(EclipseLinkOrmFactory.eINSTANCE.createXmlTimeOfDay());
+		resourceEntity.getCache().getExpiryTimeOfDay().setHour(new Integer(10));
+		assertEquals(new Integer(10), resourceEntity.getCache().getExpiryTimeOfDay().getHour());
+		assertEquals(null, javaContextCaching.getExpiryTimeOfDay());
+		assertEquals(new Integer(10), ormContextCaching.getExpiryTimeOfDay().getHour());
+
+			
+		// set java cache expiry, check defaults
+		
+		javaContextCaching.addExpiryTimeOfDay();
+		javaContextCaching.getExpiryTimeOfDay().setHour(new Integer(12));
+		
+		assertEquals(new Integer(10), resourceEntity.getCache().getExpiryTimeOfDay().getHour());
+		assertEquals(new Integer(12), javaContextCaching.getExpiryTimeOfDay().getHour());
+		assertEquals(new Integer(10), ormContextCaching.getExpiryTimeOfDay().getHour());
+
+		// clear xml cache expiry to null, check defaults
+		resourceEntity.getCache().setExpiryTimeOfDay(null);
+
+		assertEquals(null, resourceEntity.getCache().getExpiryTimeOfDay());
+		assertEquals(new Integer(12), javaContextCaching.getExpiryTimeOfDay().getHour());
+		assertEquals(null, ormContextCaching.getExpiryTimeOfDay());
+	
+		
+		// clear xml cache, check defaults
+		resourceEntity.setCache(null);
+
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(new Integer(12), javaContextCaching.getExpiryTimeOfDay().getHour());
+		assertEquals(null, ormContextCaching.getExpiryTimeOfDay());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextEntity.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(new Integer(12), javaContextCaching.getExpiryTimeOfDay().getHour());
+		assertEquals(null, ormContextCaching.getExpiryTimeOfDay());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextEntity.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(new Integer(12), javaContextCaching.getExpiryTimeOfDay().getHour());
+		assertEquals(null, ormContextCaching.getExpiryTimeOfDay());
+	}
+	
+	public void testModifyCacheExpiryTimeOfDay() throws Exception {
+		createTestEntityForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextEntity.getCaching();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(null, ormContextCaching.getExpiryTimeOfDay());
+		
+		// set context cache expiry, check resource
+		
+		ormContextEntity.getCaching().addExpiryTimeOfDay().setHour(new Integer(12));
+		assertEquals(new Integer(12), resourceEntity.getCache().getExpiryTimeOfDay().getHour());
+		assertEquals(new Integer(12), ormContextCaching.getExpiryTimeOfDay().getHour());
+				
+		// set context expiry time of day minute, check resource
+		
+		ormContextEntity.getCaching().getExpiryTimeOfDay().setMinute(new Integer(35));
+		
+		assertEquals(new Integer(12), resourceEntity.getCache().getExpiryTimeOfDay().getHour());
+		assertEquals(new Integer(12), ormContextCaching.getExpiryTimeOfDay().getHour());
+		assertEquals(new Integer(35), resourceEntity.getCache().getExpiryTimeOfDay().getMinute());
+		assertEquals(new Integer(35), ormContextCaching.getExpiryTimeOfDay().getMinute());
+		
+		// set context expiry time of day null, check resource
+		
+		ormContextEntity.getCaching().removeExpiryTimeOfDay();
+		assertEquals(null, resourceEntity.getCache());
+		assertEquals(null, ormContextCaching.getExpiryTimeOfDay());
+	}
+
+	public void testUpdateCustomConverters() throws Exception {
+		createTestEntityForConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEntity.getConverterContainer();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceEntity.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlConverter resourceConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceEntity.getConverters().add(resourceConverter);
+		resourceConverter.setClassName("Foo");
+		resourceConverter.setName("myConverter");
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(1, resourceEntity.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlConverter resourceConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceEntity.getConverters().add(0, resourceConverter2);
+		resourceConverter2.setClassName("Foo2");
+		resourceConverter2.setName("myConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(2, resourceEntity.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceEntity.getConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(2, resourceEntity.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEntity.getConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(1, resourceEntity.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEntity.getConverters().remove(resourceConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceEntity.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyCustomConverters() throws Exception {
+		createTestEntityForConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEntity.getConverterContainer();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceEntity.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter.setConverterClass("Foo");
+		contextConverter.setName("myConverter");
+		
+		assertEquals(1, resourceEntity.getConverters().size());
+		assertEquals("Foo", resourceEntity.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceEntity.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter2 = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter2.setConverterClass("Foo2");
+		contextConverter2.setName("myConverter2");
+		
+		assertEquals(2, resourceEntity.getConverters().size());
+		assertEquals("Foo2", resourceEntity.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceEntity.getConverters().get(0).getName());
+		assertEquals("Foo", resourceEntity.getConverters().get(1).getClassName());
+		assertEquals("myConverter", resourceEntity.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveCustomConverter(0, 1);
+		
+		assertEquals(2, resourceEntity.getConverters().size());
+		assertEquals("Foo", resourceEntity.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceEntity.getConverters().get(0).getName());
+		assertEquals("Foo2", resourceEntity.getConverters().get(1).getClassName());
+		assertEquals("myConverter2", resourceEntity.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(0);
+		
+		assertEquals(1, resourceEntity.getConverters().size());
+		assertEquals("Foo2", resourceEntity.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceEntity.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(contextConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceEntity.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateTypeConverters() throws Exception {
+		createTestEntityForTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEntity.getConverterContainer();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceEntity.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceEntity.getTypeConverters().add(resourceTypeConverter);
+		resourceTypeConverter.setDataType("Foo");
+		resourceTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, resourceEntity.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceEntity.getTypeConverters().add(0, resourceTypeConverter2);
+		resourceTypeConverter2.setDataType("Foo2");
+		resourceTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, resourceEntity.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceEntity.getTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, resourceEntity.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEntity.getTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, resourceEntity.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEntity.getTypeConverters().remove(resourceTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceEntity.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyTypeConverters() throws Exception {
+		createTestEntityForTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEntity.getConverterContainer();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceEntity.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter.setDataType("Foo");
+		contextTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, resourceEntity.getTypeConverters().size());
+		assertEquals("Foo", resourceEntity.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceEntity.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter2 = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter2.setDataType("Foo2");
+		contextTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, resourceEntity.getTypeConverters().size());
+		assertEquals("Foo2", resourceEntity.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceEntity.getTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceEntity.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter", resourceEntity.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveTypeConverter(0, 1);
+		
+		assertEquals(2, resourceEntity.getTypeConverters().size());
+		assertEquals("Foo", resourceEntity.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceEntity.getTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceEntity.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter2", resourceEntity.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(0);
+		
+		assertEquals(1, resourceEntity.getTypeConverters().size());
+		assertEquals("Foo2", resourceEntity.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceEntity.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(contextTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceEntity.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateObjectTypeConverters() throws Exception {
+		createTestEntityForObjectTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEntity.getConverterContainer();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceEntity.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceEntity.getObjectTypeConverters().add(resourceObjectTypeConverter);
+		resourceObjectTypeConverter.setDataType("Foo");
+		resourceObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceEntity.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceEntity.getObjectTypeConverters().add(0, resourceObjectTypeConverter2);
+		resourceObjectTypeConverter2.setDataType("Foo2");
+		resourceObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceEntity.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceEntity.getObjectTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceEntity.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEntity.getObjectTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceEntity.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEntity.getObjectTypeConverters().remove(resourceObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceEntity.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyObjectTypeConverters() throws Exception {
+		createTestEntityForObjectTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEntity.getConverterContainer();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceEntity.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter.setDataType("Foo");
+		contextObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, resourceEntity.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceEntity.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceEntity.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter2 = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter2.setDataType("Foo2");
+		contextObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, resourceEntity.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceEntity.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceEntity.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceEntity.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter", resourceEntity.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveObjectTypeConverter(0, 1);
+		
+		assertEquals(2, resourceEntity.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceEntity.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceEntity.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceEntity.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceEntity.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(0);
+		
+		assertEquals(1, resourceEntity.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceEntity.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceEntity.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(contextObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceEntity.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateStructConverters() throws Exception {
+		createTestEntityForStructConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEntity.getConverterContainer();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceEntity.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceEntity.getStructConverters().add(resourceStructConverter);
+		resourceStructConverter.setConverter("Foo");
+		resourceStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, resourceEntity.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceEntity.getStructConverters().add(0, resourceStructConverter2);
+		resourceStructConverter2.setConverter("Foo2");
+		resourceStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, resourceEntity.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceEntity.getStructConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, resourceEntity.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEntity.getStructConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, resourceEntity.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceEntity.getStructConverters().remove(resourceStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceEntity.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyStructConverters() throws Exception {
+		createTestEntityForStructConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkEntity ormContextEntity = (OrmEclipseLinkEntity) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextEntity.getConverterContainer();
+		XmlEntity resourceEntity = (XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceEntity.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter.setConverterClass("Foo");
+		contextStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, resourceEntity.getStructConverters().size());
+		assertEquals("Foo", resourceEntity.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceEntity.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter2 = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter2.setConverterClass("Foo2");
+		contextStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, resourceEntity.getStructConverters().size());
+		assertEquals("Foo2", resourceEntity.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceEntity.getStructConverters().get(0).getName());
+		assertEquals("Foo", resourceEntity.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter", resourceEntity.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveStructConverter(0, 1);
+		
+		assertEquals(2, resourceEntity.getStructConverters().size());
+		assertEquals("Foo", resourceEntity.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceEntity.getStructConverters().get(0).getName());
+		assertEquals("Foo2", resourceEntity.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter2", resourceEntity.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(0);
+		
+		assertEquals(1, resourceEntity.getStructConverters().size());
+		assertEquals("Foo2", resourceEntity.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceEntity.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(contextStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceEntity.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));	
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmIdMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmIdMappingTests.java
new file mode 100644
index 0000000..f239980
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmIdMappingTests.java
@@ -0,0 +1,389 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaIdMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmIdMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkBasicMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkIdMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkIdMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlId;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmIdMappingTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmIdMappingTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestEntityWithIdMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Id").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithMutableIdDate() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, EclipseLink.MUTABLE, "java.util.Date");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Id").append(CR);
+				sb.append("    @Mutable").append(CR);
+				sb.append("    private Date myDate;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+
+	public void testUpdateMutable() throws Exception {
+		createTestEntityWithIdMapping();
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmEclipseLinkIdMapping contextId = 
+			(OrmEclipseLinkIdMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlId resourceId = 
+			(XmlId) resourceEntity.getAttributes().getIds().get(0);
+		EclipseLinkIdMapping javaIdMapping = (EclipseLinkIdMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		// check defaults
+		
+		assertNull(resourceId.getMutable());
+		assertTrue(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertTrue(contextId.getMutable().isMutable());
+		
+		// set xml mutable to false, check context
+		
+		resourceId.setMutable(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceId.getMutable());
+		assertTrue(contextId.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+		
+		// set xml mutable to true, check context
+		
+		resourceId.setMutable(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceId.getMutable());
+		assertTrue(contextId.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, contextId.getMutable().getSpecifiedMutable());
+		assertTrue(contextId.getMutable().isMutable());
+		
+		// clear xml mutable, check context
+		
+		resourceId.setMutable(null);
+		
+		assertNull(resourceId.getMutable());
+		assertTrue(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertTrue(contextId.getMutable().isMutable());
+		
+		// TODO - test defaults for java serializable and date/time types, 
+		// with and without persistence property
+		
+		// set mutable on java basic mapping
+		
+		javaIdMapping.getMutable().setSpecifiedMutable(Boolean.FALSE);
+		assertNull(resourceId.getMutable());
+		assertTrue(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertTrue(contextId.getMutable().isMutable());
+		assertFalse(javaIdMapping.getMutable().isMutable());
+		
+		// remove attribute from xml, test default mutable from java
+		
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		EclipseLinkIdMapping virtualIdMapping = (EclipseLinkIdMapping) ormPersistentAttribute2.getMapping();
+		
+		assertNull(resourceId.getMutable());
+		assertTrue(virtualIdMapping.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, virtualIdMapping.getMutable().getSpecifiedMutable());
+		assertFalse(virtualIdMapping.getMutable().isMutable());
+		assertFalse(javaIdMapping.getMutable().isMutable());
+		
+		// set metadata complete
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		EclipseLinkBasicMapping virtualBasicMapping = (EclipseLinkBasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(resourceId.getMutable());
+		assertTrue(virtualBasicMapping.getMutable().isDefaultMutable());
+		assertNull(virtualBasicMapping.getMutable().getSpecifiedMutable());
+		assertTrue(virtualBasicMapping.getMutable().isMutable());
+		assertFalse(javaIdMapping.getMutable().isMutable());
+	}
+	
+	public void testUpdateMutableDate() throws Exception {
+		createTestEntityWithMutableIdDate();
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, "myDate");
+		OrmEclipseLinkIdMapping contextId = 
+			(OrmEclipseLinkIdMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlId resourceId = 
+			(XmlId) resourceEntity.getAttributes().getIds().get(0);
+		EclipseLinkIdMapping javaIdMapping = (EclipseLinkIdMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("myDate").getMapping();
+		
+		// check defaults
+		
+		assertNull(resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+		
+		// set xml mutable to false, check context
+		
+		resourceId.setMutable(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+		
+		// set xml mutable to true, check context
+		
+		resourceId.setMutable(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, contextId.getMutable().getSpecifiedMutable());
+		assertTrue(contextId.getMutable().isMutable());
+		
+		// clear xml mutable, check context
+		
+		resourceId.setMutable(null);
+		
+		assertNull(resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+		
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(Boolean.TRUE);
+		assertNull(resourceId.getMutable());
+		assertTrue(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertTrue(contextId.getMutable().isMutable());
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(Boolean.FALSE);
+		assertNull(resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(null);
+		assertNull(resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+		
+		// set mutable on java id mapping
+		
+		javaIdMapping.getMutable().setSpecifiedMutable(Boolean.TRUE);
+		assertNull(resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+		assertTrue(javaIdMapping.getMutable().isMutable());
+		
+		// remove attribute from xml, test default mutable from java
+		
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("myDate");
+		EclipseLinkIdMapping virtualIdMapping = (EclipseLinkIdMapping) ormPersistentAttribute2.getMapping();
+		
+		assertNull(resourceId.getMutable());
+		assertFalse(virtualIdMapping.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, virtualIdMapping.getMutable().getSpecifiedMutable());
+		assertTrue(virtualIdMapping.getMutable().isMutable());
+		assertTrue(javaIdMapping.getMutable().isMutable());
+		
+		// set metadata complete
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("myDate");
+		EclipseLinkBasicMapping virtualBasicMapping = (EclipseLinkBasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(resourceId.getMutable());
+		assertFalse(virtualBasicMapping.getMutable().isDefaultMutable());
+		assertNull(virtualBasicMapping.getMutable().getSpecifiedMutable());
+		assertFalse(virtualBasicMapping.getMutable().isMutable());
+		assertTrue(javaIdMapping.getMutable().isMutable());
+	}
+
+	public void testModifyMutable() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, "basic");
+		OrmEclipseLinkIdMapping contextId = 
+			(OrmEclipseLinkIdMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlId resourceId = 
+			(XmlId) resourceEntity.getAttributes().getIds().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+		
+		// set context mutable to true, check resource
+		
+		contextId.getMutable().setSpecifiedMutable(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, contextId.getMutable().getSpecifiedMutable());
+		assertTrue(contextId.getMutable().isMutable());
+		
+		// set context mutable to false, check resource
+		
+		contextId.getMutable().setSpecifiedMutable(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+		
+		// set context read only to null, check resource
+		
+		contextId.getMutable().setSpecifiedMutable(null);
+		
+		assertNull(resourceId.getMutable());
+		assertFalse(contextId.getMutable().isDefaultMutable());
+		assertNull(contextId.getMutable().getSpecifiedMutable());
+		assertFalse(contextId.getMutable().isMutable());
+	}
+	
+	public void testUpdateConvert() throws Exception {
+		createTestEntityWithIdMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmIdMapping ormIdMapping = (OrmIdMapping) ormPersistentAttribute.getMapping();
+		XmlId basicResource = (XmlId) getXmlEntityMappings().getEntities().get(0).getAttributes().getIds().get(0);
+		JavaIdMapping javaIdMapping = (JavaIdMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertNull(ormIdMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+				
+		//set lob in the resource model, verify context model updated
+		basicResource.setConvert("myConvert");
+		assertEquals(EclipseLinkConvert.class, ormIdMapping.getConverter().getType());
+		assertEquals("myConvert", basicResource.getConvert());
+
+		//set lob to null in the resource model
+		basicResource.setConvert(null);
+		assertNull(ormIdMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+		
+		
+		javaIdMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) javaIdMapping.getConverter()).setSpecifiedConverterName("foo");
+		
+		assertNull(ormIdMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+		assertEquals("foo", ((EclipseLinkConvert) javaIdMapping.getConverter()).getSpecifiedConverterName());
+		
+		
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		IdMapping virtualIdMapping = (IdMapping) ormPersistentAttribute2.getMapping();
+		
+		assertEquals(EclipseLinkConvert.class, virtualIdMapping.getConverter().getType());
+		assertEquals("foo", ((EclipseLinkConvert) virtualIdMapping.getConverter()).getSpecifiedConverterName());
+		assertEquals(null, basicResource.getConvert());
+		assertEquals("foo", ((EclipseLinkConvert) javaIdMapping.getConverter()).getSpecifiedConverterName());
+		
+		((EclipseLinkConvert) javaIdMapping.getConverter()).setSpecifiedConverterName("bar");
+		assertEquals(EclipseLinkConvert.class, virtualIdMapping.getConverter().getType());
+		assertEquals("bar", ((EclipseLinkConvert) virtualIdMapping.getConverter()).getSpecifiedConverterName());
+		assertEquals(null, basicResource.getConvert());
+		assertEquals("bar", ((EclipseLinkConvert) javaIdMapping.getConverter()).getSpecifiedConverterName());
+
+		javaIdMapping.setConverter(null);
+		assertNull(virtualIdMapping.getConverter().getType());
+		assertNull(basicResource.getConvert());
+		assertNull(javaIdMapping.getConverter().getType());
+	}
+	
+	public void testModifyConvert() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmIdMapping ormIdMapping = (OrmIdMapping) ormPersistentAttribute.getMapping();
+		XmlId basicResource = (XmlId) getXmlEntityMappings().getEntities().get(0).getAttributes().getIds().get(0);
+	
+		assertNull(ormIdMapping.getConverter().getType());
+		assertNull(basicResource.getConvert());
+				
+		//set lob in the context model, verify resource model updated
+		ormIdMapping.setConverter(EclipseLinkConvert.class);
+		assertEquals("", basicResource.getConvert());
+		assertEquals(EclipseLinkConvert.class, ormIdMapping.getConverter().getType());
+	
+		((EclipseLinkConvert) ormIdMapping.getConverter()).setSpecifiedConverterName("bar");
+		assertEquals("bar", basicResource.getConvert());
+		assertEquals(EclipseLinkConvert.class, ormIdMapping.getConverter().getType());
+		assertEquals("bar", ((EclipseLinkConvert) ormIdMapping.getConverter()).getSpecifiedConverterName());
+
+		((EclipseLinkConvert) ormIdMapping.getConverter()).setSpecifiedConverterName(null);
+
+		assertNull(ormIdMapping.getConverter().getType());
+		assertNull(basicResource.getConvert());
+
+		//set lob to false in the context model
+		ormIdMapping.setConverter(null);
+		assertNull(ormIdMapping.getConverter().getType());
+		assertNull(basicResource.getConvert());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmManyToManyMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmManyToManyMappingTests.java
new file mode 100644
index 0000000..5e7e168
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmManyToManyMappingTests.java
@@ -0,0 +1,383 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.Cascade;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.JoinTable;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkOneToManyMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkRelationshipMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkManyToManyMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlManyToMany;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmManyToManyMappingTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmManyToManyMappingTests(String name) {
+		super(name);
+	}
+	
+	private void createTestDepartment() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ").append(JPA.ENTITY).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.ID).append(";");
+					sb.append(CR);
+					sb.append("import java.util.Collection;");
+					sb.append(CR);
+					sb.append("import ").append(JPA.MANY_TO_MANY).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.JOIN_TABLE).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.JOIN_COLUMN).append(";");
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Department").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);
+				sb.append("    @JoinTable(name=\"DEP_EMP\", joinColumns=@JoinColumn(name=\"DEPT_ID\"), inverseJoinColumns=@JoinColumn(name=\"EMP_ID\"))").append(CR);
+				sb.append("    private Collection<Employee> employees;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Department.java", sourceWriter);
+	}
+
+	private void createTestEmployee() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ").append(JPA.ENTITY).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.ID).append(";");
+					sb.append(CR);
+			sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Employee").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int empId;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Employee.java", sourceWriter);
+	}	
+
+	private ICompilationUnit createTestEntityManyToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, JPA.FETCH_TYPE, JPA.CASCADE_TYPE, JPA.ORDER_BY, EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToMany(fetch=FetchType.EAGER, targetEntity=Address.class, cascade={CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH})");
+				sb.append(CR);
+				sb.append("    @OrderBy(\"city\"");
+				sb.append(CR);
+				sb.append("    @JoinFetch(JoinFetchType.INNER)");
+				sb.append(CR);
+				sb.append("    private java.util.Collection<Address> address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}
+
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+				sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+			}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	public void testUpdateJoinFetch() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "manyToMany");
+		EclipseLinkRelationshipMapping contextManyToMany = 
+			(EclipseLinkRelationshipMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		XmlManyToMany resourceManyToMany = 
+			(XmlManyToMany) resourceEntity.getAttributes().getManyToManys().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceManyToMany.getJoinFetch());
+		assertNull(contextManyToMany.getJoinFetch().getValue());
+		
+		// set xml join fetch to INNER, check context
+		
+		resourceManyToMany.setJoinFetch(XmlJoinFetchType.INNER);
+		
+		assertEquals(XmlJoinFetchType.INNER, resourceManyToMany.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextManyToMany.getJoinFetch().getValue());
+		
+		// set xml join fetch to OUTER, check context
+		
+		resourceManyToMany.setJoinFetch(XmlJoinFetchType.OUTER);
+		
+		assertEquals(XmlJoinFetchType.OUTER, resourceManyToMany.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextManyToMany.getJoinFetch().getValue());
+		
+		// set xml join fetch to null, check context
+		
+		resourceManyToMany.setJoinFetch(null);
+		
+		assertNull(resourceManyToMany.getJoinFetch());
+		assertNull(contextManyToMany.getJoinFetch().getValue());
+	}
+	
+	public void testModifyJoinFetch() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "manyToMany");
+		EclipseLinkRelationshipMapping contextManyToMany = 
+			(EclipseLinkRelationshipMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlManyToMany resourceManyToMany = 
+			(XmlManyToMany) resourceEntity.getAttributes().getManyToManys().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceManyToMany.getJoinFetch());
+		assertNull(contextManyToMany.getJoinFetch().getValue());
+		
+		// set context join fetch to INNER, check resource
+		
+		contextManyToMany.getJoinFetch().setValue(EclipseLinkJoinFetchType.INNER);
+		
+		assertEquals(XmlJoinFetchType.INNER, resourceManyToMany.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextManyToMany.getJoinFetch().getValue());
+		
+		// set context join fetch to OUTER, check resource
+		
+		contextManyToMany.getJoinFetch().setValue(EclipseLinkJoinFetchType.OUTER);
+		
+		assertEquals(XmlJoinFetchType.OUTER, resourceManyToMany.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextManyToMany.getJoinFetch().getValue());
+		
+		// set context join fetch to null, check resource
+		
+		contextManyToMany.getJoinFetch().setValue(null);
+		
+		assertNull(resourceManyToMany.getJoinFetch());
+		assertNull(contextManyToMany.getJoinFetch().getValue());
+	}
+	
+	public void testJoinFetchDefault() throws Exception {
+		createTestEmployee();
+		createTestDepartment();
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Department");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Employee");
+		
+		OrmPersistentType departmentPersistentType = getEntityMappings().getPersistentTypes().iterator().next();
+		EclipseLinkRelationshipMapping manyToMany = (EclipseLinkRelationshipMapping) departmentPersistentType.getAttributeNamed("employees").getMapping();
+
+		assertNull(manyToMany.getJoinFetch().getValue());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		EclipseLinkOneToManyMapping oneToMany = (EclipseLinkOneToManyMapping) departmentPersistentType.getAttributeNamed("employees").getMapping();
+		assertNull(oneToMany.getJoinFetch().getValue());
+		
+		
+		EclipseLinkRelationshipMapping javaRelationshipMapping = (EclipseLinkRelationshipMapping) departmentPersistentType.getJavaPersistentType().getAttributeNamed("employees").getMapping();
+		javaRelationshipMapping.getJoinFetch().setValue(EclipseLinkJoinFetchType.OUTER);
+		assertNull(oneToMany.getJoinFetch().getValue());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(false);
+		manyToMany = (EclipseLinkRelationshipMapping) departmentPersistentType.getAttributeNamed("employees").getMapping();
+		assertEquals(EclipseLinkJoinFetchType.OUTER, manyToMany.getJoinFetch().getValue());
+	}
+	
+	public void testDefaultJoinTable() throws Exception {
+		createTestEmployee();
+		createTestDepartment();
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Department");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Employee");
+		
+		OrmPersistentType departmentPersistentType = getEntityMappings().getPersistentTypes().iterator().next();
+		OrmReadOnlyPersistentAttribute attribute = departmentPersistentType.getAttributeNamed("employees");
+		ManyToManyMapping manyToMany = (ManyToManyMapping) attribute.getMapping();
+		
+		assertEquals(true, attribute.isVirtual());
+		JoinTable ormJoinTable = manyToMany.getRelationship().getJoinTableStrategy().getJoinTable();
+		assertEquals("DEP_EMP", ormJoinTable.getName());
+		assertEquals("DEPT_ID", ormJoinTable.specifiedJoinColumns().next().getName());
+		assertEquals("id", ormJoinTable.specifiedJoinColumns().next().getReferencedColumnName());
+		assertEquals("EMP_ID", ormJoinTable.specifiedInverseJoinColumns().next().getName());
+		assertEquals("empId", ormJoinTable.specifiedInverseJoinColumns().next().getReferencedColumnName());
+
+		//set metadata-complete and verify JoinTable info is not taken from the java
+		departmentPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		departmentPersistentType.addSpecifiedAttribute(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, "id");
+		attribute = departmentPersistentType.getAttributeNamed("employees");
+		OneToManyMapping oneToMany = (OneToManyMapping) attribute.getMapping();
+		
+		assertEquals(true, attribute.isVirtual());
+		ormJoinTable = oneToMany.getRelationship().getJoinTableStrategy().getJoinTable();
+		assertEquals("Department_Employee", ormJoinTable.getName());
+		assertEquals("Department_id", ormJoinTable.getDefaultJoinColumn().getName());
+		assertEquals("id", ormJoinTable.getDefaultJoinColumn().getReferencedColumnName());
+		assertEquals("employees_empId", ormJoinTable.getDefaultInverseJoinColumn().getName());
+		assertEquals("empId", ormJoinTable.getDefaultInverseJoinColumn().getReferencedColumnName());
+		
+		//set metadata-complete to false, add mapping to orm.xml verify JoinTable info is not taken from the java
+		departmentPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.FALSE);
+		attribute = departmentPersistentType.getAttributeNamed("employees");
+		manyToMany = (ManyToManyMapping) attribute.getMapping();
+		assertEquals(true, attribute.isVirtual());
+		ormJoinTable = manyToMany.getRelationship().getJoinTableStrategy().getJoinTable();
+		assertEquals("DEP_EMP", ormJoinTable.getName());
+		assertEquals("DEPT_ID", ormJoinTable.specifiedJoinColumns().next().getName());
+		assertEquals("id", ormJoinTable.specifiedJoinColumns().next().getReferencedColumnName());
+		assertEquals("EMP_ID", ormJoinTable.specifiedInverseJoinColumns().next().getName());
+		assertEquals("empId", ormJoinTable.specifiedInverseJoinColumns().next().getReferencedColumnName());
+
+		
+		departmentPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "employees");
+		attribute = departmentPersistentType.getAttributeNamed("employees");
+		manyToMany = (ManyToManyMapping) attribute.getMapping();
+		assertEquals(false, attribute.isVirtual());
+		ormJoinTable = manyToMany.getRelationship().getJoinTableStrategy().getJoinTable();
+		assertEquals("Department_Employee", ormJoinTable.getName());
+		assertEquals(0, ormJoinTable.specifiedJoinColumnsSize());
+		assertEquals("Department_id", ormJoinTable.getDefaultJoinColumn().getName());
+		assertEquals("id", ormJoinTable.getDefaultJoinColumn().getReferencedColumnName());
+		assertEquals(0, ormJoinTable.specifiedInverseJoinColumnsSize());
+		assertEquals("employees_empId", ormJoinTable.getDefaultInverseJoinColumn().getName());
+		assertEquals("empId", ormJoinTable.getDefaultInverseJoinColumn().getReferencedColumnName());
+	}
+
+	public void testVirtualMappingMetadataCompleteFalse() throws Exception {
+		createTestEntityManyToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.virtualAttributes().next();
+
+		ManyToManyMapping virtualManyToManyMapping = (ManyToManyMapping) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualManyToManyMapping.getName());
+		assertEquals(FetchType.EAGER, virtualManyToManyMapping.getSpecifiedFetch());
+		assertEquals("Address", virtualManyToManyMapping.getSpecifiedTargetEntity());
+		assertNull(virtualManyToManyMapping.getRelationship().
+			getMappedByStrategy().getMappedByAttribute());
+
+		Cascade cascade = virtualManyToManyMapping.getCascade();
+		assertTrue(cascade.isAll());
+		assertTrue(cascade.isMerge());
+		assertTrue(cascade.isPersist());
+		assertTrue(cascade.isRemove());
+		assertTrue(cascade.isRefresh());
+
+		assertTrue(virtualManyToManyMapping.getOrderable().isCustomOrdering());
+		assertEquals("city", virtualManyToManyMapping.getOrderable().getSpecifiedOrderBy());
+
+		assertEquals(EclipseLinkJoinFetchType.INNER, ((EclipseLinkJoinFetchMapping) virtualManyToManyMapping).getJoinFetch().getValue());
+	}
+
+	public void testVirtualMappingMetadataCompleteTrue() throws Exception {
+		createTestEntityManyToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, virtualPersistentAttribute.getMappingKey());
+		assertTrue(virtualPersistentAttribute.isVirtual());
+
+		OrmPersistentAttribute ormPersistentAttribute = virtualPersistentAttribute.convertToSpecified(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY);
+
+		OrmEclipseLinkManyToManyMapping ormManyToManyMapping = (OrmEclipseLinkManyToManyMapping) ormPersistentAttribute.getMapping();	
+		assertEquals("address", ormManyToManyMapping.getName());
+		assertEquals(FetchType.LAZY, ormManyToManyMapping.getFetch());
+		assertEquals("test.Address", ormManyToManyMapping.getTargetEntity());
+		assertNull(ormManyToManyMapping.getRelationship().getMappedByStrategy().getMappedByAttribute());
+
+		Cascade cascade = ormManyToManyMapping.getCascade();
+		assertFalse(cascade.isAll());
+		assertFalse(cascade.isMerge());
+		assertFalse(cascade.isPersist());
+		assertFalse(cascade.isRemove());
+		assertFalse(cascade.isRefresh());
+
+		assertTrue(ormManyToManyMapping.getOrderable().isNoOrdering());
+		assertEquals(null, ormManyToManyMapping.getOrderable().getSpecifiedOrderBy());
+
+		assertEquals(null, ormManyToManyMapping.getJoinFetch().getValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmManyToOneMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmManyToOneMappingTests.java
new file mode 100644
index 0000000..97930e6
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmManyToOneMappingTests.java
@@ -0,0 +1,321 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.Cascade;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.ManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkOneToOneMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkRelationshipMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkManyToOneMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlManyToOne;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmManyToOneMappingTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmManyToOneMappingTests(String name) {
+		super(name);
+	}
+	
+	private void createTestDepartment() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ").append(JPA.ENTITY).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.ID).append(";");
+					sb.append(CR);
+					sb.append(CR);
+					sb.append("import ").append(JPA.MANY_TO_ONE).append(";");
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Department").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToOne").append(CR);
+				sb.append("    private Employee employee;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Department.java", sourceWriter);
+	}
+
+	private void createTestEmployee() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ").append(JPA.ENTITY).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.ID).append(";");
+					sb.append(CR);
+			sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Employee").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int empId;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Employee.java", sourceWriter);
+	}
+
+	private ICompilationUnit createTestEntityManyToOneMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE, JPA.JOIN_COLUMN, JPA.FETCH_TYPE, JPA.CASCADE_TYPE, EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToOne(fetch=FetchType.LAZY, optional=false, targetEntity=Address.class, cascade={CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH})");
+				sb.append(CR);
+				sb.append("    @JoinColumn(name=\"MY_COLUMN\", referencedColumnName=\"MY_REFERENCED_COLUMN\", unique=true, nullable=false, insertable=false, updatable=false, columnDefinition=\"COLUMN_DEFINITION\", table=\"MY_TABLE\")");
+				sb.append(CR);
+				sb.append("    @JoinFetch(JoinFetchType.INNER)");
+				sb.append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}	
+	
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+				sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    private String state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+			}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	public void testUpdateJoinFetch() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY, "manyToOne");
+		EclipseLinkRelationshipMapping contextManyToOne = 
+			(EclipseLinkRelationshipMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		XmlManyToOne resourceManyToOne = 
+			(XmlManyToOne) resourceEntity.getAttributes().getManyToOnes().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceManyToOne.getJoinFetch());
+		assertNull(contextManyToOne.getJoinFetch().getValue());
+		
+		// set xml join fetch to INNER, check context
+		
+		resourceManyToOne.setJoinFetch(XmlJoinFetchType.INNER);
+		
+		assertEquals(XmlJoinFetchType.INNER, resourceManyToOne.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextManyToOne.getJoinFetch().getValue());
+		
+		// set xml join fetch to OUTER, check context
+		
+		resourceManyToOne.setJoinFetch(XmlJoinFetchType.OUTER);
+		
+		assertEquals(XmlJoinFetchType.OUTER, resourceManyToOne.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextManyToOne.getJoinFetch().getValue());
+		
+		// set xml join fetch to null, check context
+		
+		resourceManyToOne.setJoinFetch(null);
+		
+		assertNull(resourceManyToOne.getJoinFetch());
+		assertNull(contextManyToOne.getJoinFetch().getValue());
+	}
+	
+	public void testModifyJoinFetch() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY, "manyToOne");
+		EclipseLinkRelationshipMapping contextManyToOne = 
+			(EclipseLinkRelationshipMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlManyToOne resourceManyToOne = 
+			(XmlManyToOne) resourceEntity.getAttributes().getManyToOnes().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceManyToOne.getJoinFetch());
+		assertNull(contextManyToOne.getJoinFetch().getValue());
+		
+		// set context join fetch to INNER, check resource
+		
+		contextManyToOne.getJoinFetch().setValue(EclipseLinkJoinFetchType.INNER);
+		
+		assertEquals(XmlJoinFetchType.INNER, resourceManyToOne.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextManyToOne.getJoinFetch().getValue());
+		
+		// set context join fetch to OUTER, check resource
+		
+		contextManyToOne.getJoinFetch().setValue(EclipseLinkJoinFetchType.OUTER);
+		
+		assertEquals(XmlJoinFetchType.OUTER, resourceManyToOne.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextManyToOne.getJoinFetch().getValue());
+		
+		// set context join fetch to null, check resource
+		
+		contextManyToOne.getJoinFetch().setValue(null);
+		
+		assertNull(resourceManyToOne.getJoinFetch());
+		assertNull(contextManyToOne.getJoinFetch().getValue());
+	}
+	
+	public void testJoinFetchDefaultFromJava() throws Exception {
+		createTestEmployee();
+		createTestDepartment();
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Department");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Employee");
+		
+		OrmPersistentType departmentPersistentType = getEntityMappings().getPersistentTypes().iterator().next();
+		EclipseLinkRelationshipMapping manyToOneMapping = (EclipseLinkRelationshipMapping) departmentPersistentType.getAttributeNamed("employee").getMapping();
+
+		assertNull(manyToOneMapping.getJoinFetch().getValue());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		EclipseLinkOneToOneMapping oneToOne = (EclipseLinkOneToOneMapping) departmentPersistentType.getAttributeNamed("employee").getMapping();
+		assertNull(oneToOne.getJoinFetch().getValue());
+		
+		
+		EclipseLinkRelationshipMapping javaRelationshipMapping = (EclipseLinkRelationshipMapping) departmentPersistentType.getJavaPersistentType().getAttributeNamed("employee").getMapping();
+		javaRelationshipMapping.getJoinFetch().setValue(EclipseLinkJoinFetchType.OUTER);
+		manyToOneMapping = (EclipseLinkRelationshipMapping) departmentPersistentType.getAttributeNamed("employee").getMapping();
+		assertNull(manyToOneMapping.getJoinFetch().getValue());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(false);
+		manyToOneMapping = (EclipseLinkRelationshipMapping) departmentPersistentType.getAttributeNamed("employee").getMapping();
+		assertEquals(EclipseLinkJoinFetchType.OUTER, manyToOneMapping.getJoinFetch().getValue());
+	}
+
+	public void testVirtualMappingMetadataCompleteFalse() throws Exception {
+		createTestEntityManyToOneMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.virtualAttributes().next();
+
+		ManyToOneMapping virtualManyToOneMapping = (ManyToOneMapping) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualManyToOneMapping.getName());
+		assertEquals(FetchType.LAZY, virtualManyToOneMapping.getSpecifiedFetch());
+		assertEquals(Boolean.FALSE, virtualManyToOneMapping.getSpecifiedOptional());
+		assertEquals("Address", virtualManyToOneMapping.getSpecifiedTargetEntity());
+
+		JoinColumn virtualJoinColumn = virtualManyToOneMapping.getRelationship().getJoinColumnStrategy().specifiedJoinColumns().next();
+		assertEquals("MY_COLUMN", virtualJoinColumn.getSpecifiedName());
+		assertEquals("MY_REFERENCED_COLUMN", virtualJoinColumn.getSpecifiedReferencedColumnName());
+		assertEquals(Boolean.TRUE, virtualJoinColumn.getSpecifiedUnique());
+		assertEquals(Boolean.FALSE, virtualJoinColumn.getSpecifiedNullable());
+		assertEquals(Boolean.FALSE, virtualJoinColumn.getSpecifiedInsertable());
+		assertEquals(Boolean.FALSE, virtualJoinColumn.getSpecifiedUpdatable());
+		assertEquals("COLUMN_DEFINITION", virtualJoinColumn.getColumnDefinition());
+		assertEquals("MY_TABLE", virtualJoinColumn.getSpecifiedTable());
+
+		Cascade cascade = virtualManyToOneMapping.getCascade();
+		assertTrue(cascade.isAll());
+		assertTrue(cascade.isMerge());
+		assertTrue(cascade.isPersist());
+		assertTrue(cascade.isRemove());
+		assertTrue(cascade.isRefresh());
+
+		assertEquals(EclipseLinkJoinFetchType.INNER, ((EclipseLinkJoinFetchMapping) virtualManyToOneMapping).getJoinFetch().getValue());
+	}
+
+	public void testVirtualMappingMetadataCompleteTrue() throws Exception {
+		createTestEntityManyToOneMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, virtualPersistentAttribute.getMappingKey());
+		assertTrue(virtualPersistentAttribute.isVirtual());
+
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = virtualPersistentAttribute.convertToSpecified(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+
+		OrmEclipseLinkManyToOneMapping ormManyToOneMapping = (OrmEclipseLinkManyToOneMapping) ormPersistentAttribute.getMapping();	
+		assertEquals("address", ormManyToOneMapping.getName());
+		assertEquals(FetchType.EAGER, ormManyToOneMapping.getDefaultFetch());
+		assertEquals(true, ormManyToOneMapping.isDefaultOptional());
+		assertEquals("test.Address", ormManyToOneMapping.getDefaultTargetEntity());
+
+		Cascade cascade = ormManyToOneMapping.getCascade();
+		assertFalse(cascade.isAll());
+		assertFalse(cascade.isMerge());
+		assertFalse(cascade.isPersist());
+		assertFalse(cascade.isRemove());
+		assertFalse(cascade.isRefresh());
+
+		assertEquals(null, ormManyToOneMapping.getJoinFetch().getValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmMappedSuperclassTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmMappedSuperclassTests.java
new file mode 100644
index 0000000..57ce8ae
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmMappedSuperclassTests.java
@@ -0,0 +1,2147 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCacheCoordinationType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCacheType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCaching;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkExistenceType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkCaching;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkMappedSuperclass;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkConverterContainer;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkMappedSuperclass;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlMappedSuperclass;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTypeConverter;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmMappedSuperclassTests extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmMappedSuperclassTests(String name) {
+		super(name);
+	}
+	
+	
+	private ICompilationUnit createTestMappedSuperclassForReadOnly() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.READ_ONLY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclassForCustomizer() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.CUSTOMIZER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclassForChangeTracking() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.CHANGE_TRACKING);
+			}
+			
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclassForCaching() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestMappedSuperclassForConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestMappedSuperclassForTypeConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestMappedSuperclassForObjectTypeConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestMappedSuperclassForStructConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+	
+	public void testUpdateReadOnly() throws Exception {
+		createTestMappedSuperclassForReadOnly();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkMappedSuperclass javaContextMappedSuperclass = (JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to false, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to true, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// clear xml read only, set java read only to true, check defaults
+		
+		resourceMappedSuperclass.setReadOnly(null);
+		javaContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(Boolean.TRUE);
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertTrue(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertTrue(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+
+		// set xml read only to false, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getReadOnly());
+		assertTrue(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to true, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getReadOnly());
+		assertTrue(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// clear xml read only, set java read only to false, check defaults
+		
+		resourceMappedSuperclass.setReadOnly(null);
+		javaContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(Boolean.FALSE);
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to false, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to true, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+	}
+	
+	public void testModifyReadOnly() throws Exception {
+		createTestMappedSuperclassForReadOnly();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set context read only to true, check resource
+		
+		ormContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set context read only to false, check resource
+		
+		ormContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set context read only to null, check resource
+		
+		ormContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(null);
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());	
+	}
+	
+	public void testUpdateCustomizerClass() throws Exception {
+		createTestMappedSuperclassForCustomizer();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkMappedSuperclass javaContextMappedSuperclass = (JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getCustomizer());
+		assertNull(javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// set xml customizer, check defaults
+		resourceMappedSuperclass.setCustomizer(OrmFactory.eINSTANCE.createXmlClassReference());
+		assertNull(resourceMappedSuperclass.getCustomizer().getClassName());
+		assertNull(javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+		
+		// set xml customizer class, check override
+		
+		resourceMappedSuperclass.getCustomizer().setClassName("foo");
+		
+		assertEquals("foo", resourceMappedSuperclass.getCustomizer().getClassName());
+		assertNull(javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// clear xml customizer class, set java customizer class, check defaults
+		
+		resourceMappedSuperclass.getCustomizer().setClassName(null);
+		javaContextMappedSuperclass.getCustomizer().setSpecifiedCustomizerClass("bar");
+		
+		assertNull(resourceMappedSuperclass.getCustomizer().getClassName());
+		assertEquals("bar", javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceMappedSuperclass.getCustomizer().getClassName());
+		assertEquals("bar", javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		// set xml customizer class, check override
+		
+		resourceMappedSuperclass.getCustomizer().setClassName("foo");
+		
+		assertEquals("foo", resourceMappedSuperclass.getCustomizer().getClassName());
+		assertEquals("bar", javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+		//set xml customizer null
+		javaContextMappedSuperclass.getCustomizer().setSpecifiedCustomizerClass(null);
+		resourceMappedSuperclass.setCustomizer(null);
+		assertNull(resourceMappedSuperclass.getCustomizer());
+		assertNull(javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+	}
+	
+	public void testModifyCustomizerClass() throws Exception {
+		createTestMappedSuperclassForCustomizer();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getCustomizer());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// set context customizer, check resource
+		
+		ormContextMappedSuperclass.getCustomizer().setSpecifiedCustomizerClass("foo");
+		
+		assertEquals("foo", resourceMappedSuperclass.getCustomizer().getClassName());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+				
+		// set context customizer to null, check resource
+		
+		ormContextMappedSuperclass.getCustomizer().setSpecifiedCustomizerClass(null);
+		
+		assertNull(resourceMappedSuperclass.getCustomizer());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+	}
+	
+	public void testUpdateChangeTracking() throws Exception {
+		createTestMappedSuperclassForChangeTracking();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkMappedSuperclass javaContextMappedSuperclass = (JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to ATTRIBUTE, check context
+		
+		resourceMappedSuperclass.setChangeTracking(EclipseLinkOrmFactory.eINSTANCE.createXmlChangeTracking());
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(XmlChangeTrackingType.ATTRIBUTE, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to OBJECT, check context
+		
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to DEFERRED, check context
+		
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.DEFERRED);
+		
+		assertEquals(XmlChangeTrackingType.DEFERRED, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to AUTO, check context
+		
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.AUTO);
+		
+		assertEquals(XmlChangeTrackingType.AUTO, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// clear xml change tracking, set java change tracking, check defaults
+		
+		resourceMappedSuperclass.setChangeTracking(null);
+		javaContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// unset metadataComplete, set xml change tracking to OBJECT, check context
+		
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		resourceMappedSuperclass.setChangeTracking(EclipseLinkOrmFactory.eINSTANCE.createXmlChangeTracking());
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+	}
+	
+	public void testModifyChangeTracking() throws Exception  {
+		createTestMappedSuperclassForChangeTracking();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set context change tracking to ATTRIBUTE, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(XmlChangeTrackingType.ATTRIBUTE, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to OBJECT, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to DEFERRED, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.DEFERRED);
+		
+		assertEquals(XmlChangeTrackingType.DEFERRED, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to AUTO, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		
+		assertEquals(XmlChangeTrackingType.AUTO, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to null, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(null);
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+	}
+	
+	public void testUpdateCacheType() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+
+		
+		// set xml cache type, check settings
+		resourceMappedSuperclass.getCache().setType(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.FULL);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.FULL, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getSpecifiedType());
+
+			
+		// set java cache type, check defaults
+		
+		javaContextCaching.setSpecifiedType(EclipseLinkCacheType.WEAK);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.FULL, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getSpecifiedType());
+
+		// clear xml cache type, check defaults
+		resourceMappedSuperclass.getCache().setType(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyCacheType() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+		
+		// set context cache type, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedType(EclipseLinkCacheType.HARD_WEAK);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.HARD_WEAK, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, ormContextCaching.getSpecifiedType());
+				
+		// set context customizer to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedType(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+	}
+
+	public void testUpdateCacheCoordinationType() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+
+		
+		// set xml cache type, check settings
+		resourceMappedSuperclass.getCache().setCoordinationType(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getSpecifiedCoordinationType());
+
+			
+		// set java cache type, check defaults
+		
+		javaContextCaching.setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getSpecifiedCoordinationType());
+
+		// clear xml cache type, check defaults
+		resourceMappedSuperclass.getCache().setCoordinationType(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyCacheCoordinationType() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+		
+		// set context cache coordination type, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getSpecifiedCoordinationType());
+				
+		// set context coordination type to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedCoordinationType(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+	}
+
+	
+	public void testUpdateCacheSize() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(100, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getSize());
+		assertEquals(100, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+
+		
+		// set xml cache size, check settings
+		resourceMappedSuperclass.getCache().setSize(new Integer(105));
+		assertEquals(new Integer(105), resourceMappedSuperclass.getCache().getSize());
+		assertEquals(100, javaContextCaching.getSize());
+		assertEquals(105, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(new Integer(105), ormContextCaching.getSpecifiedSize());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedSize(new Integer(50));
+		
+		assertEquals(new Integer(105), resourceMappedSuperclass.getCache().getSize());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(105, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(new Integer(105), ormContextCaching.getSpecifiedSize());
+
+		// clear xml cache size, check defaults
+		resourceMappedSuperclass.getCache().setSize(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getSize());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(50, ormContextCaching.getSize());
+		assertEquals(50, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyCacheSize() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedSize(new Integer(50));
+		assertEquals(new Integer(50), resourceMappedSuperclass.getCache().getSize());
+		assertEquals(50, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(new Integer(50), ormContextCaching.getSpecifiedSize());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedSize(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+	}
+
+	public void testUpdateCacheAlwaysRefresh() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(false, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		
+		// set xml cache always refresh, check settings
+		resourceMappedSuperclass.getCache().setAlwaysRefresh(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(false, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+			
+		// set java cache always refresh, check defaults
+		
+		javaContextCaching.setSpecifiedAlwaysRefresh(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		// set xml cache always refresh to false
+		resourceMappedSuperclass.getCache().setAlwaysRefresh(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		// clear xml cache always refresh, check defaults
+		resourceMappedSuperclass.getCache().setAlwaysRefresh(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	}
+	
+	public void testModifyCacheAlwaysRefresh() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedAlwaysRefresh(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedAlwaysRefresh());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedAlwaysRefresh(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	}
+	
+	public void testUpdateCacheRefreshOnlyIfNewer() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(false, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		
+		// set xml cache size, check settings
+		resourceMappedSuperclass.getCache().setRefreshOnlyIfNewer(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(false, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedRefreshOnlyIfNewer(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		// set xml cache always refresh to false
+		resourceMappedSuperclass.getCache().setRefreshOnlyIfNewer(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		// clear xml cache always refresh, check defaults
+		resourceMappedSuperclass.getCache().setRefreshOnlyIfNewer(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	}
+	
+	public void testModifyCacheRefreshOnlyIfNewer() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedRefreshOnlyIfNewer(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedRefreshOnlyIfNewer(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	}
+	
+	public void testUpdateCacheDisableHits() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(false, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+
+		
+		// set xml cache size, check settings
+		resourceMappedSuperclass.getCache().setDisableHits(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(false, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedDisableHits());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedDisableHits(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedDisableHits());
+
+		// set xml cache always refresh to false
+		resourceMappedSuperclass.getCache().setDisableHits(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedDisableHits());
+
+		// clear xml cache always refresh, check defaults
+		resourceMappedSuperclass.getCache().setDisableHits(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	}
+	
+	public void testModifyCacheDisableHits() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedDisableHits(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedDisableHits());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedDisableHits(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	}
+	
+	public void testUpdateCacheShared() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(true, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+
+		
+		// set xml cache size, check settings
+		resourceMappedSuperclass.getCache().setShared(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(true, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedShared());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedShared(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedShared());
+
+		// set xml cache always refresh to false
+		resourceMappedSuperclass.getCache().setShared(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedShared());
+
+		// clear xml cache always refresh, check defaults
+		resourceMappedSuperclass.getCache().setShared(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	}
+	
+	public void testModifyCacheShared() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedShared(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedShared());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedShared(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	}
+	
+	public void testUpdateExistenceChecking() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+		
+		// set xml existence checking, check settings
+		resourceMappedSuperclass.setExistenceChecking(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+
+			
+		// set java cache existence checking, check defaults
+		
+		javaContextCaching.setSpecifiedExistenceType(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+
+		// clear xml existence checking, check defaults
+		resourceMappedSuperclass.setExistenceChecking(null);
+
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyExistenceChecking() throws Exception {
+		createTestMappedSuperclassForCaching();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+		
+		// set context cache existence checking, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedExistenceType(EclipseLinkExistenceType.ASSUME_EXISTENCE);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+				
+		// set context existence checking to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedExistenceType(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+	}
+	public void testUpdateCustomConverters() throws Exception {
+		createTestMappedSuperclassForConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlConverter resourceConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceMappedSuperclass.getConverters().add(resourceConverter);
+		resourceConverter.setClassName("Foo");
+		resourceConverter.setName("myConverter");
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlConverter resourceConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceMappedSuperclass.getConverters().add(0, resourceConverter2);
+		resourceConverter2.setClassName("Foo2");
+		resourceConverter2.setName("myConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceMappedSuperclass.getConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getConverters().remove(resourceConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyCustomConverters() throws Exception {
+		createTestMappedSuperclassForConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter.setConverterClass("Foo");
+		contextConverter.setName("myConverter");
+		
+		assertEquals(1, resourceMappedSuperclass.getConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceMappedSuperclass.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter2 = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter2.setConverterClass("Foo2");
+		contextConverter2.setName("myConverter2");
+		
+		assertEquals(2, resourceMappedSuperclass.getConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceMappedSuperclass.getConverters().get(0).getName());
+		assertEquals("Foo", resourceMappedSuperclass.getConverters().get(1).getClassName());
+		assertEquals("myConverter", resourceMappedSuperclass.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveCustomConverter(0, 1);
+		
+		assertEquals(2, resourceMappedSuperclass.getConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceMappedSuperclass.getConverters().get(0).getName());
+		assertEquals("Foo2", resourceMappedSuperclass.getConverters().get(1).getClassName());
+		assertEquals("myConverter2", resourceMappedSuperclass.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(0);
+		
+		assertEquals(1, resourceMappedSuperclass.getConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceMappedSuperclass.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(contextConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateTypeConverters() throws Exception {
+		createTestMappedSuperclassForTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceMappedSuperclass.getTypeConverters().add(resourceTypeConverter);
+		resourceTypeConverter.setDataType("Foo");
+		resourceTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceMappedSuperclass.getTypeConverters().add(0, resourceTypeConverter2);
+		resourceTypeConverter2.setDataType("Foo2");
+		resourceTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceMappedSuperclass.getTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getTypeConverters().remove(resourceTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyTypeConverters() throws Exception {
+		createTestMappedSuperclassForTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter.setDataType("Foo");
+		contextTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceMappedSuperclass.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter2 = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter2.setDataType("Foo2");
+		contextTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceMappedSuperclass.getTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceMappedSuperclass.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter", resourceMappedSuperclass.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveTypeConverter(0, 1);
+		
+		assertEquals(2, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceMappedSuperclass.getTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceMappedSuperclass.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter2", resourceMappedSuperclass.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(0);
+		
+		assertEquals(1, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceMappedSuperclass.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(contextTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateObjectTypeConverters() throws Exception {
+		createTestMappedSuperclassForObjectTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceMappedSuperclass.getObjectTypeConverters().add(resourceObjectTypeConverter);
+		resourceObjectTypeConverter.setDataType("Foo");
+		resourceObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceMappedSuperclass.getObjectTypeConverters().add(0, resourceObjectTypeConverter2);
+		resourceObjectTypeConverter2.setDataType("Foo2");
+		resourceObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceMappedSuperclass.getObjectTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getObjectTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getObjectTypeConverters().remove(resourceObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyObjectTypeConverters() throws Exception {
+		createTestMappedSuperclassForObjectTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter.setDataType("Foo");
+		contextObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceMappedSuperclass.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter2 = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter2.setDataType("Foo2");
+		contextObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceMappedSuperclass.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceMappedSuperclass.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter", resourceMappedSuperclass.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveObjectTypeConverter(0, 1);
+		
+		assertEquals(2, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceMappedSuperclass.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceMappedSuperclass.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceMappedSuperclass.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(0);
+		
+		assertEquals(1, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceMappedSuperclass.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(contextObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateStructConverters() throws Exception {
+		createTestMappedSuperclassForStructConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceMappedSuperclass.getStructConverters().add(resourceStructConverter);
+		resourceStructConverter.setConverter("Foo");
+		resourceStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceMappedSuperclass.getStructConverters().add(0, resourceStructConverter2);
+		resourceStructConverter2.setConverter("Foo2");
+		resourceStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceMappedSuperclass.getStructConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getStructConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getStructConverters().remove(resourceStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyStructConverters() throws Exception {
+		createTestMappedSuperclassForStructConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter.setConverterClass("Foo");
+		contextStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceMappedSuperclass.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter2 = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter2.setConverterClass("Foo2");
+		contextStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceMappedSuperclass.getStructConverters().get(0).getName());
+		assertEquals("Foo", resourceMappedSuperclass.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter", resourceMappedSuperclass.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveStructConverter(0, 1);
+		
+		assertEquals(2, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceMappedSuperclass.getStructConverters().get(0).getName());
+		assertEquals("Foo2", resourceMappedSuperclass.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter2", resourceMappedSuperclass.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(0);
+		
+		assertEquals(1, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceMappedSuperclass.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(contextStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmObjectTypeConverterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmObjectTypeConverterTests.java
new file mode 100644
index 0000000..2189d0c
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmObjectTypeConverterTests.java
@@ -0,0 +1,569 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConversionValue;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.java.JavaEclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlBasic;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlConversionValue;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlObjectTypeConverter;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmObjectTypeConverterTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithBasicMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC, EclipseLink.CONVERT, EclipseLink.OBJECT_TYPE_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+				sb.append("    @Convert(name=\"foo\")").append(CR);
+				sb.append("    @ObjectTypeConverter");
+			}
+		});
+	}
+
+	
+	private ICompilationUnit createTestEntityWithConvertAndObjectTypeConverterConversionValue() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, EclipseLink.CONVERT, EclipseLink.OBJECT_TYPE_CONVERTER, EclipseLink.CONVERSION_VALUE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(\"foo\")").append(CR);
+				sb.append("    @ObjectTypeConverter(name=\"foo\", defaultObjectValue=\"bar\", conversionValues = @ConversionValue(dataValue=\"f\", objectValue=\"female\"))");
+			}
+		});
+	}
+
+	public EclipseLinkOrmObjectTypeConverterTests(String name) {
+		super(name);
+	}
+	
+	
+	public void testUpdateDataType() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping(); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		EclipseLinkObjectTypeConverter ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getDataType());
+		assertEquals(null, converterResource.getDataType());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setDataType("myConvert");
+		assertEquals("myConvert", ormConverter.getDataType());
+		assertEquals("myConvert", converterResource.getDataType());
+
+		//set converter class name to null in the resource model
+		converterResource.setDataType(null);
+		assertEquals(null, ormConverter.getDataType());
+		assertEquals(null, converterResource.getDataType());
+		
+				
+		//remove the specified persistent attribute, test virtual mapping	
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkObjectTypeConverter javaConverter = ((EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setDataType("bar");
+		assertEquals("bar", ormConverter.getDataType());
+		assertEquals("bar", javaConverter.getDataType());
+		
+		//set metadata-complete, test virtual mapping	
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getDataType());
+	}
+	
+	public void testModifyDataType() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		EclipseLinkObjectTypeConverter ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+	
+		assertEquals(null, ormConverter.getDataType());
+		assertEquals(null, converterResource.getDataType());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setDataType("foo");
+		assertEquals("foo", ormConverter.getDataType());
+		assertEquals("foo", converterResource.getDataType());
+	
+		ormConverter.setDataType(null);
+		assertEquals(null, ormConverter.getDataType());
+		assertEquals(null, converterResource.getDataType());
+	}
+	
+	public void testUpdateObjectType() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping(); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		EclipseLinkObjectTypeConverter ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getObjectType());
+		assertEquals(null, converterResource.getObjectType());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setObjectType("myConvert");
+		assertEquals("myConvert", ormConverter.getObjectType());
+		assertEquals("myConvert", converterResource.getObjectType());
+
+		//set converter class name to null in the resource model
+		converterResource.setObjectType(null);
+		assertEquals(null, ormConverter.getObjectType());
+		assertEquals(null, converterResource.getObjectType());
+		
+				
+		//remove the specified persistent attribute, test virtual mapping	
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkObjectTypeConverter javaConverter = ((EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setObjectType("bar");
+		assertEquals("bar", ormConverter.getObjectType());
+		assertEquals("bar", javaConverter.getObjectType());
+		
+		//set metadata-complete, test virtual mapping	
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getObjectType());
+	}
+	
+	public void testModifyObjectType() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		EclipseLinkObjectTypeConverter ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+	
+		assertEquals(null, ormConverter.getObjectType());
+		assertEquals(null, converterResource.getObjectType());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setObjectType("foo");
+		assertEquals("foo", ormConverter.getObjectType());
+		assertEquals("foo", converterResource.getObjectType());
+	
+		ormConverter.setObjectType(null);
+		assertEquals(null, ormConverter.getObjectType());
+		assertEquals(null, converterResource.getObjectType());
+	}
+	
+	public void testUpdateName() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		OrmEclipseLinkObjectTypeConverter ormConverter = (OrmEclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setName("myConvert");
+		assertEquals("myConvert", ormConverter.getName());
+		assertEquals("myConvert", converterResource.getName());
+
+		//set converter class name to null in the resource model
+		converterResource.setName(null);
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+		
+
+		//remove the specified persistent attribute, test virtual mapping	
+				
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		EclipseLinkObjectTypeConverter virtualConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkObjectTypeConverter javaConverter = ((EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setName("bar");
+		assertEquals("bar", virtualConverter.getName());
+		assertEquals("bar", javaConverter.getName());
+		
+		
+		//set metadata-complete, test virtual mapping
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getName());
+	}
+	
+	public void testModifyName() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		OrmEclipseLinkObjectTypeConverter ormConverter = (OrmEclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+	
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setName("foo");
+		assertEquals("foo", ormConverter.getName());
+		assertEquals("foo", converterResource.getName());
+	
+		ormConverter.setName(null);
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+	}
+	
+	public void testUpdateDefaultObjectValue() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping(); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		EclipseLinkObjectTypeConverter ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getDefaultObjectValue());
+		assertEquals(null, converterResource.getDefaultObjectValue());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setDefaultObjectValue("myConvert");
+		assertEquals("myConvert", ormConverter.getDefaultObjectValue());
+		assertEquals("myConvert", converterResource.getDefaultObjectValue());
+
+		//set converter class name to null in the resource model
+		converterResource.setDefaultObjectValue(null);
+		assertEquals(null, ormConverter.getDefaultObjectValue());
+		assertEquals(null, converterResource.getDefaultObjectValue());
+		
+				
+		//remove the specified persistent attribute, test virtual mapping	
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkObjectTypeConverter javaConverter = ((EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setDefaultObjectValue("bar");
+		assertEquals("bar", ormConverter.getDefaultObjectValue());
+		assertEquals("bar", javaConverter.getDefaultObjectValue());
+		
+		//set metadata-complete, test virtual mapping	
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getDefaultObjectValue());
+	}
+	
+	public void testModifyDefaultObjectValue() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		EclipseLinkObjectTypeConverter ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+	
+		assertEquals(null, ormConverter.getDefaultObjectValue());
+		assertEquals(null, converterResource.getDefaultObjectValue());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setDefaultObjectValue("foo");
+		assertEquals("foo", ormConverter.getDefaultObjectValue());
+		assertEquals("foo", converterResource.getDefaultObjectValue());
+	
+		ormConverter.setDefaultObjectValue(null);
+		assertEquals(null, ormConverter.getDefaultObjectValue());
+		assertEquals(null, converterResource.getDefaultObjectValue());
+	}
+
+	
+	public void testUpdateConversionValues() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping(); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		EclipseLinkObjectTypeConverter ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+
+		assertEquals(0, ormConverter.conversionValuesSize());
+		assertEquals(0, converterResource.getConversionValues().size());
+		
+		//add conversion value to resource model, check context model
+		XmlConversionValue resourceConversionValue = EclipseLinkOrmFactory.eINSTANCE.createXmlConversionValue();
+		converterResource.getConversionValues().add(resourceConversionValue);
+		resourceConversionValue.setDataValue("foo");
+		resourceConversionValue.setObjectValue("bar");
+		
+		assertEquals(1, ormConverter.conversionValuesSize());
+		ListIterator<EclipseLinkConversionValue> contextConversionValues = ormConverter.conversionValues();
+		EclipseLinkConversionValue contextConversionValue = contextConversionValues.next();
+		assertEquals("foo", contextConversionValue.getDataValue());
+		assertEquals("bar", contextConversionValue.getObjectValue());
+		assertEquals(1, converterResource.getConversionValues().size());
+		assertEquals("foo", converterResource.getConversionValues().get(0).getDataValue());
+		assertEquals("bar", converterResource.getConversionValues().get(0).getObjectValue());
+		
+		//add a conversion to the beginning of the resource model list
+		XmlConversionValue xmlConversionValue2 = EclipseLinkOrmFactory.eINSTANCE.createXmlConversionValue();
+		converterResource.getConversionValues().add(0, xmlConversionValue2);
+		xmlConversionValue2.setDataValue("foo2");
+		xmlConversionValue2.setObjectValue("bar2");
+
+		assertEquals(2, ormConverter.conversionValuesSize());
+		contextConversionValues = ormConverter.conversionValues();
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo2", contextConversionValue.getDataValue());
+		assertEquals("bar2", contextConversionValue.getObjectValue());
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo", contextConversionValue.getDataValue());
+		assertEquals("bar", contextConversionValue.getObjectValue());
+		assertEquals(2, converterResource.getConversionValues().size());
+		assertEquals("foo2", converterResource.getConversionValues().get(0).getDataValue());
+		assertEquals("bar2", converterResource.getConversionValues().get(0).getObjectValue());
+		assertEquals("foo", converterResource.getConversionValues().get(1).getDataValue());
+		assertEquals("bar", converterResource.getConversionValues().get(1).getObjectValue());
+
+		//move a conversion value in the resource model list
+		
+		converterResource.getConversionValues().move(0, 1);
+		assertEquals(2, ormConverter.conversionValuesSize());
+		contextConversionValues = ormConverter.conversionValues();
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo", contextConversionValue.getDataValue());
+		assertEquals("bar", contextConversionValue.getObjectValue());
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo2", contextConversionValue.getDataValue());
+		assertEquals("bar2", contextConversionValue.getObjectValue());
+		assertEquals(2, converterResource.getConversionValues().size());
+		assertEquals("foo", converterResource.getConversionValues().get(0).getDataValue());
+		assertEquals("bar", converterResource.getConversionValues().get(0).getObjectValue());
+		assertEquals("foo2", converterResource.getConversionValues().get(1).getDataValue());
+		assertEquals("bar2", converterResource.getConversionValues().get(1).getObjectValue());
+
+		//remove a conversion value from the resource model list
+
+		converterResource.getConversionValues().remove(0);
+		assertEquals(1, ormConverter.conversionValuesSize());
+		contextConversionValues = ormConverter.conversionValues();
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo2", contextConversionValue.getDataValue());
+		assertEquals("bar2", contextConversionValue.getObjectValue());
+		assertEquals(1, converterResource.getConversionValues().size());
+		assertEquals("foo2", converterResource.getConversionValues().get(0).getDataValue());
+		assertEquals("bar2", converterResource.getConversionValues().get(0).getObjectValue());
+
+		//clear the conversion value resource model list
+		converterResource.getConversionValues().clear();
+		assertEquals(0, ormConverter.conversionValuesSize());
+		assertEquals(0, converterResource.getConversionValues().size());
+		
+		//add conversion value to java context model, verify does not affect orm context model
+	
+		EclipseLinkObjectTypeConverter javaConverter = (EclipseLinkObjectTypeConverter) ((JavaEclipseLinkConvert) javaBasicMapping.getConverter()).getConverter();
+		EclipseLinkConversionValue javaConversionValue = javaConverter.addConversionValue();
+		javaConversionValue.setDataValue("baz");
+		
+		assertEquals(0, ormConverter.conversionValuesSize());
+		assertEquals(0, converterResource.getConversionValues().size());
+		assertEquals(1, javaConverter.conversionValuesSize());
+		
+		//remove orm attribute mapping, verify virtual mapping has conversion values from java
+		
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		assertEquals(1, ormConverter.conversionValuesSize());
+		contextConversionValues = ormConverter.conversionValues();
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("baz", contextConversionValue.getDataValue());
+		assertEquals(0, converterResource.getConversionValues().size());
+		assertEquals(1, javaConverter.conversionValuesSize());
+		
+		//set metadata-complete to true, verify virtual mapping ignores the conversion values from java
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+	}
+	
+	public void testModifyConversionValues() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping(); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkObjectTypeConverter.class);
+		EclipseLinkObjectTypeConverter ormConverter = (EclipseLinkObjectTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlObjectTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getObjectTypeConverter();
+		
+		assertEquals(0, ormConverter.conversionValuesSize());
+		assertEquals(0, converterResource.getConversionValues().size());
+		
+		//add conversion value to context model, check resource model
+		EclipseLinkConversionValue contextConversionValue = ormConverter.addConversionValue();
+		contextConversionValue.setDataValue("foo");
+		contextConversionValue.setObjectValue("bar");
+
+		assertEquals(1, ormConverter.conversionValuesSize());
+		ListIterator<EclipseLinkConversionValue> contextConversionValues = ormConverter.conversionValues();
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo", contextConversionValue.getDataValue());
+		assertEquals("bar", contextConversionValue.getObjectValue());
+		assertEquals(1, converterResource.getConversionValues().size());
+		assertEquals("foo", converterResource.getConversionValues().get(0).getDataValue());
+		assertEquals("bar", converterResource.getConversionValues().get(0).getObjectValue());
+
+		//add a conversion to the beginning of the context model list
+		EclipseLinkConversionValue contextConversionValue2 = ormConverter.addConversionValue(0);
+		contextConversionValue2.setDataValue("foo2");
+		contextConversionValue2.setObjectValue("bar2");
+
+		assertEquals(2, ormConverter.conversionValuesSize());
+		contextConversionValues = ormConverter.conversionValues();
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo2", contextConversionValue.getDataValue());
+		assertEquals("bar2", contextConversionValue.getObjectValue());
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo", contextConversionValue.getDataValue());
+		assertEquals("bar", contextConversionValue.getObjectValue());
+		assertEquals(2, converterResource.getConversionValues().size());
+		assertEquals("foo2", converterResource.getConversionValues().get(0).getDataValue());
+		assertEquals("bar2", converterResource.getConversionValues().get(0).getObjectValue());
+		assertEquals("foo", converterResource.getConversionValues().get(1).getDataValue());
+		assertEquals("bar", converterResource.getConversionValues().get(1).getObjectValue());
+
+		//move a conversion value in the context model list
+		
+		ormConverter.moveConversionValue(0, 1);
+		assertEquals(2, ormConverter.conversionValuesSize());
+		contextConversionValues = ormConverter.conversionValues();
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo", contextConversionValue.getDataValue());
+		assertEquals("bar", contextConversionValue.getObjectValue());
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo2", contextConversionValue.getDataValue());
+		assertEquals("bar2", contextConversionValue.getObjectValue());
+		assertEquals(2, converterResource.getConversionValues().size());
+		assertEquals("foo", converterResource.getConversionValues().get(0).getDataValue());
+		assertEquals("bar", converterResource.getConversionValues().get(0).getObjectValue());
+		assertEquals("foo2", converterResource.getConversionValues().get(1).getDataValue());
+		assertEquals("bar2", converterResource.getConversionValues().get(1).getObjectValue());
+
+		//remove a conversion value from the context model list
+
+		ormConverter.removeConversionValue(0);
+		assertEquals(1, ormConverter.conversionValuesSize());
+		contextConversionValues = ormConverter.conversionValues();
+		contextConversionValue = contextConversionValues.next();
+		assertEquals("foo2", contextConversionValue.getDataValue());
+		assertEquals("bar2", contextConversionValue.getObjectValue());
+		assertEquals(1, converterResource.getConversionValues().size());
+		assertEquals("foo2", converterResource.getConversionValues().get(0).getDataValue());
+		assertEquals("bar2", converterResource.getConversionValues().get(0).getObjectValue());
+
+		//clear the conversion value resource model list
+		ormConverter.removeConversionValue(0);
+		assertEquals(0, ormConverter.conversionValuesSize());
+		assertEquals(0, converterResource.getConversionValues().size());
+	}
+
+	public void testInitializeConversionValues() throws Exception {
+		createTestEntityWithConvertAndObjectTypeConverterConversionValue();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		BasicMapping ormBasicMapping = (BasicMapping) ormPersistentAttribute.getMapping(); 
+		EclipseLinkConvert eclipseLinkConvert = (EclipseLinkConvert) ormBasicMapping.getConverter();
+		EclipseLinkObjectTypeConverter converter = (EclipseLinkObjectTypeConverter) eclipseLinkConvert.getConverter();
+
+		assertEquals(1, converter.conversionValuesSize());
+		assertEquals("f", converter.conversionValues().next().getDataValue());
+		assertEquals("female", converter.conversionValues().next().getObjectValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmOneToManyMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmOneToManyMappingTests.java
new file mode 100644
index 0000000..e9a4c2f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmOneToManyMappingTests.java
@@ -0,0 +1,747 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.Cascade;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.JoinTable;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkOneToManyMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkRelationshipMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkOneToManyMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlOneToMany;
+import org.eclipse.jpt.jpa.eclipselink.core.v2_0.context.EclipseLinkOneToManyRelationship2_0;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmOneToManyMappingTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmOneToManyMappingTests(String name) {
+		super(name);
+	}
+	
+	private void createTestDepartment() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ").append(JPA.ENTITY).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.ID).append(";");
+					sb.append(CR);
+					sb.append("import java.util.Collection;");
+					sb.append(CR);
+					sb.append("import ").append(JPA.JOIN_TABLE).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.JOIN_COLUMN).append(";");
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Department").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    @JoinTable(name=\"DEP_EMP\", joinColumns=@JoinColumn(name=\"DEPT_ID\"), inverseJoinColumns=@JoinColumn(name=\"EMP_ID\"))").append(CR);
+				sb.append("    private Collection<Employee> employees;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Department.java", sourceWriter);
+	}
+
+	private void createTestEmployee() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ").append(JPA.ENTITY).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.ID).append(";");
+					sb.append(CR);
+			sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Employee").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int empId;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Employee.java", sourceWriter);
+	}
+	
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+				sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+	
+	private void createTestEntityWithOneToManyMapping() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToMany").append(CR);
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+	
+	private ICompilationUnit createTestEntityWithValidMapOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private java.util.Map<String, Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityWithValidNonGenericMapOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private java.util.Map addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private void createTestEmbeddableState() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("State").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter);
+	}
+
+	private ICompilationUnit createTestEntityOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.FETCH_TYPE, JPA.CASCADE_TYPE, JPA.ORDER_BY, EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany(fetch=FetchType.EAGER, targetEntity=Address.class, cascade={CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH})");
+				sb.append(CR);
+				sb.append("    @OrderBy(\"city\"");
+				sb.append(CR);
+				sb.append("    @JoinFetch(JoinFetchType.INNER)");
+				sb.append("    private java.util.Collection<Address> address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}
+
+	public void testUpdatePrivateOwned() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToMany");
+		EclipseLinkOneToManyMapping contextOneToMany = 
+			(EclipseLinkOneToManyMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		XmlOneToMany resourceOneToMany = 
+			(XmlOneToMany) resourceEntity.getAttributes().getOneToManys().get(0);
+		
+		// check defaults
+		
+		assertFalse(resourceOneToMany.isPrivateOwned());
+		assertFalse(contextOneToMany.getPrivateOwned().isPrivateOwned());
+		
+		// set xml private owned to true, check context
+		
+		resourceOneToMany.setPrivateOwned(true);
+		
+		assertTrue(resourceOneToMany.isPrivateOwned());
+		assertTrue(contextOneToMany.getPrivateOwned().isPrivateOwned());
+		
+		// set xml private owned back to false, check context
+		
+		resourceOneToMany.setPrivateOwned(false);
+		
+		assertFalse(resourceOneToMany.isPrivateOwned());
+		assertFalse(contextOneToMany.getPrivateOwned().isPrivateOwned());
+	}
+	
+	public void testModifyPrivateOwned() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToMany");
+		EclipseLinkOneToManyMapping contextOneToMany = 
+			(EclipseLinkOneToManyMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlOneToMany resourceOneToMany = 
+			(XmlOneToMany) resourceEntity.getAttributes().getOneToManys().get(0);
+		
+		// check defaults
+		
+		assertFalse(resourceOneToMany.isPrivateOwned());
+		assertFalse(contextOneToMany.getPrivateOwned().isPrivateOwned());
+		
+		// set context private owned  to true, check resource
+		
+		contextOneToMany.getPrivateOwned().setPrivateOwned(true);
+		
+		assertTrue(resourceOneToMany.isPrivateOwned());
+		assertTrue(contextOneToMany.getPrivateOwned().isPrivateOwned());
+		
+		// set context private owned back to false, check resource
+		
+		contextOneToMany.getPrivateOwned().setPrivateOwned(false);
+		
+		assertFalse(resourceOneToMany.isPrivateOwned());
+		assertFalse(contextOneToMany.getPrivateOwned().isPrivateOwned());
+	}
+	
+	public void testUpdateJoinFetch() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToMany");
+		EclipseLinkOneToManyMapping contextOneToMany = 
+			(EclipseLinkOneToManyMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		XmlOneToMany resourceOneToMany = 
+			(XmlOneToMany) resourceEntity.getAttributes().getOneToManys().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceOneToMany.getJoinFetch());
+		assertNull(contextOneToMany.getJoinFetch().getValue());
+		
+		// set xml join fetch to INNER, check context
+		
+		resourceOneToMany.setJoinFetch(XmlJoinFetchType.INNER);
+		
+		assertEquals(XmlJoinFetchType.INNER, resourceOneToMany.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextOneToMany.getJoinFetch().getValue());
+		
+		// set xml join fetch to OUTER, check context
+		
+		resourceOneToMany.setJoinFetch(XmlJoinFetchType.OUTER);
+		
+		assertEquals(XmlJoinFetchType.OUTER, resourceOneToMany.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextOneToMany.getJoinFetch().getValue());
+		
+		// set xml join fetch to null, check context
+		
+		resourceOneToMany.setJoinFetch(null);
+		
+		assertNull(resourceOneToMany.getJoinFetch());
+		assertNull(contextOneToMany.getJoinFetch().getValue());
+	}
+	
+	public void testModifyJoinFetch() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToMany");
+		EclipseLinkOneToManyMapping contextOneToMany = 
+			(EclipseLinkOneToManyMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlOneToMany resourceOneToMany = 
+			(XmlOneToMany) resourceEntity.getAttributes().getOneToManys().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceOneToMany.getJoinFetch());
+		assertNull(contextOneToMany.getJoinFetch().getValue());
+		
+		// set context join fetch to INNER, check resource
+		
+		contextOneToMany.getJoinFetch().setValue(EclipseLinkJoinFetchType.INNER);
+		
+		assertEquals(XmlJoinFetchType.INNER, resourceOneToMany.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextOneToMany.getJoinFetch().getValue());
+		
+		// set context join fetch to OUTER, check resource
+		
+		contextOneToMany.getJoinFetch().setValue(EclipseLinkJoinFetchType.OUTER);
+		
+		assertEquals(XmlJoinFetchType.OUTER, resourceOneToMany.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextOneToMany.getJoinFetch().getValue());
+		
+		// set context join fetch to null, check resource
+		
+		contextOneToMany.getJoinFetch().setValue(null);
+		
+		assertNull(resourceOneToMany.getJoinFetch());
+		assertNull(contextOneToMany.getJoinFetch().getValue());
+	}
+	
+	public void testJoinFetchDefault() throws Exception {
+		createTestEmployee();
+		createTestDepartment();
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Department");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Employee");
+		
+		OrmPersistentType departmentPersistentType = getEntityMappings().getPersistentTypes().iterator().next();
+		EclipseLinkOneToManyMapping oneToMany = (EclipseLinkOneToManyMapping) departmentPersistentType.getAttributeNamed("employees").getMapping();
+
+		assertNull(oneToMany.getJoinFetch().getValue());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		oneToMany = (EclipseLinkOneToManyMapping) departmentPersistentType.getAttributeNamed("employees").getMapping();
+		assertNull(oneToMany.getJoinFetch().getValue());		
+		
+		EclipseLinkRelationshipMapping javaRelationshipMapping = (EclipseLinkRelationshipMapping) departmentPersistentType.getJavaPersistentType().getAttributeNamed("employees").getMapping();
+		javaRelationshipMapping.getJoinFetch().setValue(EclipseLinkJoinFetchType.OUTER);
+		assertNull(oneToMany.getJoinFetch().getValue());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(false);
+		oneToMany = (EclipseLinkOneToManyMapping) departmentPersistentType.getAttributeNamed("employees").getMapping();
+		assertEquals(EclipseLinkJoinFetchType.OUTER, oneToMany.getJoinFetch().getValue());
+	}
+	
+	public void testDefaultJoinTable() throws Exception {
+		createTestEmployee();
+		createTestDepartment();
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Department");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Employee");
+		
+		OrmPersistentType departmentPersistentType = getEntityMappings().getPersistentTypes().iterator().next();
+		OrmReadOnlyPersistentAttribute attribute = departmentPersistentType.getAttributeNamed("employees");
+		OneToManyMapping oneToMany = (OneToManyMapping) attribute.getMapping();
+		
+		assertEquals(true, attribute.isVirtual());
+		JoinTable ormJoinTable = oneToMany.getRelationship().getJoinTableStrategy().getJoinTable();
+		assertEquals("DEP_EMP", ormJoinTable.getName());
+		assertEquals("DEPT_ID", ormJoinTable.specifiedJoinColumns().next().getName());
+		assertEquals("id", ormJoinTable.specifiedJoinColumns().next().getReferencedColumnName());
+		assertEquals("EMP_ID", ormJoinTable.specifiedInverseJoinColumns().next().getName());
+		assertEquals("empId", ormJoinTable.specifiedInverseJoinColumns().next().getReferencedColumnName());
+
+		//set metadata-complete and verify JoinTable info is not taken from the java
+		departmentPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		departmentPersistentType.addSpecifiedAttribute(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, "id");	
+		attribute = departmentPersistentType.getAttributeNamed("employees");
+		oneToMany = (OneToManyMapping) attribute.getMapping();
+		
+		assertEquals(true, attribute.isVirtual());
+		ormJoinTable = oneToMany.getRelationship().getJoinTableStrategy().getJoinTable();
+		assertEquals("Department_Employee", ormJoinTable.getName());
+		assertEquals("Department_id", ormJoinTable.getDefaultJoinColumn().getName());
+		assertEquals("id", ormJoinTable.getDefaultJoinColumn().getReferencedColumnName());
+		assertEquals("employees_empId", ormJoinTable.getDefaultInverseJoinColumn().getName());
+		assertEquals("empId", ormJoinTable.getDefaultInverseJoinColumn().getReferencedColumnName());
+		
+		//set metadata-complete to false, add mapping to orm.xml verify JoinTable info is not taken from the java
+		departmentPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.FALSE);
+		attribute = departmentPersistentType.getAttributeNamed("employees");
+		oneToMany = (OneToManyMapping) attribute.getMapping();
+		assertEquals(true, attribute.isVirtual());
+		ormJoinTable = oneToMany.getRelationship().getJoinTableStrategy().getJoinTable();
+		assertEquals("DEP_EMP", ormJoinTable.getName());
+		assertEquals("DEPT_ID", ormJoinTable.specifiedJoinColumns().next().getName());
+		assertEquals("id", ormJoinTable.specifiedJoinColumns().next().getReferencedColumnName());
+		assertEquals("EMP_ID", ormJoinTable.specifiedInverseJoinColumns().next().getName());
+		assertEquals("empId", ormJoinTable.specifiedInverseJoinColumns().next().getReferencedColumnName());
+
+		
+		departmentPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "employees");
+		attribute = departmentPersistentType.getAttributeNamed("employees");
+		oneToMany = (OneToManyMapping) attribute.getMapping();
+		assertEquals(false, attribute.isVirtual());
+		ormJoinTable = oneToMany.getRelationship().getJoinTableStrategy().getJoinTable();
+		assertEquals("Department_Employee", ormJoinTable.getName());
+		assertEquals(0, ormJoinTable.specifiedJoinColumnsSize());
+		assertEquals("Department_id", ormJoinTable.getDefaultJoinColumn().getName());
+		assertEquals("id", ormJoinTable.getDefaultJoinColumn().getReferencedColumnName());
+		assertEquals(0, ormJoinTable.specifiedInverseJoinColumnsSize());
+		assertEquals("employees_empId", ormJoinTable.getDefaultInverseJoinColumn().getName());
+		assertEquals("empId", ormJoinTable.getDefaultInverseJoinColumn().getReferencedColumnName());
+	}
+	
+	public void testUpdateVirtualMapKey() throws Exception {
+		createTestEntityWithValidMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+
+		OneToManyMapping ormOneToManyMapping = (OneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaOneToManyMapping javaOneToManyMapping = (JavaOneToManyMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		assertNull(ormOneToManyMapping.getSpecifiedMapKey());
+		assertNull(ormOneToManyMapping.getMapKey());
+		assertFalse(ormOneToManyMapping.isPkMapKey());
+		assertFalse(ormOneToManyMapping.isCustomMapKey());
+		assertTrue(ormOneToManyMapping.isNoMapKey());
+		
+		//set pk mapKey in the java, verify virtual orm mapping updates
+		javaOneToManyMapping.setPkMapKey(true);
+		assertEquals("id", ormOneToManyMapping.getMapKey());
+		assertTrue(ormOneToManyMapping.isPkMapKey());
+		assertFalse(ormOneToManyMapping.isCustomMapKey());
+		assertFalse(ormOneToManyMapping.isNoMapKey());
+		
+		
+		//set custom specified mapKey in the java, verify virtual orm mapping updates
+		javaOneToManyMapping.setCustomMapKey(true);
+		javaOneToManyMapping.setSpecifiedMapKey("city");
+		assertEquals("city", ormOneToManyMapping.getSpecifiedMapKey());
+		assertEquals("city", ormOneToManyMapping.getMapKey());
+		assertFalse(ormOneToManyMapping.isPkMapKey());
+		assertTrue(ormOneToManyMapping.isCustomMapKey());
+		assertFalse(ormOneToManyMapping.isNoMapKey());
+		
+		//set metadata complete and verify that the orm model ignores the java annotations
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormOneToManyMapping = (OneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		assertEquals(null, ormOneToManyMapping.getSpecifiedMapKey());
+		assertEquals(null, ormOneToManyMapping.getMapKey());
+		assertFalse(ormOneToManyMapping.isPkMapKey());
+		assertFalse(ormOneToManyMapping.isCustomMapKey());
+		assertTrue(ormOneToManyMapping.isNoMapKey());
+	}
+
+	public void testCandidateMapKeyNames() throws Exception {
+		createTestEntityWithValidMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		
+		OneToManyMapping oneToManyMapping = (OneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = 
+			oneToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+	}
+	
+	public void testCandidateMapKeyNames2() throws Exception {
+		createTestEntityWithValidNonGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		
+		OneToManyMapping ormOneToManyMapping = (OneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaOneToManyMapping javaOneToManyMapping = (JavaOneToManyMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = ormOneToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		javaOneToManyMapping.setSpecifiedTargetEntity("test.Address");
+		mapKeyNames = ormOneToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		ormPersistentType.getAttributeNamed("addresses").convertToSpecified();
+		ormOneToManyMapping = (OneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		mapKeyNames = ormOneToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		ormOneToManyMapping.setSpecifiedTargetEntity("test.Address");
+		mapKeyNames = ormOneToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		ormOneToManyMapping.setSpecifiedTargetEntity("String");
+		mapKeyNames = ormOneToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+	}
+	
+	public void testModifyPredominantJoiningStrategy() throws Exception {
+		createTestEntityWithOneToManyMapping();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("id");
+		OrmEclipseLinkOneToManyMapping contextMapping = (OrmEclipseLinkOneToManyMapping) contextAttribute.getMapping();
+		EclipseLinkOneToManyRelationship2_0 rel = contextMapping.getRelationship();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlOneToMany resourceMapping = (XmlOneToMany) resourceEntity.getAttributes().getOneToManys().get(0);
+		
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToJoinColumn();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToMappedBy();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToJoinTable();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+	}
+	
+	public void testUpdatePredominantJoiningStrategy() throws Exception {
+		createTestEntityWithOneToManyMapping();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("id");
+		OrmEclipseLinkOneToManyMapping contextMapping = (OrmEclipseLinkOneToManyMapping) contextAttribute.getMapping();
+		EclipseLinkOneToManyRelationship2_0 rel = contextMapping.getRelationship();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlOneToMany resourceMapping = (XmlOneToMany) resourceEntity.getAttributes().getOneToManys().get(0);
+		
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceMapping.setMappedBy("foo");
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceMapping.setJoinTable(OrmFactory.eINSTANCE.createXmlJoinTable());
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceMapping.getJoinColumns().add(OrmFactory.eINSTANCE.createXmlJoinColumn());
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceMapping.setMappedBy(null);
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceMapping.setJoinTable(null);
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceMapping.getJoinColumns().clear();
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+	}
+
+	public void testVirtualMappingMetadataCompleteFalse() throws Exception {
+		createTestEntityOneToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.virtualAttributes().next();
+
+		EclipseLinkOneToManyMapping virtualOneToManyMapping = (EclipseLinkOneToManyMapping) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualOneToManyMapping.getName());
+		assertEquals(FetchType.EAGER, virtualOneToManyMapping.getSpecifiedFetch());
+		assertEquals("Address", virtualOneToManyMapping.getSpecifiedTargetEntity());
+		assertNull(virtualOneToManyMapping.getRelationship().
+			getMappedByStrategy().getMappedByAttribute());
+
+		Cascade cascade = virtualOneToManyMapping.getCascade();
+		assertTrue(cascade.isAll());
+		assertTrue(cascade.isMerge());
+		assertTrue(cascade.isPersist());
+		assertTrue(cascade.isRemove());
+		assertTrue(cascade.isRefresh());
+
+		assertTrue(virtualOneToManyMapping.getOrderable().isCustomOrdering());
+		assertEquals("city", virtualOneToManyMapping.getOrderable().getSpecifiedOrderBy());
+
+		assertEquals(EclipseLinkJoinFetchType.INNER, virtualOneToManyMapping.getJoinFetch().getValue());
+	}
+
+	public void testVirtualMappingMetadataCompleteTrue() throws Exception {
+		createTestEntityOneToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, virtualPersistentAttribute.getMappingKey());
+
+		EclipseLinkOneToManyMapping virtualOneToManyMapping = (EclipseLinkOneToManyMapping) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualOneToManyMapping.getName());
+		assertEquals(FetchType.LAZY, virtualOneToManyMapping.getFetch());
+		assertEquals("test.Address", virtualOneToManyMapping.getTargetEntity());
+		assertNull(virtualOneToManyMapping.getRelationship().getMappedByStrategy().getMappedByAttribute());
+
+		Cascade cascade = virtualOneToManyMapping.getCascade();
+		assertFalse(cascade.isAll());
+		assertFalse(cascade.isMerge());
+		assertFalse(cascade.isPersist());
+		assertFalse(cascade.isRemove());
+		assertFalse(cascade.isRefresh());
+
+		assertTrue(virtualOneToManyMapping.getOrderable().isNoOrdering());
+		assertEquals(null, virtualOneToManyMapping.getOrderable().getSpecifiedOrderBy());
+
+		assertEquals(null, virtualOneToManyMapping.getJoinFetch().getValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmOneToOneMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmOneToOneMappingTests.java
new file mode 100644
index 0000000..fe55468
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmOneToOneMappingTests.java
@@ -0,0 +1,455 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.Cascade;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkOneToOneMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkRelationshipMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkOneToOneMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlOneToOne;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmOneToOneMappingTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmOneToOneMappingTests(String name) {
+		super(name);
+	}
+	
+	private void createTestDepartment() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ").append(JPA.ENTITY).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.ID).append(";");
+					sb.append(CR);
+					sb.append(CR);
+					sb.append("import ").append(JPA.ONE_TO_ONE).append(";");
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Department").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToOne").append(CR);
+				sb.append("    private Employee employee;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Department.java", sourceWriter);
+	}
+
+	private void createTestEmployee() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ").append(JPA.ENTITY).append(";");
+					sb.append(CR);
+					sb.append("import ").append(JPA.ID).append(";");
+					sb.append(CR);
+			sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Employee").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int empId;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Employee.java", sourceWriter);
+	}
+
+	private ICompilationUnit createTestEntityOneToOneMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, JPA.JOIN_COLUMN, JPA.FETCH_TYPE, JPA.CASCADE_TYPE, EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE, EclipseLink.PRIVATE_OWNED);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne(fetch=FetchType.LAZY, optional=false, targetEntity=Address.class, cascade={CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH})");
+				sb.append(CR);
+				sb.append("    @JoinColumn(name=\"MY_COLUMN\", referencedColumnName=\"MY_REFERENCED_COLUMN\", unique=true, nullable=false, insertable=false, updatable=false, columnDefinition=\"COLUMN_DEFINITION\", table=\"MY_TABLE\")");
+				sb.append(CR);
+				sb.append("    @JoinFetch(JoinFetchType.INNER)");
+				sb.append(CR);
+				sb.append("    @PrivateOwned)");
+				sb.append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}	
+
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+				sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	public void testUpdatePrivateOwned() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		EclipseLinkOneToOneMapping contextOneToOne = 
+			(EclipseLinkOneToOneMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlOneToOne resourceOneToOne = 
+			(XmlOneToOne) resourceEntity.getAttributes().getOneToOnes().get(0);
+		
+		// check defaults
+		
+		assertFalse(resourceOneToOne.isPrivateOwned());
+		assertFalse(contextOneToOne.getPrivateOwned().isPrivateOwned());
+		
+		// set xml private owned to true, check context
+		
+		resourceOneToOne.setPrivateOwned(true);
+		
+		assertTrue(resourceOneToOne.isPrivateOwned());
+		assertTrue(contextOneToOne.getPrivateOwned().isPrivateOwned());
+		
+		// set xml private owned back to false, check context
+		
+		resourceOneToOne.setPrivateOwned(false);
+		
+		assertFalse(resourceOneToOne.isPrivateOwned());
+		assertFalse(contextOneToOne.getPrivateOwned().isPrivateOwned());
+	}
+	
+	public void testModifyPrivateOwned() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		EclipseLinkOneToOneMapping contextOneToOne = 
+			(EclipseLinkOneToOneMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlOneToOne resourceOneToOne = 
+			(XmlOneToOne) resourceEntity.getAttributes().getOneToOnes().get(0);
+		
+		// check defaults
+		
+		assertFalse(resourceOneToOne.isPrivateOwned());
+		assertFalse(contextOneToOne.getPrivateOwned().isPrivateOwned());
+		
+		// set context private owned  to true, check resource
+		
+		contextOneToOne.getPrivateOwned().setPrivateOwned(true);
+		
+		assertTrue(resourceOneToOne.isPrivateOwned());
+		assertTrue(contextOneToOne.getPrivateOwned().isPrivateOwned());
+		
+		// set context private owned back to false, check resource
+		
+		contextOneToOne.getPrivateOwned().setPrivateOwned(false);
+	}
+	
+	public void testUpdateJoinFetch() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		EclipseLinkOneToOneMapping contextOneToOne = 
+			(EclipseLinkOneToOneMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity) getXmlEntityMappings().getEntities().get(0);
+		XmlOneToOne resourceOneToOne = 
+			(XmlOneToOne) resourceEntity.getAttributes().getOneToOnes().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceOneToOne.getJoinFetch());
+		assertNull(contextOneToOne.getJoinFetch().getValue());
+		
+		// set xml join fetch to INNER, check context
+		
+		resourceOneToOne.setJoinFetch(XmlJoinFetchType.INNER);
+		
+		assertEquals(XmlJoinFetchType.INNER, resourceOneToOne.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextOneToOne.getJoinFetch().getValue());
+		
+		// set xml join fetch to OUTER, check context
+		
+		resourceOneToOne.setJoinFetch(XmlJoinFetchType.OUTER);
+		
+		assertEquals(XmlJoinFetchType.OUTER, resourceOneToOne.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextOneToOne.getJoinFetch().getValue());
+		
+		// set xml join fetch to null, check context
+		
+		resourceOneToOne.setJoinFetch(null);
+		
+		assertNull(resourceOneToOne.getJoinFetch());
+		assertNull(contextOneToOne.getJoinFetch().getValue());
+	}
+	
+	public void testModifyJoinFetch() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		EclipseLinkOneToOneMapping contextOneToOne = 
+			(EclipseLinkOneToOneMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlOneToOne resourceOneToOne = 
+			(XmlOneToOne) resourceEntity.getAttributes().getOneToOnes().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceOneToOne.getJoinFetch());
+		assertNull(contextOneToOne.getJoinFetch().getValue());
+		
+		// set context join fetch to INNER, check resource
+		
+		contextOneToOne.getJoinFetch().setValue(EclipseLinkJoinFetchType.INNER);
+		
+		assertEquals(XmlJoinFetchType.INNER, resourceOneToOne.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextOneToOne.getJoinFetch().getValue());
+		
+		// set context join fetch to OUTER, check resource
+		
+		contextOneToOne.getJoinFetch().setValue(EclipseLinkJoinFetchType.OUTER);
+		
+		assertEquals(XmlJoinFetchType.OUTER, resourceOneToOne.getJoinFetch());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextOneToOne.getJoinFetch().getValue());
+		
+		// set context join fetch to null, check resource
+		
+		contextOneToOne.getJoinFetch().setValue(null);
+		
+		assertNull(resourceOneToOne.getJoinFetch());
+		assertNull(contextOneToOne.getJoinFetch().getValue());
+	}
+	
+	public void testJoinFetchDefaultFromJava() throws Exception {
+		createTestEmployee();
+		createTestDepartment();
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Department");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Employee");
+		
+		OrmPersistentType departmentPersistentType = getEntityMappings().getPersistentTypes().iterator().next();
+		EclipseLinkOneToOneMapping oneToOne = (EclipseLinkOneToOneMapping) departmentPersistentType.getAttributeNamed("employee").getMapping();
+
+		assertNull(oneToOne.getJoinFetch().getValue());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		oneToOne = (EclipseLinkOneToOneMapping) departmentPersistentType.getAttributeNamed("employee").getMapping();
+		assertNull(oneToOne.getJoinFetch().getValue());		
+		
+		EclipseLinkRelationshipMapping javaRelationshipMapping = (EclipseLinkRelationshipMapping) departmentPersistentType.getJavaPersistentType().getAttributeNamed("employee").getMapping();
+		javaRelationshipMapping.getJoinFetch().setValue(EclipseLinkJoinFetchType.OUTER);
+		assertNull(oneToOne.getJoinFetch().getValue());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(false);
+		oneToOne = (EclipseLinkOneToOneMapping) departmentPersistentType.getAttributeNamed("employee").getMapping();
+		assertEquals(EclipseLinkJoinFetchType.OUTER, oneToOne.getJoinFetch().getValue());
+	}
+
+	public void testVirtualMappingMetadataCompleteFalse() throws Exception {
+		createTestEntityOneToOneMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.virtualAttributes().next();
+
+		OneToOneMapping virtualOneToOneMapping = (OneToOneMapping) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualOneToOneMapping.getName());
+		assertEquals(FetchType.LAZY, virtualOneToOneMapping.getSpecifiedFetch());
+		assertEquals(Boolean.FALSE, virtualOneToOneMapping.getSpecifiedOptional());
+		assertEquals("Address", virtualOneToOneMapping.getSpecifiedTargetEntity());
+		assertNull(virtualOneToOneMapping.getRelationship().
+			getMappedByStrategy().getMappedByAttribute());
+
+		JoinColumn virtualJoinColumn = 
+			virtualOneToOneMapping.getRelationship().getJoinColumnStrategy().specifiedJoinColumns().next();
+		assertEquals("MY_COLUMN", virtualJoinColumn.getSpecifiedName());
+		assertEquals("MY_REFERENCED_COLUMN", virtualJoinColumn.getSpecifiedReferencedColumnName());
+		assertEquals(Boolean.TRUE, virtualJoinColumn.getSpecifiedUnique());
+		assertEquals(Boolean.FALSE, virtualJoinColumn.getSpecifiedNullable());
+		assertEquals(Boolean.FALSE, virtualJoinColumn.getSpecifiedInsertable());
+		assertEquals(Boolean.FALSE, virtualJoinColumn.getSpecifiedUpdatable());
+		assertEquals("COLUMN_DEFINITION", virtualJoinColumn.getColumnDefinition());
+		assertEquals("MY_TABLE", virtualJoinColumn.getSpecifiedTable());
+
+		Cascade cascade = virtualOneToOneMapping.getCascade();
+		assertTrue(cascade.isAll());
+		assertTrue(cascade.isMerge());
+		assertTrue(cascade.isPersist());
+		assertTrue(cascade.isRemove());
+		assertTrue(cascade.isRefresh());
+
+		assertEquals(EclipseLinkJoinFetchType.INNER, ((EclipseLinkJoinFetchMapping) virtualOneToOneMapping).getJoinFetch().getValue());
+		assertTrue(((EclipseLinkOneToOneMapping) virtualOneToOneMapping).getPrivateOwned().isPrivateOwned());
+	}
+
+	public void testVirtualMappingMetadataCompleteTrue() throws Exception {
+		createTestEntityOneToOneMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, virtualPersistentAttribute.getMappingKey());
+		assertTrue(virtualPersistentAttribute.isVirtual());
+
+		EclipseLinkOneToOneMapping ormOneToOneMapping = (EclipseLinkOneToOneMapping) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", ormOneToOneMapping.getName());
+		assertEquals(FetchType.EAGER, ormOneToOneMapping.getFetch());
+		assertEquals(true, ormOneToOneMapping.isOptional());
+		assertEquals("test.Address", ormOneToOneMapping.getTargetEntity());
+		assertNull(ormOneToOneMapping.getRelationship().getMappedByStrategy().getMappedByAttribute());
+
+		//TODO default join columns in xml one-to-one
+//		XmlJoinColumn ormJoinColumn = ormOneToOneMapping.specifiedJoinColumns().next();
+//		//TODO java default columns name in JavaSingleRelationshipMapping.JoinColumnOwner
+//		//assertEquals("address", ormJoinColumn.getSpecifiedName());
+//		//assertEquals("address", ormJoinColumn.getSpecifiedReferencedColumnName());
+//		assertEquals(Boolean.FALSE, ormJoinColumn.getSpecifiedUnique());
+//		assertEquals(Boolean.TRUE, ormJoinColumn.getSpecifiedNullable());
+//		assertEquals(Boolean.TRUE, ormJoinColumn.getSpecifiedInsertable());
+//		assertEquals(Boolean.TRUE, ormJoinColumn.getSpecifiedUpdatable());
+//		assertNull(ormJoinColumn.getColumnDefinition());
+//		assertEquals(TYPE_NAME, ormJoinColumn.getSpecifiedTable());
+
+		Cascade cascade = ormOneToOneMapping.getCascade();
+		assertFalse(cascade.isAll());
+		assertFalse(cascade.isMerge());
+		assertFalse(cascade.isPersist());
+		assertFalse(cascade.isRemove());
+		assertFalse(cascade.isRefresh());
+
+		assertEquals(null, ormOneToOneMapping.getJoinFetch().getValue());
+		assertFalse(ormOneToOneMapping.getPrivateOwned().isPrivateOwned());
+	}
+	
+	public void testSpecifiedMapping() throws Exception {
+		createTestEntityOneToOneMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "address");
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		OrmEclipseLinkOneToOneMapping ormOneToOneMapping = (OrmEclipseLinkOneToOneMapping) ormPersistentAttribute.getMapping();
+		
+		assertEquals("address", ormOneToOneMapping.getName());
+		assertNull(ormOneToOneMapping.getSpecifiedFetch());
+		assertNull(ormOneToOneMapping.getSpecifiedOptional());
+		assertNull(ormOneToOneMapping.getSpecifiedTargetEntity());
+		assertNull(ormOneToOneMapping.getRelationship().getMappedByStrategy().getMappedByAttribute());
+		assertEquals(FetchType.EAGER, ormOneToOneMapping.getFetch());
+		assertEquals(true, ormOneToOneMapping.isOptional());
+		//TODO default target entity in xml
+		//assertEquals("test.Address", ormOneToOneMapping.getDefaultTargetEntity());
+		
+		assertTrue(ormOneToOneMapping.getRelationship().getJoinColumnStrategy().joinColumnsSize() > 0);
+		
+		//TODO default join columns for specified xmlOneToOne mapping
+//		XmlJoinColumn ormJoinColumn = ormOneToOneMapping.defaultJoinColumns().next();
+//		assertNull(ormJoinColumn.getSpecifiedName());
+//		assertNull(ormJoinColumn.getSpecifiedReferencedColumnName());
+//		assertNull(ormJoinColumn.getSpecifiedUnique());
+//		assertNull(ormJoinColumn.getSpecifiedNullable());
+//		assertNull(ormJoinColumn.getSpecifiedInsertable());
+//		assertNull(ormJoinColumn.getSpecifiedUpdatable());
+//		assertNull(ormJoinColumn.getColumnDefinition());
+//		assertNull(ormJoinColumn.getSpecifiedTable());
+//		
+//		assertEquals("address", ormJoinColumn.getDefaultName());
+//		assertEquals("address", ormJoinColumn.getDefaultReferencedColumnName());
+//		assertEquals(Boolean.FALSE, ormJoinColumn.getDefaultUnique());
+//		assertEquals(Boolean.TRUE, ormJoinColumn.getDefaultNullable());
+//		assertEquals(Boolean.TRUE, ormJoinColumn.getDefaultInsertable());
+//		assertEquals(Boolean.TRUE, ormJoinColumn.getDefaultUpdatable());
+//		assertEquals(null, ormJoinColumn.getColumnDefinition());
+//		assertEquals(TYPE_NAME, ormJoinColumn.getDefaultTable());
+
+		Cascade cascade = ormOneToOneMapping.getCascade();
+		assertFalse(cascade.isAll());
+		assertFalse(cascade.isMerge());
+		assertFalse(cascade.isPersist());
+		assertFalse(cascade.isRemove());
+		assertFalse(cascade.isRefresh());
+		
+		assertEquals(null, ormOneToOneMapping.getJoinFetch().getValue());
+		assertFalse(ormOneToOneMapping.getPrivateOwned().isPrivateOwned());
+	}
+
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmPersistentAttributeTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmPersistentAttributeTests.java
new file mode 100644
index 0000000..6c0078b
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmPersistentAttributeTests.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AccessType;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.internal.jpa1.context.java.GenericJavaNullAttributeMapping;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.persistence.PersistenceFactory;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlMappingFileRef;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkIdMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkOneToOneMapping;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmPersistentAttributeTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmPersistentAttributeTests(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		XmlMappingFileRef mappingFileRef = PersistenceFactory.eINSTANCE.createXmlMappingFileRef();
+		mappingFileRef.setFileName(JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.toString());
+		getXmlPersistenceUnit().getMappingFiles().add(mappingFileRef);
+		getPersistenceXmlResource().save(null);
+	}
+	
+	private ICompilationUnit createTestTypeNullAttributeMapping() throws Exception {
+	
+		return this.createTestType(new DefaultAnnotationWriter() {			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);			
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityIdMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, JPA.COLUMN);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Id");
+				sb.append("@Column(name=\"FOO\")");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityOneToOneMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToOne");
+				sb.append("    private Address address;");
+			}
+		});
+	}
+	
+	public void testMakeSpecified() throws Exception {
+		createTestType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		assertEquals("id", ormPersistentAttribute.getName());
+		assertTrue(ormPersistentAttribute.isVirtual());
+		ormPersistentAttribute.convertToSpecified();
+		
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		OrmPersistentAttribute specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		assertEquals("id", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		
+		ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ormPersistentAttribute.convertToSpecified();
+		
+		assertEquals(0, ormPersistentType.virtualAttributesSize());
+		assertEquals(2, ormPersistentType.specifiedAttributesSize());
+		Iterator<OrmPersistentAttribute> specifiedAttributes = ormPersistentType.specifiedAttributes();
+		specifiedOrmPersistentAttribute = specifiedAttributes.next();
+		assertEquals("id", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		
+		specifiedOrmPersistentAttribute = specifiedAttributes.next();
+		assertEquals("name", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+	}
+	
+	public void testMakeSpecifiedMappingKey() throws Exception {
+		createTestTypeNullAttributeMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		assertEquals(3, ormPersistentType.virtualAttributesSize());
+		
+		//take a virtual mapping with a mapping type and make it specified
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		assertEquals("address", ormPersistentAttribute.getName());
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof GenericJavaNullAttributeMapping);
+		ormPersistentAttribute.convertToSpecified(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		OrmPersistentAttribute specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		assertEquals("address", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		assertEquals(specifiedOrmPersistentAttribute.getMappingKey(), MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(specifiedOrmPersistentAttribute.getMapping() instanceof OrmEclipseLinkOneToOneMapping);
+		
+		ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ormPersistentAttribute.convertToSpecified(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY);
+		
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(2, ormPersistentType.specifiedAttributesSize());
+		Iterator<OrmPersistentAttribute> specifiedAttributes = ormPersistentType.specifiedAttributes();
+		
+		specifiedOrmPersistentAttribute = specifiedAttributes.next();
+		assertEquals("id", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		assertTrue(specifiedOrmPersistentAttribute.getMapping() instanceof OrmEclipseLinkIdMapping);
+		
+		specifiedOrmPersistentAttribute = specifiedAttributes.next();
+		assertEquals("address", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+	}
+	
+	public void testMakeVirtual() throws Exception {
+		createTestType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		
+		ormPersistentType.virtualAttributes().next().convertToSpecified();
+		ormPersistentType.virtualAttributes().next().convertToSpecified();
+
+		assertEquals(0, ormPersistentType.virtualAttributesSize());
+		assertEquals(2, ormPersistentType.specifiedAttributesSize());
+		OrmPersistentAttribute specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		assertEquals("id", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		
+		specifiedOrmPersistentAttribute.convertToVirtual();
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		
+		specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		specifiedOrmPersistentAttribute.convertToVirtual();
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		assertEquals(0, ormPersistentType.specifiedAttributesSize());
+		
+		Iterator<OrmReadOnlyPersistentAttribute> virtualAttributes = ormPersistentType.virtualAttributes();
+		OrmReadOnlyPersistentAttribute virtualAttribute = virtualAttributes.next();		
+		assertEquals("id", virtualAttribute.getName());
+		virtualAttribute = virtualAttributes.next();		
+		assertEquals("name", virtualAttribute.getName());
+	}
+	
+	public void testMakeVirtualNoUnderlyingJavaAttribute() throws Exception {
+		createTestType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		
+		ormPersistentType.virtualAttributes().next().convertToSpecified();
+		ormPersistentType.virtualAttributes().next().convertToSpecified();
+
+		
+		ormPersistentType.specifiedAttributes().next().getMapping().setName("noJavaAttribute");
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(2, ormPersistentType.specifiedAttributesSize());
+		
+		
+		OrmPersistentAttribute specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		specifiedOrmPersistentAttribute.convertToVirtual();
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		
+		assertEquals("id", ormPersistentType.virtualAttributes().next().getName());
+		assertEquals("name", ormPersistentType.specifiedAttributes().next().getName());
+	}
+	
+	public void testVirtualMappingTypeWhenMetadataComplete()  throws Exception {
+		createTestEntityIdMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		assertEquals("id", ormPersistentAttribute.getName());
+		assertEquals(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+		assertEquals("FOO", ((IdMapping) ormPersistentAttribute.getMapping()).getColumn().getName());
+		
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertEquals("id", ormPersistentAttribute.getName());
+		assertEquals(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+		assertEquals("id", ((BasicMapping) ormPersistentAttribute.getMapping()).getColumn().getName());
+	}
+	
+	public void testVirtualMappingTypeWhenMetadataComplete2()  throws Exception {
+		createTestEntityOneToOneMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		assertEquals("address", ormPersistentAttribute.getName());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+		
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+		assertEquals("address", ormPersistentAttribute.getName());
+		assertEquals(MappingKeys.NULL_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+	}
+	
+	public void testGetJavaPersistentAttribute() throws Exception {
+		createTestEntityIdMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaPersistentType javaPersistentType = ormPersistentType.getJavaPersistentType();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		JavaPersistentAttribute javaPersistentAttribute = javaPersistentType.getAttributeNamed("id");
+			
+		//virtual orm attribute, access type matches java : FIELD, name matches java
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertNotSame(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+		JavaResourcePersistentAttribute javaResourcePersistentAttribute = ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute();
+		assertTrue(javaResourcePersistentAttribute.isField());
+		assertEquals("id", javaResourcePersistentAttribute.getName());
+		assertEquals(javaPersistentType.getResourcePersistentType().persistableFields().next(), javaResourcePersistentAttribute);
+		
+		
+		//specified orm attribute, access type matches java : FIELD, name matches java
+		//javaPersistentAttribute should be == to java context model object
+		ormPersistentAttribute.convertToSpecified();
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertFalse(ormPersistentAttribute.isVirtual());
+		assertEquals(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+	
+		
+		//virtual orm attribute, java access type FIELD, orm access type PROPERTY, name matches java
+		//verify the property java resource persistent attribute is used in orm.
+		((OrmPersistentAttribute) ormPersistentAttribute).convertToVirtual();
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");		
+		ormPersistentType.setSpecifiedAccess(AccessType.PROPERTY);
+		assertNotSame(ormPersistentAttribute, ormPersistentType.getAttributeNamed("id"));
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertNotSame(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+		javaResourcePersistentAttribute = ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute();
+		assertTrue(javaResourcePersistentAttribute.isProperty());
+		assertEquals("id", javaResourcePersistentAttribute.getName());
+		assertEquals(javaPersistentType.getResourcePersistentType().persistableProperties().next(), javaResourcePersistentAttribute);
+		
+		
+		ormPersistentType.setSpecifiedAccess(null);//default access will be field
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");		
+		OrmPersistentAttribute ormPersistentAttribute2 = ormPersistentAttribute.convertToSpecified();
+		ormPersistentAttribute2.getMapping().setName("id2");
+		assertEquals(null, ormPersistentAttribute2.getJavaPersistentAttribute());
+		
+		ormPersistentAttribute2.getMapping().setName(null);
+		assertEquals(null, ormPersistentAttribute2.getJavaPersistentAttribute());
+
+		ormPersistentAttribute2.getMapping().setName("id");
+		assertEquals(javaPersistentAttribute, ormPersistentAttribute2.getJavaPersistentAttribute());
+
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(javaPersistentAttribute, ormPersistentAttribute2.getJavaPersistentAttribute());
+	}
+
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmStructConverterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmStructConverterTests.java
new file mode 100644
index 0000000..f6a3cfc
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmStructConverterTests.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlBasic;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlStructConverter;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmStructConverterTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithBasicMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC, EclipseLink.CONVERT, EclipseLink.STRUCT_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+				sb.append("    @Convert(name=\"foo\")").append(CR);
+				sb.append("    @StructConverter");
+			}
+		});
+	}
+
+	
+	public EclipseLinkOrmStructConverterTests(String name) {
+		super(name);
+	}
+	
+	
+	public void testUpdateConverter() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping(); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkStructConverter.class);
+		EclipseLinkStructConverter ormConverter = (EclipseLinkStructConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlStructConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getStructConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getConverterClass());
+		assertEquals(null, converterResource.getConverter());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setConverter("myConvert");
+		assertEquals("myConvert", ormConverter.getConverterClass());
+		assertEquals("myConvert", converterResource.getConverter());
+
+		//set converter class name to null in the resource model
+		converterResource.setConverter(null);
+		assertEquals(null, ormConverter.getConverterClass());
+		assertEquals(null, converterResource.getConverter());
+		
+				
+		//remove the specified persistent attribute, test virtual mapping	
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		ormConverter = (EclipseLinkStructConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkStructConverter javaConverter = ((EclipseLinkStructConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setConverterClass("bar");
+		assertEquals("bar", ormConverter.getConverterClass());
+		assertEquals("bar", javaConverter.getConverterClass());
+		
+		//set metadata-complete, test virtual mapping	
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getConverterClass());
+	}
+	
+	public void testModifyConverter() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkStructConverter.class);
+		EclipseLinkStructConverter ormConverter = (EclipseLinkStructConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlStructConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getStructConverter();
+	
+		assertEquals(null, ormConverter.getConverterClass());
+		assertEquals(null, converterResource.getConverter());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setConverterClass("foo");
+		assertEquals("foo", ormConverter.getConverterClass());
+		assertEquals("foo", converterResource.getConverter());
+	
+		ormConverter.setConverterClass(null);
+		assertEquals(null, ormConverter.getConverterClass());
+		assertEquals(null, converterResource.getConverter());
+	}
+	
+	public void testUpdateName() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkStructConverter.class);
+		OrmEclipseLinkStructConverter ormConverter = (OrmEclipseLinkStructConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlStructConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getStructConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setName("myConvert");
+		assertEquals("myConvert", ormConverter.getName());
+		assertEquals("myConvert", converterResource.getName());
+
+		//set converter class name to null in the resource model
+		converterResource.setName(null);
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+		
+
+		//remove the specified persistent attribute, test virtual mapping	
+				
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		EclipseLinkStructConverter virtualConverter = (EclipseLinkStructConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkStructConverter javaConverter = ((EclipseLinkStructConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setName("bar");
+		assertEquals("bar", virtualConverter.getName());
+		assertEquals("bar", javaConverter.getName());
+		
+		
+		//set metadata-complete, test virtual mapping
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.virtualAttributes().next();
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getName());
+	}
+	
+	public void testModifyName() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkStructConverter.class);
+		OrmEclipseLinkStructConverter ormConverter = (OrmEclipseLinkStructConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlStructConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getStructConverter();
+	
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setName("foo");
+		assertEquals("foo", ormConverter.getName());
+		assertEquals("foo", converterResource.getName());
+	
+		ormConverter.setName(null);
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmTransientMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmTransientMappingTests.java
new file mode 100644
index 0000000..1af98f5
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmTransientMappingTests.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmTransientMappingTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmTransientMappingTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestEntityWithTransientMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.TRANSIENT);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Transient").append(CR);
+			}
+		});
+	}
+	
+	public void testCreateTransientMapping() throws Exception {
+		createTestEntityWithTransientMapping();
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		OrmReadOnlyPersistentAttribute persistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertTrue(persistentAttribute.isVirtual());
+		assertEquals(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getMappingKey());
+		
+		OrmPersistentAttribute persistentAttribute2 = persistentAttribute.convertToSpecified(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY);
+		assertFalse(persistentAttribute2.isVirtual());
+		assertEquals(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY, persistentAttribute2.getMappingKey());
+		assertEquals(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY, persistentAttribute2.getMapping().getKey());
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmTypeConverterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmTypeConverterTests.java
new file mode 100644
index 0000000..e08e36a
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmTypeConverterTests.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlBasic;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTypeConverter;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmTypeConverterTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	
+	private ICompilationUnit createTestEntityWithBasicMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC, EclipseLink.CONVERT, EclipseLink.TYPE_CONVERTER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Basic").append(CR);
+				sb.append("    @Convert(name=\"foo\")").append(CR);
+				sb.append("    @TypeConverter");
+			}
+		});
+	}
+
+	
+	public EclipseLinkOrmTypeConverterTests(String name) {
+		super(name);
+	}
+	
+	
+	public void testUpdateDataType() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping(); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkTypeConverter.class);
+		EclipseLinkTypeConverter ormConverter = (EclipseLinkTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getTypeConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getDataType());
+		assertEquals(null, converterResource.getDataType());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setDataType("myConvert");
+		assertEquals("myConvert", ormConverter.getDataType());
+		assertEquals("myConvert", converterResource.getDataType());
+
+		//set converter class name to null in the resource model
+		converterResource.setDataType(null);
+		assertEquals(null, ormConverter.getDataType());
+		assertEquals(null, converterResource.getDataType());
+		
+				
+		//remove the specified persistent attribute, test virtual mapping	
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		ormConverter = (EclipseLinkTypeConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkTypeConverter javaConverter = ((EclipseLinkTypeConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setDataType("bar");
+		assertEquals("bar", ormConverter.getDataType());
+		assertEquals("bar", javaConverter.getDataType());
+		
+		//set metadata-complete, test virtual mapping	
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getDataType());
+	}
+	
+	public void testModifyDataType() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkTypeConverter.class);
+		EclipseLinkTypeConverter ormConverter = (EclipseLinkTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getTypeConverter();
+	
+		assertEquals(null, ormConverter.getDataType());
+		assertEquals(null, converterResource.getDataType());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setDataType("foo");
+		assertEquals("foo", ormConverter.getDataType());
+		assertEquals("foo", converterResource.getDataType());
+	
+		ormConverter.setDataType(null);
+		assertEquals(null, ormConverter.getDataType());
+		assertEquals(null, converterResource.getDataType());
+	}
+	
+	public void testUpdateObjectType() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = (OrmBasicMapping) ormPersistentAttribute.getMapping(); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkTypeConverter.class);
+		EclipseLinkTypeConverter ormConverter = (EclipseLinkTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getTypeConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getObjectType());
+		assertEquals(null, converterResource.getObjectType());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setObjectType("myConvert");
+		assertEquals("myConvert", ormConverter.getObjectType());
+		assertEquals("myConvert", converterResource.getObjectType());
+
+		//set converter class name to null in the resource model
+		converterResource.setObjectType(null);
+		assertEquals(null, ormConverter.getObjectType());
+		assertEquals(null, converterResource.getObjectType());
+		
+				
+		//remove the specified persistent attribute, test virtual mapping	
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		ormConverter = (EclipseLinkTypeConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkTypeConverter javaConverter = ((EclipseLinkTypeConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setObjectType("bar");
+		assertEquals("bar", ormConverter.getObjectType());
+		assertEquals("bar", javaConverter.getObjectType());
+		
+		//set metadata-complete, test virtual mapping	
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getObjectType());
+	}
+	
+	public void testModifyObjectType() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkTypeConverter.class);
+		EclipseLinkTypeConverter ormConverter = (EclipseLinkTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getTypeConverter();
+	
+		assertEquals(null, ormConverter.getObjectType());
+		assertEquals(null, converterResource.getObjectType());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setObjectType("foo");
+		assertEquals("foo", ormConverter.getObjectType());
+		assertEquals("foo", converterResource.getObjectType());
+	
+		ormConverter.setObjectType(null);
+		assertEquals(null, ormConverter.getObjectType());
+		assertEquals(null, converterResource.getObjectType());
+	}
+	
+	public void testUpdateName() throws Exception {
+		createTestEntityWithBasicMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkTypeConverter.class);
+		OrmEclipseLinkTypeConverter ormConverter = (OrmEclipseLinkTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getTypeConverter();
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+				
+		//set converter class name in the resource model, verify context model updated
+		converterResource.setName("myConvert");
+		assertEquals("myConvert", ormConverter.getName());
+		assertEquals("myConvert", converterResource.getName());
+
+		//set converter class name to null in the resource model
+		converterResource.setName(null);
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+		
+
+		//remove the specified persistent attribute, test virtual mapping	
+		ormPersistentAttribute.convertToVirtual();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		BasicMapping virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		EclipseLinkTypeConverter virtualConverter = (EclipseLinkTypeConverter) ((EclipseLinkConvert) virtualBasicMapping.getConverter()).getConverter();
+		
+		EclipseLinkTypeConverter javaConverter = ((EclipseLinkTypeConverter) ((EclipseLinkConvert) javaBasicMapping.getConverter()).getConverter());
+		javaConverter.setName("bar");
+		assertEquals("bar", virtualConverter.getName());
+		assertEquals("bar", javaConverter.getName());
+		
+		
+		//set metadata-complete, test virtual mapping
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.virtualAttributes().next();
+		virtualBasicMapping = (BasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(virtualBasicMapping.getConverter().getType());
+		assertEquals("bar", javaConverter.getName());
+	}
+	
+	public void testModifyName() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmBasicMapping ormBasicMapping = ((OrmBasicMapping) ormPersistentAttribute.getMapping()); 
+		ormBasicMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) ormBasicMapping.getConverter()).setConverter(EclipseLinkTypeConverter.class);
+		OrmEclipseLinkTypeConverter ormConverter = (OrmEclipseLinkTypeConverter) ((EclipseLinkConvert) ormBasicMapping.getConverter()).getConverter();
+		XmlTypeConverter converterResource = ((XmlBasic) getXmlEntityMappings().getEntities().get(0).getAttributes().getBasics().get(0)).getTypeConverter();
+	
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+				
+		//set converter class in the context model, verify resource model updated
+		ormConverter.setName("foo");
+		assertEquals("foo", ormConverter.getName());
+		assertEquals("foo", converterResource.getName());
+	
+		ormConverter.setName(null);
+		assertEquals(null, ormConverter.getName());
+		assertEquals(null, converterResource.getName());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmVersionMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmVersionMappingTests.java
new file mode 100644
index 0000000..e9483ba
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkOrmVersionMappingTests.java
@@ -0,0 +1,387 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.VersionMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaVersionMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmVersionMapping;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkBasicMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConvert;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkVersionMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkVersionMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlVersion;
+
+@SuppressWarnings("nls")
+public class EclipseLinkOrmVersionMappingTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkOrmVersionMappingTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestEntityWithVersionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.VERSION);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Version").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithMutableVersionDate() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.VERSION, EclipseLink.MUTABLE, "java.util.Date");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Version").append(CR);
+				sb.append("    @Mutable").append(CR);
+				sb.append("    private Date myDate;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+	
+	public void testUpdateMutable() throws Exception {
+		createTestEntityWithVersionMapping();
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmEclipseLinkVersionMapping contextVersion = 
+			(OrmEclipseLinkVersionMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlVersion resourceVersion = 
+			(XmlVersion) resourceEntity.getAttributes().getVersions().get(0);
+		EclipseLinkVersionMapping javaVersionMapping = (EclipseLinkVersionMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		// check defaults
+		
+		assertNull(resourceVersion.getMutable());
+		assertTrue(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertTrue(contextVersion.getMutable().isMutable());
+		
+		// set xml mutable to false, check context
+		
+		resourceVersion.setMutable(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceVersion.getMutable());
+		assertTrue(contextVersion.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+		
+		// set xml mutable to true, check context
+		
+		resourceVersion.setMutable(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceVersion.getMutable());
+		assertTrue(contextVersion.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, contextVersion.getMutable().getSpecifiedMutable());
+		assertTrue(contextVersion.getMutable().isMutable());
+		
+		// clear xml mutable, check context
+		
+		resourceVersion.setMutable(null);
+		
+		assertNull(resourceVersion.getMutable());
+		assertTrue(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertTrue(contextVersion.getMutable().isMutable());
+		
+		// TODO - test defaults for java serializable and date/time types, 
+		// with and without persistence property
+		
+		// set mutable on java basic mapping
+		
+		javaVersionMapping.getMutable().setSpecifiedMutable(Boolean.FALSE);
+		assertNull(resourceVersion.getMutable());
+		assertTrue(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertTrue(contextVersion.getMutable().isMutable());
+		assertFalse(javaVersionMapping.getMutable().isMutable());
+		
+		// remove attribute from xml, test default mutable from java
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		EclipseLinkVersionMapping virtualContextVersion = (EclipseLinkVersionMapping) ormPersistentAttribute2.getMapping();
+		
+		assertNull(resourceVersion.getMutable());
+		assertTrue(virtualContextVersion.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, virtualContextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(virtualContextVersion.getMutable().isMutable());
+		assertFalse(javaVersionMapping.getMutable().isMutable());
+		
+		// set metadata complete
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		EclipseLinkBasicMapping contextBasic = (EclipseLinkBasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(resourceVersion.getMutable());
+		assertTrue(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertTrue(contextBasic.getMutable().isMutable());
+		assertFalse(javaVersionMapping.getMutable().isMutable());
+	}
+	
+	public void testUpdateMutableDate() throws Exception {
+		createTestEntityWithMutableVersionDate();
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY, "myDate");
+		OrmEclipseLinkVersionMapping contextVersion = 
+			(OrmEclipseLinkVersionMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlVersion resourceVersion = 
+			(XmlVersion) resourceEntity.getAttributes().getVersions().get(0);
+		EclipseLinkVersionMapping javaVersionMapping = (EclipseLinkVersionMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("myDate").getMapping();
+		
+		// check defaults
+		
+		assertNull(resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+		
+		// set xml mutable to false, check context
+		
+		resourceVersion.setMutable(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+		
+		// set xml mutable to true, check context
+		
+		resourceVersion.setMutable(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, contextVersion.getMutable().getSpecifiedMutable());
+		assertTrue(contextVersion.getMutable().isMutable());
+		
+		// clear xml mutable, check context
+		
+		resourceVersion.setMutable(null);
+		
+		assertNull(resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+		
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(Boolean.TRUE);
+		assertNull(resourceVersion.getMutable());
+		assertTrue(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertTrue(contextVersion.getMutable().isMutable());
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(Boolean.FALSE);
+		assertNull(resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+		
+		getPersistenceUnit().getOptions().setTemporalMutable(null);
+		assertNull(resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+		
+		// set mutable on java version mapping
+		
+		javaVersionMapping.getMutable().setSpecifiedMutable(Boolean.TRUE);
+		assertNull(resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+		assertTrue(javaVersionMapping.getMutable().isMutable());
+		
+		// remove attribute from xml, test default mutable from java
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("myDate");
+		EclipseLinkVersionMapping virtualContextVersion = (EclipseLinkVersionMapping) ormPersistentAttribute2.getMapping();
+		
+		assertNull(resourceVersion.getMutable());
+		assertFalse(virtualContextVersion.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, virtualContextVersion.getMutable().getSpecifiedMutable());
+		assertTrue(virtualContextVersion.getMutable().isMutable());
+		assertTrue(javaVersionMapping.getMutable().isMutable());
+		
+		// set metadata complete
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("myDate");
+		EclipseLinkBasicMapping contextBasic = (EclipseLinkBasicMapping) ormPersistentAttribute2.getMapping();
+		assertNull(resourceVersion.getMutable());
+		assertFalse(contextBasic.getMutable().isDefaultMutable());
+		assertNull(contextBasic.getMutable().getSpecifiedMutable());
+		assertFalse(contextBasic.getMutable().isMutable());
+		assertTrue(javaVersionMapping.getMutable().isMutable());
+	}
+	
+	public void testModifyMutable() throws Exception {
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute =
+			ormPersistentType.addSpecifiedAttribute(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY, "basic");
+		OrmEclipseLinkVersionMapping contextVersion = 
+			(OrmEclipseLinkVersionMapping) ormPersistentAttribute.getMapping();
+		XmlEntity resourceEntity = 
+			(XmlEntity)getXmlEntityMappings().getEntities().get(0);
+		XmlVersion resourceVersion = 
+			(XmlVersion) resourceEntity.getAttributes().getVersions().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+		
+		// set context mutable to true, check resource
+		
+		contextVersion.getMutable().setSpecifiedMutable(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertEquals(Boolean.TRUE, contextVersion.getMutable().getSpecifiedMutable());
+		assertTrue(contextVersion.getMutable().isMutable());
+		
+		// set context mutable to false, check resource
+		
+		contextVersion.getMutable().setSpecifiedMutable(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertEquals(Boolean.FALSE, contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+		
+		// set context read only to null, check resource
+		
+		contextVersion.getMutable().setSpecifiedMutable(null);
+		
+		assertNull(resourceVersion.getMutable());
+		assertFalse(contextVersion.getMutable().isDefaultMutable());
+		assertNull(contextVersion.getMutable().getSpecifiedMutable());
+		assertFalse(contextVersion.getMutable().isMutable());
+	}
+	
+	public void testUpdateConvert() throws Exception {
+		createTestEntityWithVersionMapping();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY, "id");
+		OrmVersionMapping ormVersionMapping = (OrmVersionMapping) ormPersistentAttribute.getMapping();
+		XmlVersion basicResource = (XmlVersion) getXmlEntityMappings().getEntities().get(0).getAttributes().getVersions().get(0);
+		JavaVersionMapping javaVersionMapping = (JavaVersionMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("id").getMapping();
+		
+		assertNull(ormVersionMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+				
+		//set lob in the resource model, verify context model updated
+		basicResource.setConvert("myConvert");
+		assertEquals(EclipseLinkConvert.class, ormVersionMapping.getConverter().getType());
+		assertEquals("myConvert", basicResource.getConvert());
+
+		//set lob to null in the resource model
+		basicResource.setConvert(null);
+		assertNull(ormVersionMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+		
+		
+		javaVersionMapping.setConverter(EclipseLinkConvert.class);
+		((EclipseLinkConvert) javaVersionMapping.getConverter()).setSpecifiedConverterName("foo");
+		
+		assertNull(ormVersionMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+		assertEquals("foo", ((EclipseLinkConvert) javaVersionMapping.getConverter()).getSpecifiedConverterName());
+		
+		
+		ormPersistentAttribute.convertToVirtual();
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("id");
+		VersionMapping virtualVersionMapping = (VersionMapping) ormPersistentAttribute2.getMapping();
+		
+		assertEquals(EclipseLinkConvert.class, virtualVersionMapping.getConverter().getType());
+		assertEquals("foo", ((EclipseLinkConvert) virtualVersionMapping.getConverter()).getSpecifiedConverterName());
+		assertEquals(null, basicResource.getConvert());
+		assertEquals("foo", ((EclipseLinkConvert) javaVersionMapping.getConverter()).getSpecifiedConverterName());
+		
+		((EclipseLinkConvert) javaVersionMapping.getConverter()).setSpecifiedConverterName("bar");
+		assertEquals(EclipseLinkConvert.class, virtualVersionMapping.getConverter().getType());
+		assertEquals("bar", ((EclipseLinkConvert) virtualVersionMapping.getConverter()).getSpecifiedConverterName());
+		assertEquals(null, basicResource.getConvert());
+		assertEquals("bar", ((EclipseLinkConvert) javaVersionMapping.getConverter()).getSpecifiedConverterName());
+
+		javaVersionMapping.setConverter(null);
+		assertNull(virtualVersionMapping.getConverter().getType());
+		assertNull(basicResource.getConvert());
+		assertNull(javaVersionMapping.getConverter().getType());
+	}
+	
+	public void testModifyConvert() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY, "basicMapping");
+		OrmVersionMapping ormVersionMapping = (OrmVersionMapping) ormPersistentAttribute.getMapping();
+		XmlVersion basicResource = (XmlVersion) getXmlEntityMappings().getEntities().get(0).getAttributes().getVersions().get(0);
+	
+		assertNull(ormVersionMapping.getConverter().getType());
+		assertNull(basicResource.getConvert());
+				
+		//set lob in the context model, verify resource model updated
+		ormVersionMapping.setConverter(EclipseLinkConvert.class);
+		assertEquals("", basicResource.getConvert());
+		assertEquals(EclipseLinkConvert.class, ormVersionMapping.getConverter().getType());
+	
+		((EclipseLinkConvert) ormVersionMapping.getConverter()).setSpecifiedConverterName("bar");
+		assertEquals("bar", basicResource.getConvert());
+		assertEquals(EclipseLinkConvert.class, ormVersionMapping.getConverter().getType());
+		assertEquals("bar", ((EclipseLinkConvert) ormVersionMapping.getConverter()).getSpecifiedConverterName());
+
+		((EclipseLinkConvert) ormVersionMapping.getConverter()).setSpecifiedConverterName(null);
+
+		assertNull(ormVersionMapping.getConverter().getType());
+		assertEquals(null, basicResource.getConvert());
+
+		//set lob to false in the context model
+		ormVersionMapping.setConverter(null);
+		assertNull(ormVersionMapping.getConverter().getType());
+		assertNull(basicResource.getConvert());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkPersistenceUnitDefaultsTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkPersistenceUnitDefaultsTests.java
new file mode 100644
index 0000000..4375217
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkPersistenceUnitDefaultsTests.java
@@ -0,0 +1,369 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import org.eclipse.jpt.jpa.core.context.AccessType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistenceUnitDefaults;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlPersistenceUnitMetadata;
+import org.eclipse.jpt.jpa.core.resource.persistence.PersistenceFactory;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlMappingFileRef;
+import org.eclipse.jpt.jpa.eclipselink.core.JptJpaEclipseLinkCorePlugin;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
+
+@SuppressWarnings("nls")
+public class EclipseLinkPersistenceUnitDefaultsTests extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkPersistenceUnitDefaultsTests(String name) {
+		super(name);
+	}
+	
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		XmlMappingFileRef mappingFileRef = PersistenceFactory.eINSTANCE.createXmlMappingFileRef();
+		mappingFileRef.setFileName(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH.toString());
+		getXmlPersistenceUnit().getMappingFiles().add(mappingFileRef);
+		getPersistenceXmlResource().save(null);
+	}
+	
+	protected OrmPersistenceUnitDefaults persistenceUnitDefaults() {
+		return getEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults();
+	}
+	
+	public void testIsAllFeaturesUnset() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getAccess());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		XmlPersistenceUnitMetadata persistenceUnitMetadata = EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata();
+		getXmlEntityMappings().setPersistenceUnitMetadata(persistenceUnitMetadata);
+		assertTrue(persistenceUnitMetadata.isUnset());
+		
+		org.eclipse.jpt.jpa.core.resource.orm.XmlPersistenceUnitDefaults persistenceUnitDefaultsResource = OrmFactory.eINSTANCE.createXmlPersistenceUnitDefaults();
+		persistenceUnitMetadata.setPersistenceUnitDefaults(persistenceUnitDefaultsResource);
+		assertTrue(persistenceUnitDefaultsResource.isUnset());
+		
+		persistenceUnitDefaultsResource.setCascadePersist(true);
+		assertFalse(persistenceUnitDefaultsResource.isUnset());
+		
+		persistenceUnitDefaultsResource.setCascadePersist(false);
+		assertTrue(persistenceUnitDefaultsResource.isUnset());
+		
+		persistenceUnitDefaultsResource.setSchema("asdf");
+		assertFalse(persistenceUnitDefaultsResource.isUnset());
+		
+		persistenceUnitDefaultsResource.setSchema(null);
+		assertTrue(persistenceUnitDefaultsResource.isUnset());
+		
+		persistenceUnitDefaultsResource.setCatalog("asdf");
+		assertFalse(persistenceUnitDefaultsResource.isUnset());
+		
+		persistenceUnitDefaultsResource.setCatalog(null);
+		assertTrue(persistenceUnitDefaultsResource.isUnset());
+		
+		
+		persistenceUnitDefaultsResource.setAccess(org.eclipse.jpt.jpa.core.resource.orm.AccessType.PROPERTY);
+		assertFalse(persistenceUnitDefaultsResource.isUnset());
+		
+		persistenceUnitDefaultsResource.setAccess(org.eclipse.jpt.jpa.core.resource.orm.AccessType.FIELD);
+		assertFalse(persistenceUnitDefaultsResource.isUnset());
+		
+		persistenceUnitDefaultsResource.setAccess(null);
+		assertTrue(persistenceUnitDefaultsResource.isUnset());
+	}
+
+	public void testUpdateSchema() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getSchema());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set schema in the resource model, verify context model updated
+		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
+		getXmlEntityMappings().getPersistenceUnitMetadata().setPersistenceUnitDefaults(OrmFactory.eINSTANCE.createXmlPersistenceUnitDefaults());
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setSchema("MY_SCHEMA");
+		assertEquals("MY_SCHEMA", persistenceUnitDefaults.getSchema());
+		assertEquals("MY_SCHEMA", getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getSchema());
+	
+		//set schema to null in the resource model
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setSchema(null);
+		assertNull(persistenceUnitDefaults.getSchema());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getSchema());
+	}
+	
+	public void testModifySchema() throws Exception {		
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getSchema());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set schema in the context model, verify resource model modified
+		persistenceUnitDefaults.setSpecifiedSchema("MY_SCHEMA");
+		assertEquals("MY_SCHEMA", persistenceUnitDefaults.getSchema());
+		assertEquals("MY_SCHEMA", getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getSchema());
+		
+		//set schema to null in the context model
+		persistenceUnitDefaults.setSpecifiedSchema(null);
+		assertNull(persistenceUnitDefaults.getSchema());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+	}
+	
+	public void testModifySchema2() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getSchema());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set schema in the context model, verify resource model modified
+		persistenceUnitDefaults.setSpecifiedSchema("MY_SCHEMA");
+		assertEquals("MY_SCHEMA", persistenceUnitDefaults.getSchema());
+		assertEquals("MY_SCHEMA", getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getSchema());
+		
+		//set another element on the persistence-unit-defaults element so it doesn't get removed
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setCatalog("MY_CATALOG");
+		//set schema to null in the context model
+		persistenceUnitDefaults.setSpecifiedSchema(null);
+		assertNull(persistenceUnitDefaults.getSchema());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getSchema());
+	}
+	
+	public void testModifySchema3() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getSchema());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		//set another element on the persistence-unit-metadata element so only persistence-unit-defaults element gets removed
+		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
+		getXmlEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		
+		//set schema in the context model, verify resource model modified
+		persistenceUnitDefaults.setSpecifiedSchema("MY_SCHEMA");
+		assertEquals("MY_SCHEMA", persistenceUnitDefaults.getSchema());
+		assertEquals("MY_SCHEMA", getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getSchema());
+		
+		//set schema to null in the context model
+		persistenceUnitDefaults.setSpecifiedSchema(null);
+		assertNull(persistenceUnitDefaults.getSchema());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults());
+	}
+	
+	public void testUpdateCatalog() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getCatalog());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set catalog in the resource model, verify context model updated
+		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
+		getXmlEntityMappings().getPersistenceUnitMetadata().setPersistenceUnitDefaults(OrmFactory.eINSTANCE.createXmlPersistenceUnitDefaults());
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setCatalog("MY_CATALOG");
+		assertEquals("MY_CATALOG", persistenceUnitDefaults.getCatalog());
+		assertEquals("MY_CATALOG", getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getCatalog());
+	
+		//set catalog to null in the resource model
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setCatalog(null);
+		assertNull(persistenceUnitDefaults.getCatalog());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getCatalog());
+	}
+	
+	public void testModifyCatalog() throws Exception {		
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getCatalog());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set catalog in the context model, verify resource model modified
+		persistenceUnitDefaults.setSpecifiedCatalog("MY_CATALOG");
+		assertEquals("MY_CATALOG", persistenceUnitDefaults.getCatalog());
+		assertEquals("MY_CATALOG", getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getCatalog());
+		
+		//set catalog to null in the context model
+		persistenceUnitDefaults.setSpecifiedCatalog(null);
+		assertNull(persistenceUnitDefaults.getCatalog());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+	}
+	
+	public void testModifyCatalog2() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getCatalog());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set catalog in the context model, verify resource model modified
+		persistenceUnitDefaults.setSpecifiedCatalog("MY_CATALOG");
+		assertEquals("MY_CATALOG", persistenceUnitDefaults.getCatalog());
+		assertEquals("MY_CATALOG", getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getCatalog());
+		
+		//set another element on the persistence-unit-defaults element so it doesn't get removed
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setSchema("MY_SCHEMA");
+		//set catalog to null in the context model
+		persistenceUnitDefaults.setSpecifiedCatalog(null);
+		assertNull(persistenceUnitDefaults.getCatalog());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getCatalog());
+	}
+	
+	public void testModifyCatalog3() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getCatalog());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		//set another element on the persistence-unit-metadata element so only persistence-unit-defaults element gets removed
+		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
+		getXmlEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		
+		//set catalog in the context model, verify resource model modified
+		persistenceUnitDefaults.setSpecifiedCatalog("MY_CATALOG");
+		assertEquals("MY_CATALOG", persistenceUnitDefaults.getCatalog());
+		assertEquals("MY_CATALOG", getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getCatalog());
+		
+		//set catalog to null in the context model
+		persistenceUnitDefaults.setSpecifiedCatalog(null);
+		assertNull(persistenceUnitDefaults.getCatalog());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults());
+	}
+	
+	public void testUpdateCascadePersist() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertFalse(persistenceUnitDefaults.isCascadePersist());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set cascadePersist in the resource model, verify context model updated
+		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
+		getXmlEntityMappings().getPersistenceUnitMetadata().setPersistenceUnitDefaults(OrmFactory.eINSTANCE.createXmlPersistenceUnitDefaults());
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setCascadePersist(true);
+		assertTrue(persistenceUnitDefaults.isCascadePersist());
+		assertTrue(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().isCascadePersist());
+	
+		//set cascadePersist to null in the resource model, persistence-unit-defaults tag not removed
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setCascadePersist(false);
+		assertFalse(persistenceUnitDefaults.isCascadePersist());
+		assertFalse(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().isCascadePersist());
+	}
+	
+	public void testModifyCascadePersist() throws Exception {		
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertFalse(persistenceUnitDefaults.isCascadePersist());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set cascadePersist in the context model, verify resource model modified
+		persistenceUnitDefaults.setCascadePersist(true);
+		assertTrue(persistenceUnitDefaults.isCascadePersist());
+		assertTrue(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().isCascadePersist());
+		
+		//set cascadePersist to null in the context model
+		persistenceUnitDefaults.setCascadePersist(false);
+		assertFalse(persistenceUnitDefaults.isCascadePersist());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+	}
+	
+	public void testModifyCascadePersist2() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertFalse(persistenceUnitDefaults.isCascadePersist());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set cascadePersist in the context model, verify resource model modified
+		persistenceUnitDefaults.setCascadePersist(true);
+		assertTrue(persistenceUnitDefaults.isCascadePersist());
+		assertTrue(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().isCascadePersist());
+		
+		//set another element on the persistence-unit-defaults element so it doesn't get removed
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setCatalog("MY_CATALOG");
+		//set cascadePersist to null in the context model
+		persistenceUnitDefaults.setCascadePersist(false);
+		assertFalse(persistenceUnitDefaults.isCascadePersist());
+		assertFalse(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().isCascadePersist());
+	}
+	
+	public void testModifyCascadePersist3() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertFalse(persistenceUnitDefaults.isCascadePersist());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		//set another element on the persistence-unit-metadata element so only persistence-unit-defaults element gets removed
+		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
+		getXmlEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		
+		//set cascadePersist in the context model, verify resource model modified
+		persistenceUnitDefaults.setCascadePersist(true);
+		assertTrue(persistenceUnitDefaults.isCascadePersist());
+		assertTrue(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().isCascadePersist());
+		
+		//set cascadePersist to null in the context model
+		persistenceUnitDefaults.setCascadePersist(false);
+		assertFalse(persistenceUnitDefaults.isCascadePersist());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults());
+	}
+	
+	
+	public void testUpdateAccess() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getAccess());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set access in the resource model, verify context model updated
+		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
+		getXmlEntityMappings().getPersistenceUnitMetadata().setPersistenceUnitDefaults(OrmFactory.eINSTANCE.createXmlPersistenceUnitDefaults());
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setAccess(org.eclipse.jpt.jpa.core.resource.orm.AccessType.FIELD);
+		assertEquals(AccessType.FIELD, persistenceUnitDefaults.getAccess());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.AccessType.FIELD, getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getAccess());
+	
+		//set access to null in the resource model
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setAccess(null);
+		assertNull(persistenceUnitDefaults.getAccess());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getAccess());
+	}
+	
+	public void testModifyAccess() throws Exception {		
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getAccess());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set access in the context model, verify resource model modified
+		persistenceUnitDefaults.setAccess(AccessType.PROPERTY);
+		assertEquals(AccessType.PROPERTY, persistenceUnitDefaults.getAccess());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.AccessType.PROPERTY, getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getAccess());
+		
+		//set access to null in the context model
+		persistenceUnitDefaults.setAccess(null);
+		assertNull(persistenceUnitDefaults.getAccess());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+	}
+	
+	public void testModifyAccess2() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getAccess());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set access in the context model, verify resource model modified
+		persistenceUnitDefaults.setAccess(AccessType.FIELD);
+		assertEquals(AccessType.FIELD, persistenceUnitDefaults.getAccess());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.AccessType.FIELD, getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getAccess());
+		
+		//set another element on the persistence-unit-defaults element so it doesn't get removed
+		getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setCascadePersist(true);
+		//set access to null in the context model
+		persistenceUnitDefaults.setAccess(null);
+		assertNull(persistenceUnitDefaults.getAccess());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getAccess());
+	}
+	
+	public void testModifyAccess3() throws Exception {
+		OrmPersistenceUnitDefaults persistenceUnitDefaults = persistenceUnitDefaults();
+		assertNull(persistenceUnitDefaults.getAccess());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		//set another element on the persistence-unit-metadata element so only persistence-unit-defaults element gets removed
+		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
+		getXmlEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		
+		//set access in the context model, verify resource model modified
+		persistenceUnitDefaults.setAccess(AccessType.FIELD);
+		assertEquals(AccessType.FIELD, persistenceUnitDefaults.getAccess());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.AccessType.FIELD, getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().getAccess());
+		
+		//set access to null in the context model
+		persistenceUnitDefaults.setAccess(null);
+		assertNull(persistenceUnitDefaults.getAccess());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults());
+	}
+
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkPersistenceUnitMetadataTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkPersistenceUnitMetadataTests.java
new file mode 100644
index 0000000..801aab9
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/EclipseLinkPersistenceUnitMetadataTests.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistenceUnitMetadata;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.persistence.PersistenceFactory;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlMappingFileRef;
+import org.eclipse.jpt.jpa.eclipselink.core.JptJpaEclipseLinkCorePlugin;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlPersistenceUnitMetadata;
+
+public class EclipseLinkPersistenceUnitMetadataTests extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkPersistenceUnitMetadataTests(String name) {
+		super(name);
+	}
+	
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		XmlMappingFileRef mappingFileRef = PersistenceFactory.eINSTANCE.createXmlMappingFileRef();
+		mappingFileRef.setFileName(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH.toString());
+		getXmlPersistenceUnit().getMappingFiles().add(mappingFileRef);
+		getPersistenceXmlResource().save(null);
+	}
+
+	protected OrmPersistenceUnitMetadata persistenceUnitMetadata() {
+		return getEntityMappings().getPersistenceUnitMetadata();
+	}
+	
+	public void testIsAllFeaturesUnset() throws Exception {
+		XmlPersistenceUnitMetadata persistenceUnitMetadata = EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata();
+		getXmlEntityMappings().setPersistenceUnitMetadata(persistenceUnitMetadata);
+		assertTrue(persistenceUnitMetadata.isUnset());
+		
+		persistenceUnitMetadata.setXmlMappingMetadataComplete(true);
+		assertFalse(persistenceUnitMetadata.isUnset());
+		
+		persistenceUnitMetadata.setXmlMappingMetadataComplete(false);
+		assertTrue(persistenceUnitMetadata.isUnset());
+		
+		persistenceUnitMetadata.setPersistenceUnitDefaults(OrmFactory.eINSTANCE.createXmlPersistenceUnitDefaults());
+		assertFalse(persistenceUnitMetadata.isUnset());		
+	}
+	
+	public void testUpdateXmlMappingMetadataComplete() throws Exception {
+		OrmPersistenceUnitMetadata persistenceUnitMetadata = getEntityMappings().getPersistenceUnitMetadata();
+		assertFalse(persistenceUnitMetadata.isXmlMappingMetadataComplete());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set xmlMappingMetadataComplete in the resource model, verify context model updated
+		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
+		getXmlEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);		
+		assertTrue(persistenceUnitMetadata.isXmlMappingMetadataComplete());
+		assertTrue(getXmlEntityMappings().getPersistenceUnitMetadata().isXmlMappingMetadataComplete());
+
+		//set xmlMappingMetadataComplete to null in the resource model
+		getXmlEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(false);
+		assertFalse(persistenceUnitMetadata.isXmlMappingMetadataComplete());
+		assertFalse(getXmlEntityMappings().getPersistenceUnitMetadata().isXmlMappingMetadataComplete());
+	}
+	
+	public void testModifyXmlMappingMetadataComplete() throws Exception {		
+		OrmPersistenceUnitMetadata persistenceUnitMetadata = getEntityMappings().getPersistenceUnitMetadata();
+		assertFalse(persistenceUnitMetadata.isXmlMappingMetadataComplete());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set xmlMappingMetadataComplete in the context model, verify resource model modified
+		persistenceUnitMetadata.setXmlMappingMetadataComplete(true);
+		assertTrue(persistenceUnitMetadata.isXmlMappingMetadataComplete());
+		assertTrue(getXmlEntityMappings().getPersistenceUnitMetadata().isXmlMappingMetadataComplete());
+		
+		//set xmlMappingMetadataComplete to null in the context model
+		persistenceUnitMetadata.setXmlMappingMetadataComplete(false);
+		assertFalse(persistenceUnitMetadata.isXmlMappingMetadataComplete());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+	}
+	
+	public void testModifyXmlMappingMetadataComplete2() throws Exception {
+		OrmPersistenceUnitMetadata persistenceUnitMetadata = getEntityMappings().getPersistenceUnitMetadata();
+		assertFalse(persistenceUnitMetadata.isXmlMappingMetadataComplete());
+		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
+		
+		//set xmlMappingMetadataComplete in the context model, verify resource model modified
+		persistenceUnitMetadata.setXmlMappingMetadataComplete(true);
+		assertTrue(persistenceUnitMetadata.isXmlMappingMetadataComplete());
+		assertTrue(getXmlEntityMappings().getPersistenceUnitMetadata().isXmlMappingMetadataComplete());
+		
+		//set xmlMappingMetadataComplete to null in the context model
+		//set another element on the persistence-unit-metadata element so it doesn't get removed
+		getXmlEntityMappings().getPersistenceUnitMetadata().setPersistenceUnitDefaults(OrmFactory.eINSTANCE.createXmlPersistenceUnitDefaults());
+		persistenceUnitMetadata.setXmlMappingMetadataComplete(false);
+		assertFalse(persistenceUnitMetadata.isXmlMappingMetadataComplete());
+		assertFalse(getXmlEntityMappings().getPersistenceUnitMetadata().isXmlMappingMetadataComplete());
+	}
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/JptEclipseLinkCoreOrmContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/JptEclipseLinkCoreOrmContextModelTests.java
new file mode 100644
index 0000000..95ba5bd
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/orm/JptEclipseLinkCoreOrmContextModelTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ *  Copyright (c) 2007, 2009 Oracle. 
+ *  All rights reserved.  This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class JptEclipseLinkCoreOrmContextModelTests extends TestCase
+{	
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkCoreOrmContextModelTests.class.getName());
+		suite.addTestSuite(EclipseLinkEntityMappingsTests.class);
+		suite.addTestSuite(EclipseLinkPersistenceUnitMetadataTests.class);
+		suite.addTestSuite(EclipseLinkPersistenceUnitDefaultsTests.class);
+		suite.addTestSuite(EclipseLinkOrmEmbeddableTests.class);
+		suite.addTestSuite(EclipseLinkOrmEntityTests.class);
+		suite.addTestSuite(EclipseLinkOrmMappedSuperclassTests.class);
+		suite.addTestSuite(EclipseLinkOrmBasicMappingTests.class);
+		suite.addTestSuite(EclipseLinkOrmIdMappingTests.class);
+		suite.addTestSuite(EclipseLinkOrmManyToManyMappingTests.class);
+		suite.addTestSuite(EclipseLinkOrmManyToOneMappingTests.class);
+		suite.addTestSuite(EclipseLinkOrmOneToManyMappingTests.class);
+		suite.addTestSuite(EclipseLinkOrmOneToOneMappingTests.class);
+		suite.addTestSuite(EclipseLinkOrmPersistentAttributeTests.class);
+		suite.addTestSuite(EclipseLinkOrmVersionMappingTests.class);
+		suite.addTestSuite(EclipseLinkOrmTransientMappingTests.class);
+		suite.addTestSuite(EclipseLinkOrmConverterTests.class);
+		suite.addTestSuite(EclipseLinkOrmObjectTypeConverterTests.class);
+		suite.addTestSuite(EclipseLinkOrmStructConverterTests.class);
+		suite.addTestSuite(EclipseLinkOrmTypeConverterTests.class);
+		return suite;
+	}
+	
+	
+	private JptEclipseLinkCoreOrmContextModelTests() {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/EclipseLinkPersistenceUnitTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/EclipseLinkPersistenceUnitTestCase.java
new file mode 100644
index 0000000..271155f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/EclipseLinkPersistenceUnitTestCase.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence;
+
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetDataModelProperties;
+import org.eclipse.jpt.jpa.core.tests.internal.context.persistence.PersistenceUnitTestCase;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.platform.EclipseLinkPlatform;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * PersistenceUnitTestCase
+ */
+public abstract class EclipseLinkPersistenceUnitTestCase extends PersistenceUnitTestCase
+{
+	protected EclipseLinkPersistenceUnit subject;
+
+	protected PropertyValueModel<EclipseLinkPersistenceUnit> subjectHolder;
+
+	// ********** constructors **********
+	protected EclipseLinkPersistenceUnitTestCase(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.subject = this.getPersistenceUnit();
+		this.subjectHolder = new SimplePropertyValueModel<EclipseLinkPersistenceUnit>(this.subject);
+		this.populatePu();
+	}
+
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		dataModel.setProperty(JpaFacetDataModelProperties.PLATFORM, EclipseLinkPlatform.VERSION_1_0);
+		return dataModel;
+	}
+	
+	@Override
+	protected EclipseLinkPersistenceUnit getPersistenceUnit() {
+		return (EclipseLinkPersistenceUnit) super.getPersistenceUnit();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/EclipseLinkPersistenceUnitTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/EclipseLinkPersistenceUnitTests.java
new file mode 100644
index 0000000..cf50956
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/EclipseLinkPersistenceUnitTests.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.persistence.PersistenceFactory;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlJavaClassRef;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlMappingFileRef;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistenceUnit;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.core.tests.internal.projects.TestJpaProject;
+import org.eclipse.jpt.jpa.eclipselink.core.JptJpaEclipseLinkCorePlugin;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm.EclipseLinkOrmContextModelTestCase;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("nls")
+public class EclipseLinkPersistenceUnitTests
+	extends EclipseLinkOrmContextModelTestCase
+{
+	public EclipseLinkPersistenceUnitTests(String name) {
+		super(name);
+	}
+	
+	
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.CREATE_ORM_XML, Boolean.TRUE);
+		return dataModel;
+	}
+	
+	@Override
+	protected IDataModel buildEclipseLinkOrmConfig(TestJpaProject testJpaProject) {
+		IDataModel dataModel = 
+			DataModelFactory.createDataModel(new EclipseLinkOrmFileCreationDataModelProvider());		
+		dataModel.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				testJpaProject.getProject().getFolder("src/META-INF").getFullPath());
+		dataModel.setProperty(OrmFileCreationDataModelProperties.ADD_TO_PERSISTENCE_UNIT, Boolean.FALSE);
+		return dataModel;
+	}
+
+	private ICompilationUnit createTestEntity() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+		});
+	}	
+	
+	public void testUpdateEclipseLinkImpliedMappingFileRef1() throws Exception {
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		
+		// test that there is one initially
+		JpaXmlResource eclipseLinkOrmResource = getOrmXmlResource();
+		assertTrue(eclipseLinkOrmResource.fileExists());
+		assertNotNull(persistenceUnit.getImpliedMappingFileRef());
+		assertNotNull(persistenceUnit.getImpliedEclipseLinkMappingFileRef());
+		
+		// remove eclipselink-orm.xml
+		deleteResource(eclipseLinkOrmResource);
+		
+		assertFalse(eclipseLinkOrmResource.fileExists());
+		assertNotNull(persistenceUnit.getImpliedMappingFileRef());
+		assertNull(persistenceUnit.getImpliedEclipseLinkMappingFileRef());
+	}
+	
+	public void testUpdateEclipseLinkImpliedMappingFileRef2() {
+		XmlPersistenceUnit xmlPersistenceUnit = getXmlPersistenceUnit();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		
+		// test that there is one initially
+		JpaXmlResource eclipseLinkOrmResource = getOrmXmlResource();
+		assertTrue(eclipseLinkOrmResource.fileExists());
+		assertNotNull(persistenceUnit.getImpliedMappingFileRef());
+		assertNotNull(persistenceUnit.getImpliedEclipseLinkMappingFileRef());
+		
+		// add specified eclipselink-orm.xml
+		XmlMappingFileRef xmlMappingFileRef = PersistenceFactory.eINSTANCE.createXmlMappingFileRef();
+		xmlMappingFileRef.setFileName("META-INF/eclipselink-orm.xml");
+		xmlPersistenceUnit.getMappingFiles().add(xmlMappingFileRef);
+		
+		assertEquals(1, CollectionTools.size(persistenceUnit.specifiedMappingFileRefs()));
+		
+		assertTrue(eclipseLinkOrmResource.fileExists());
+		assertNotNull(persistenceUnit.getImpliedMappingFileRef());
+		assertNull(persistenceUnit.getImpliedEclipseLinkMappingFileRef());
+	}
+	
+	public void testUpdateEclipseLinkImpliedMappingFileRef3() {
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		
+		// test that there is one initially
+		JpaXmlResource eclipseLinkOrmResource = getOrmXmlResource();
+		assertTrue(eclipseLinkOrmResource.fileExists());
+		assertNotNull(persistenceUnit.getImpliedMappingFileRef());
+		assertNotNull(persistenceUnit.getImpliedEclipseLinkMappingFileRef());
+		
+		// ignore in persistence unit
+		persistenceUnit.getGeneralProperties().setExcludeEclipselinkOrm(Boolean.TRUE);
+		
+		assertTrue(eclipseLinkOrmResource.fileExists());
+		assertNotNull(persistenceUnit.getImpliedMappingFileRef());
+		assertNull(persistenceUnit.getImpliedEclipseLinkMappingFileRef());
+	}
+
+	public void testMappingFileRefs() {
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		ListIterator<MappingFileRef> mappingFileRefs = persistenceUnit.mappingFileRefs();
+		
+		assertEquals(persistenceUnit.getImpliedMappingFileRef(), mappingFileRefs.next().getMappingFile().getParent());
+		assertEquals(persistenceUnit.getImpliedEclipseLinkMappingFileRef(), mappingFileRefs.next().getMappingFile().getParent());
+	}
+
+	public void testMappingFileRefsSize() {
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		assertEquals(2, persistenceUnit.mappingFileRefsSize());
+	}
+
+	public void testPersistentType() throws Exception {
+		getJpaProject().setDiscoversAnnotatedClasses(false);	
+		PersistenceUnit persistenceUnit = getPersistenceUnit();
+		createTestEntity();
+		
+		//persistentType not listed in persistence.xml and discoverAnnotatedClasses is false
+		//still find the persistentType because of changes for bug 190317
+		assertFalse(getJpaProject().discoversAnnotatedClasses());
+		assertNotNull(persistenceUnit.getPersistentType(FULLY_QUALIFIED_TYPE_NAME));
+		
+		//test persistentType not listed in persistence.xml, discover annotated classes set to true
+		getJpaProject().setDiscoversAnnotatedClasses(true);	
+		assertNotNull(persistenceUnit.getPersistentType(FULLY_QUALIFIED_TYPE_NAME));
+		
+		//test persistentType list as class in persistence.xml
+		getJpaProject().setDiscoversAnnotatedClasses(false);
+		XmlJavaClassRef classRef = PersistenceFactory.eINSTANCE.createXmlJavaClassRef();
+		classRef.setJavaClass(FULLY_QUALIFIED_TYPE_NAME);
+		getXmlPersistenceUnit().getClasses().add(classRef);
+		assertNotNull(persistenceUnit.getPersistentType(FULLY_QUALIFIED_TYPE_NAME));
+
+		
+		//test persistentType from orm.xml file that is specified in the persistence.xml
+		addXmlMappingFileRef(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH.toString());
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		assertNotNull(persistenceUnit.getPersistentType("model.Foo"));
+		assertEquals(ormPersistentType, persistenceUnit.getPersistentType("model.Foo"));
+
+		//test persistentType from eclipselink-orm.xml file that is implied(not specified) in the persistence.xml
+		getXmlPersistenceUnit().getMappingFiles().remove(0);
+		assertNotNull(persistenceUnit.getPersistentType("model.Foo"));
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/JptEclipseLinkCorePersistenceContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/JptEclipseLinkCorePersistenceContextModelTests.java
new file mode 100644
index 0000000..dffd65e
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/JptEclipseLinkCorePersistenceContextModelTests.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ *  Copyright (c) 2010  Oracle. 
+ *  All rights reserved.  This program and the accompanying materials are 
+ *  made available under the terms of the Eclipse Public License v1.0 which 
+ *  accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.caching.JptEclipseLinkPersistenceCachingTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.connection.JptEclipseLinkPersistenceConnectionTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.customization.JptEclipseLinkPersistenceCustomizationTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.general.JptEclipseLinkPersistenceGeneralTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.logging.JptEclipseLinkPersistenceLoggingTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.options.JptEclipseLinkPersistenceOptionsTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.schema.generation.JptEclipseLinkPersistenceSchemaGenerationTests;
+
+public class JptEclipseLinkCorePersistenceContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkCorePersistenceContextModelTests.class.getName());
+		suite.addTestSuite(EclipseLinkPersistenceUnitTests.class);
+		suite.addTest(JptEclipseLinkPersistenceGeneralTests.suite());
+		suite.addTest(JptEclipseLinkPersistenceConnectionTests.suite());
+		suite.addTest(JptEclipseLinkPersistenceCustomizationTests.suite());
+		suite.addTest(JptEclipseLinkPersistenceCachingTests.suite());
+		suite.addTest(JptEclipseLinkPersistenceLoggingTests.suite());
+		suite.addTest(JptEclipseLinkPersistenceOptionsTests.suite());
+		suite.addTest(JptEclipseLinkPersistenceSchemaGenerationTests.suite());
+		return suite;
+	}
+
+	private JptEclipseLinkCorePersistenceContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/caching/CachingAdapterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/caching/CachingAdapterTests.java
new file mode 100644
index 0000000..f82c184
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/caching/CachingAdapterTests.java
@@ -0,0 +1,449 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.caching;
+
+import org.eclipse.jpt.common.utility.model.event.ListAddEvent;
+import org.eclipse.jpt.common.utility.model.event.ListChangeEvent;
+import org.eclipse.jpt.common.utility.model.event.ListClearEvent;
+import org.eclipse.jpt.common.utility.model.event.ListEvent;
+import org.eclipse.jpt.common.utility.model.event.ListMoveEvent;
+import org.eclipse.jpt.common.utility.model.event.ListRemoveEvent;
+import org.eclipse.jpt.common.utility.model.event.ListReplaceEvent;
+import org.eclipse.jpt.common.utility.model.listener.ListChangeListener;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.caching.CacheType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.caching.Caching;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.caching.FlushClearCache;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.caching.Entity;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * Tests the update of model objects by the Caching adapter when the
+ * PersistenceUnit changes.
+ */
+@SuppressWarnings("nls")
+public class CachingAdapterTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private Caching caching;
+	private ListEvent entitiesEvent;
+
+	public static final String ENTITY_TEST = "Employee";
+	public static final String ENTITY_TEST_2 = "Address";
+
+	public static final String CACHE_TYPE_DEFAULT_KEY = Caching.ECLIPSELINK_CACHE_TYPE_DEFAULT;
+	public static final CacheType CACHE_TYPE_DEFAULT_TEST_VALUE = CacheType.soft_weak;
+	public static final CacheType CACHE_TYPE_DEFAULT_TEST_VALUE_2 = CacheType.full;
+
+	public static final String CACHE_SIZE_DEFAULT_KEY = Caching.ECLIPSELINK_CACHE_SIZE_DEFAULT;
+	public static final Integer CACHE_SIZE_DEFAULT_TEST_VALUE = 12345;
+	public static final Integer CACHE_SIZE_DEFAULT_TEST_VALUE_2 = 67890;
+
+	public static final String SHARED_CACHE_DEFAULT_KEY = Caching.ECLIPSELINK_CACHE_SHARED_DEFAULT;
+	public static final Boolean SHARED_CACHE_DEFAULT_TEST_VALUE = false;
+	public static final Boolean SHARED_CACHE_DEFAULT_TEST_VALUE_2 = true;
+
+	public static final String CACHE_TYPE_KEY = Caching.ECLIPSELINK_CACHE_TYPE + ENTITY_TEST;
+	public static final CacheType CACHE_TYPE_TEST_VALUE = CacheType.soft_weak;
+	public static final CacheType CACHE_TYPE_TEST_VALUE_2 = CacheType.full;
+
+	public static final String SHARED_CACHE_KEY = Caching.ECLIPSELINK_SHARED_CACHE + ENTITY_TEST;
+	public static final Boolean SHARED_CACHE_TEST_VALUE = false;
+	public static final Boolean SHARED_CACHE_TEST_VALUE_2 = true;
+
+	public static final String CACHE_SIZE_KEY = Caching.ECLIPSELINK_CACHE_SIZE + ENTITY_TEST;
+	public static final Integer CACHE_SIZE_TEST_VALUE = 12345;
+	public static final Integer CACHE_SIZE_TEST_VALUE_2 = 67890;
+	
+	public static final String FLUSH_CLEAR_CACHE_KEY = Caching.ECLIPSELINK_FLUSH_CLEAR_CACHE;
+	public static final FlushClearCache FLUSH_CLEAR_CACHE_TEST_VALUE = FlushClearCache.drop;
+	public static final FlushClearCache FLUSH_CLEAR_CACHE_TEST_VALUE_2 = FlushClearCache.merge;
+
+	public CachingAdapterTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.caching = this.getPersistenceUnit().getCaching();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+		
+		this.caching.addPropertyChangeListener(Caching.CACHE_TYPE_DEFAULT_PROPERTY, propertyChangeListener);
+		this.caching.addPropertyChangeListener(Caching.CACHE_SIZE_DEFAULT_PROPERTY, propertyChangeListener);
+		this.caching.addPropertyChangeListener(Caching.SHARED_CACHE_DEFAULT_PROPERTY, propertyChangeListener);
+		this.caching.addPropertyChangeListener(Entity.CACHE_TYPE_PROPERTY, propertyChangeListener);
+		this.caching.addPropertyChangeListener(Entity.CACHE_SIZE_PROPERTY, propertyChangeListener);
+		this.caching.addPropertyChangeListener(Entity.SHARED_CACHE_PROPERTY, propertyChangeListener);
+		this.caching.addPropertyChangeListener(Caching.FLUSH_CLEAR_CACHE_PROPERTY, propertyChangeListener);
+		
+		ListChangeListener entitiesChangeListener = this.buildEntitiesChangeListener();
+		this.caching.addListChangeListener(Caching.ENTITIES_LIST, entitiesChangeListener);
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing. 
+	 */
+	@Override
+	protected void populatePu() {
+		this.modelPropertiesSizeOriginal = 7;
+		this.propertiesTotal = this.modelPropertiesSizeOriginal + 4; // 4 misc properties
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		this.persistenceUnitSetProperty("misc.property.1", "value.1");
+		this.persistenceUnitSetProperty(CACHE_TYPE_DEFAULT_KEY, CACHE_TYPE_DEFAULT_TEST_VALUE);
+		this.persistenceUnitSetProperty("misc.property.2", "value.2");
+		this.persistenceUnitSetProperty(CACHE_SIZE_DEFAULT_KEY, CACHE_SIZE_DEFAULT_TEST_VALUE);
+		this.persistenceUnitSetProperty(SHARED_CACHE_DEFAULT_KEY, SHARED_CACHE_DEFAULT_TEST_VALUE);
+		this.persistenceUnitSetProperty("misc.property.3", "value.3");
+		this.persistenceUnitSetProperty("misc.property.4", "value.4");
+		this.persistenceUnitSetProperty(CACHE_SIZE_KEY, CACHE_SIZE_TEST_VALUE);
+		this.persistenceUnitSetProperty(CACHE_TYPE_KEY, CACHE_TYPE_TEST_VALUE);
+		this.persistenceUnitSetProperty(SHARED_CACHE_KEY, SHARED_CACHE_TEST_VALUE);
+		this.persistenceUnitSetProperty(FLUSH_CLEAR_CACHE_KEY, FLUSH_CLEAR_CACHE_TEST_VALUE);
+		return;
+	}
+
+	// ********** Listeners **********
+	private ListChangeListener buildEntitiesChangeListener() {
+		return new ListChangeListener() {
+			public void itemsAdded(ListAddEvent e) {
+				CachingAdapterTests.this.entityAdded(e);
+			}
+
+			public void itemsRemoved(ListRemoveEvent e) {
+				CachingAdapterTests.this.entityRemoved(e);
+			}
+
+			public void itemsReplaced(ListReplaceEvent e) {
+				CachingAdapterTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void itemsMoved(ListMoveEvent e) {
+				CachingAdapterTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void listCleared(ListClearEvent e) {
+				CachingAdapterTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void listChanged(ListChangeEvent e) {
+				CachingAdapterTests.this.throwUnsupportedOperationException(e);
+			}
+		};
+	}
+
+	@Override
+	protected void clearEvent() {
+		super.clearEvent();
+		this.entitiesEvent = null;
+	}
+
+	void entityAdded(ListAddEvent e) {
+		this.entitiesEvent = e;
+	}
+
+	void entityRemoved(ListRemoveEvent e) {
+		this.entitiesEvent = e;
+	}
+
+	// ********** entities list **********
+	public void testEntitiesList() throws Exception {
+		// add
+		this.clearEvent();
+		int originalNumberOfEntities = this.caching.entitiesSize();
+		
+		this.caching.addEntity(ENTITY_TEST_2);
+		assertEquals("Entity not added", this.caching.entitiesSize(), originalNumberOfEntities + 1);
+		
+		// verify event received
+		assertNotNull("No Event Fired.", this.entitiesEvent);
+		// verify event for the expected property
+		assertEquals("Wrong Event.", this.entitiesEvent.getListName(), Caching.ENTITIES_LIST);
+
+		// remove
+		this.clearEvent();
+		this.caching.removeEntity(ENTITY_TEST_2);
+		assertEquals("Entity not removed", this.caching.entitiesSize(), originalNumberOfEntities);
+
+		// verify event received
+		assertNotNull("No Event Fired.", this.entitiesEvent);
+		// verify event for the expected property
+		assertEquals("Wrong Event.", this.entitiesEvent.getListName(), Caching.ENTITIES_LIST);
+	}
+
+	// ********** CacheTypeDefault **********
+	/**
+	 * Tests the update of CacheTypeDefault property by the Caching adapter when
+	 * the PU or the model changes.
+	 */
+	public void testSetCacheTypeDefault() throws Exception {
+		this.verifyModelInitialized(
+			CACHE_TYPE_DEFAULT_KEY,
+			CACHE_TYPE_DEFAULT_TEST_VALUE);
+		this.verifySetProperty(
+			CACHE_TYPE_DEFAULT_KEY,
+			CACHE_TYPE_DEFAULT_TEST_VALUE,
+			CACHE_TYPE_DEFAULT_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveCacheTypeDefault() throws Exception {
+		this.verifyAddRemoveProperty(
+			CACHE_TYPE_DEFAULT_KEY,
+			CACHE_TYPE_DEFAULT_TEST_VALUE,
+			CACHE_TYPE_DEFAULT_TEST_VALUE_2);
+	}
+
+	// ********** CacheSizeDefault **********
+	/**
+	 * Tests the update of CacheSizeDefault property by the Caching adapter when
+	 * the PU or the model changes.
+	 */
+	public void testSetCacheSizeDefault() throws Exception {
+		this.verifyModelInitialized(
+			CACHE_SIZE_DEFAULT_KEY,
+			CACHE_SIZE_DEFAULT_TEST_VALUE);
+		this.verifySetProperty(
+			CACHE_SIZE_DEFAULT_KEY,
+			CACHE_SIZE_DEFAULT_TEST_VALUE,
+			CACHE_SIZE_DEFAULT_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveCacheSizeDefault() throws Exception {
+		this.verifyAddRemoveProperty(
+			CACHE_SIZE_DEFAULT_KEY,
+			CACHE_SIZE_DEFAULT_TEST_VALUE,
+			CACHE_SIZE_DEFAULT_TEST_VALUE_2);
+	}
+
+	// ********** SharedCacheDefault **********
+	public void testSetSharedCacheDefault() throws Exception {
+		this.verifyModelInitialized(
+			SHARED_CACHE_DEFAULT_KEY,
+			SHARED_CACHE_DEFAULT_TEST_VALUE);
+		this.verifySetProperty(
+			SHARED_CACHE_DEFAULT_KEY,
+			SHARED_CACHE_DEFAULT_TEST_VALUE,
+			SHARED_CACHE_DEFAULT_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveSharedCacheDefault() throws Exception {
+		this.verifyAddRemoveProperty(
+			SHARED_CACHE_DEFAULT_KEY,
+			SHARED_CACHE_DEFAULT_TEST_VALUE,
+			SHARED_CACHE_DEFAULT_TEST_VALUE_2);
+	}
+
+	// ********** CacheType **********
+	/**
+	 * Tests the update of CacheType property by the Caching adapter when the PU
+	 * or the model changes.
+	 */
+	public void testSetCacheType() throws Exception {
+		this.verifyModelInitialized(
+			CACHE_TYPE_KEY,
+			CACHE_TYPE_TEST_VALUE);
+		this.verifySetCachingProperty(
+			Entity.CACHE_TYPE_PROPERTY,
+			CACHE_TYPE_KEY,
+			CACHE_TYPE_TEST_VALUE,
+			CACHE_TYPE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveCacheType() throws Exception {
+		this.verifyAddRemoveCachingProperty(
+			Entity.CACHE_TYPE_PROPERTY,
+			CACHE_TYPE_KEY,
+			CACHE_TYPE_TEST_VALUE,
+			CACHE_TYPE_TEST_VALUE_2);
+	}
+
+	// ********** CacheSize **********
+	/**
+	 * Tests the update of CacheSize property by the Caching adapter when the PU
+	 * or the model changes.
+	 */
+	public void testSetCacheSize() throws Exception {
+		this.verifyModelInitialized(
+			CACHE_SIZE_KEY,
+			CACHE_SIZE_TEST_VALUE);
+		this.verifySetCachingProperty(
+			Entity.CACHE_SIZE_PROPERTY,
+			CACHE_SIZE_KEY,
+			CACHE_SIZE_TEST_VALUE,
+			CACHE_SIZE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveCacheSize() throws Exception {
+		this.verifyAddRemoveCachingProperty(
+			Entity.CACHE_SIZE_PROPERTY,
+			CACHE_SIZE_KEY,
+			CACHE_SIZE_TEST_VALUE,
+			CACHE_SIZE_TEST_VALUE_2);
+	}
+
+	// ********** SharedCache **********
+	/**
+	 * Tests the update of SharedCache property by the Caching adapter when the
+	 * PU or the model changes.
+	 */
+	public void testSetSharedCache() throws Exception {
+		this.verifyModelInitialized(
+			SHARED_CACHE_KEY,
+			SHARED_CACHE_TEST_VALUE);
+		this.verifySetCachingProperty(
+			Entity.SHARED_CACHE_PROPERTY,
+			SHARED_CACHE_KEY,
+			SHARED_CACHE_TEST_VALUE,
+			SHARED_CACHE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveSharedCache() throws Exception {
+		this.verifyAddRemoveCachingProperty(
+			Entity.SHARED_CACHE_PROPERTY,
+			SHARED_CACHE_KEY,
+			SHARED_CACHE_TEST_VALUE,
+			SHARED_CACHE_TEST_VALUE_2);
+	}
+
+	// ********** FlushClearCache tests **********
+	public void testSetFlushClearCache() throws Exception {
+		this.verifyModelInitialized(
+			FLUSH_CLEAR_CACHE_KEY,
+			FLUSH_CLEAR_CACHE_TEST_VALUE);
+		this.verifySetProperty(
+			FLUSH_CLEAR_CACHE_KEY,
+			FLUSH_CLEAR_CACHE_TEST_VALUE,
+			FLUSH_CLEAR_CACHE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveFlushClearCache() throws Exception {
+		this.verifyAddRemoveProperty(
+			FLUSH_CLEAR_CACHE_KEY,
+			FLUSH_CLEAR_CACHE_TEST_VALUE,
+			FLUSH_CLEAR_CACHE_TEST_VALUE_2);
+	}
+
+	// ****** convenience methods *******
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.caching;
+	}
+
+	protected void verifySetCachingProperty(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		// Replace
+		this.persistenceUnitSetProperty(key, testValue2);
+		this.verifyPutCachingProperty(propertyName, ENTITY_TEST, testValue2);
+		
+		// Replace by setting model object
+		this.clearEvent();
+		this.setCachingProperty(propertyName, ENTITY_TEST, testValue1);
+		this.verifyPutCachingProperty(propertyName, ENTITY_TEST, testValue1);
+	}
+
+	protected void verifyAddRemoveCachingProperty(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		// Remove
+		this.clearEvent();
+		--this.propertiesTotal;
+		--this.modelPropertiesSize;
+		this.getPersistenceUnit().removeProperty(key);
+		assertNull(this.getPersistenceUnit().getProperty(key));
+		assertEquals(this.modelPropertiesSize, this.modelPropertiesSizeOriginal - 1);
+		this.verifyPutCachingProperty(propertyName, ENTITY_TEST, null);
+		
+		// Add original Property
+		++this.propertiesTotal;
+		++this.modelPropertiesSize;
+		this.persistenceUnitSetProperty(key, testValue1);
+		this.verifyPutCachingProperty(propertyName, ENTITY_TEST, testValue1);
+		
+		// Set to null
+		this.persistenceUnitSetProperty(key, null);
+		this.verifyPutCachingProperty(propertyName, ENTITY_TEST, null);
+		
+		// Replace
+		this.persistenceUnitSetProperty(key, testValue2);
+		this.verifyPutCachingProperty(propertyName, ENTITY_TEST, testValue2);
+	}
+
+	protected void verifyPutCachingProperty(String propertyName, String entityName, Object expectedValue) throws Exception {
+		this.verifyEvent(propertyName);
+		this.verifyCachingEvent(propertyName, entityName, expectedValue);
+	}
+
+	protected void verifyCachingEvent(String propertyName, String entityName, Object expectedValue) throws Exception {
+		// verify event value
+		Entity entity = (Entity) this.propertyChangedEvent.getNewValue();
+		if (propertyName.equals(Entity.CACHE_TYPE_PROPERTY)) {
+			assertEquals(expectedValue, entity.getParent().getCacheTypeOf(entityName));
+			assertEquals(expectedValue, this.caching.getCacheTypeOf(entityName));
+		}
+		else if (propertyName.equals(Entity.CACHE_SIZE_PROPERTY)) {
+			assertEquals(expectedValue, entity.getParent().getCacheSizeOf(entityName));
+			assertEquals(expectedValue, this.caching.getCacheSizeOf(entityName));
+		}
+		else if (propertyName.equals(Entity.SHARED_CACHE_PROPERTY)) {
+			assertEquals(expectedValue, entity.getParent().getSharedCacheOf(entityName));
+			assertEquals(expectedValue, this.caching.getSharedCacheOf(entityName));
+		}
+		else {
+			this.throwMissingDefinition("verifyCachingEvent", propertyName);
+		}
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		if (propertyName.equals(Caching.CACHE_TYPE_DEFAULT_PROPERTY))
+			this.caching.setCacheTypeDefault((CacheType) newValue);
+		else if (propertyName.equals(Caching.CACHE_SIZE_DEFAULT_PROPERTY))
+			this.caching.setCacheSizeDefault((Integer) newValue);
+		else if (propertyName.equals(Caching.SHARED_CACHE_DEFAULT_PROPERTY))
+			this.caching.setSharedCacheDefault((Boolean) newValue);
+		else if (propertyName.equals(Caching.FLUSH_CLEAR_CACHE_PROPERTY))
+			this.caching.setFlushClearCache((FlushClearCache) newValue);
+		else
+			this.throwMissingDefinition("setProperty", propertyName);
+	}
+
+	protected void setCachingProperty(String propertyName, String entityName, Object newValue) throws NoSuchFieldException {
+		if (propertyName.equals(Entity.CACHE_TYPE_PROPERTY))
+			this.caching.setCacheTypeOf(entityName, (CacheType) newValue);
+		else if (propertyName.equals(Entity.CACHE_SIZE_PROPERTY))
+			this.caching.setCacheSizeOf(entityName, (Integer) newValue);
+		else if (propertyName.equals(Entity.SHARED_CACHE_PROPERTY))
+			this.caching.setSharedCacheOf(entityName, (Boolean) newValue);
+		else
+			this.throwMissingDefinition("setCachingProperty", propertyName);
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		Object modelValue = null;
+		if (propertyName.equals(Caching.CACHE_TYPE_DEFAULT_PROPERTY))
+			modelValue = this.caching.getCacheTypeDefault();
+		else if (propertyName.equals(Caching.CACHE_SIZE_DEFAULT_PROPERTY))
+			modelValue = this.caching.getCacheSizeDefault();
+		else if (propertyName.equals(Caching.SHARED_CACHE_DEFAULT_PROPERTY))
+			modelValue = this.caching.getSharedCacheDefault();
+		else if (propertyName.equals(Entity.CACHE_SIZE_PROPERTY))
+			modelValue = this.caching.getCacheSizeOf(ENTITY_TEST);
+		else if (propertyName.equals(Entity.CACHE_TYPE_PROPERTY))
+			modelValue = this.caching.getCacheTypeOf(ENTITY_TEST);
+		else if (propertyName.equals(Entity.SHARED_CACHE_PROPERTY))
+			modelValue = this.caching.getSharedCacheOf(ENTITY_TEST);
+		else if (propertyName.equals(Caching.FLUSH_CLEAR_CACHE_PROPERTY))
+			modelValue = this.caching.getFlushClearCache();
+		else
+			this.throwMissingDefinition("getProperty", propertyName);
+		return modelValue;
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/caching/CachingValueModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/caching/CachingValueModelTests.java
new file mode 100644
index 0000000..ed82587
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/caching/CachingValueModelTests.java
@@ -0,0 +1,444 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.caching;
+
+import org.eclipse.jpt.common.utility.internal.model.AbstractModel;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.caching.CacheType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.caching.Caching;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.caching.Entity;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * CachingValueModelTests
+ */
+@SuppressWarnings("nls")
+public class CachingValueModelTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private Caching caching;
+	private PropertyValueModel<Caching> cachingHolder;
+	
+	private WritablePropertyValueModel<CacheType> cacheTypeHolder;
+	private PropertyChangeListener cacheTypeListener;
+	private PropertyChangeEvent cacheTypeEvent;
+
+	private WritablePropertyValueModel<Boolean> sharedCacheHolder;
+	private PropertyChangeListener sharedCacheListener;
+	private PropertyChangeEvent sharedCacheEvent;
+
+	private WritablePropertyValueModel<CacheType> cacheTypeDefaultHolder;
+	private PropertyChangeListener cacheTypeDefaultListener;
+	private PropertyChangeEvent cacheTypeDefaultEvent;
+
+	private WritablePropertyValueModel<Boolean> sharedCacheDefaultHolder;
+	private PropertyChangeListener sharedCacheDefaultListener;
+	private PropertyChangeEvent sharedCacheDefaultEvent;
+
+	public static final String ENTITY_NAME_TEST_VALUE = "Employee";
+	public static final CacheType CACHE_TYPE_TEST_VALUE = CacheType.hard_weak;
+	public static final Boolean SHARED_CACHE_TEST_VALUE = Boolean.FALSE;
+	public static final CacheType CACHE_TYPE_DEFAULT_TEST_VALUE = CacheType.weak;
+	public static final Boolean SHARED_CACHE_DEFAULT_TEST_VALUE = Boolean.FALSE;
+
+	public CachingValueModelTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.caching = this.subject.getCaching(); // Subject
+		this.cachingHolder = new SimplePropertyValueModel<Caching>(this.caching);
+		
+		this.cacheTypeHolder = this.buildCacheTypeAA(this.cachingHolder);
+		this.cacheTypeListener = this.buildCacheTypeChangeListener();
+		this.cacheTypeHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.cacheTypeListener);
+		this.cacheTypeEvent = null;
+		
+		this.sharedCacheHolder = this.buildSharedCacheAA(this.cachingHolder);
+		this.sharedCacheListener = this.buildSharedCacheChangeListener();
+		this.sharedCacheHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.sharedCacheListener);
+		this.sharedCacheEvent = null;
+		
+		this.cacheTypeDefaultHolder = this.buildCacheTypeDefaultAA(this.cachingHolder);
+		this.cacheTypeDefaultListener = this.buildCacheTypeDefaultChangeListener();
+		this.cacheTypeDefaultHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.cacheTypeDefaultListener);
+		this.cacheTypeDefaultEvent = null;
+		
+		this.sharedCacheDefaultHolder = this.buildSharedCacheDefaultAA(this.cachingHolder);
+		this.sharedCacheDefaultListener = this.buildSharedCacheDefaultChangeListener();
+		this.sharedCacheDefaultHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.sharedCacheDefaultListener);
+		this.sharedCacheDefaultEvent = null;
+	}
+
+	public void testHasListeners() {
+		AbstractModel subjectCaching = (AbstractModel) this.caching; // Subject
+		PropertyAspectAdapter<Caching, CacheType> cacheTypeAA = 
+			(PropertyAspectAdapter<Caching, CacheType>) this.cacheTypeHolder;
+		assertTrue(cacheTypeAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		assertTrue(subjectCaching.hasAnyPropertyChangeListeners(Caching.CACHE_TYPE_PROPERTY));
+		
+		cacheTypeAA.removePropertyChangeListener(PropertyValueModel.VALUE, this.cacheTypeListener);
+		assertFalse(subjectCaching.hasAnyPropertyChangeListeners(Caching.CACHE_TYPE_PROPERTY));
+		assertFalse(cacheTypeAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		
+		PropertyAspectAdapter<Caching, Boolean> sharedCacheAA = 
+			(PropertyAspectAdapter<Caching, Boolean>) this.sharedCacheHolder;
+		assertTrue(sharedCacheAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		assertTrue(subjectCaching.hasAnyPropertyChangeListeners(Caching.SHARED_CACHE_PROPERTY));
+		
+		sharedCacheAA.removePropertyChangeListener(PropertyValueModel.VALUE, this.sharedCacheListener);
+		assertFalse(subjectCaching.hasAnyPropertyChangeListeners(Caching.SHARED_CACHE_PROPERTY));
+		assertFalse(sharedCacheAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		
+		PropertyAspectAdapter<Caching, CacheType> cacheTypeDefaultAA = 
+			(PropertyAspectAdapter<Caching, CacheType>) this.cacheTypeDefaultHolder;
+		assertTrue(cacheTypeDefaultAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		assertTrue(subjectCaching.hasAnyPropertyChangeListeners(Caching.CACHE_TYPE_DEFAULT_PROPERTY));
+		
+		cacheTypeDefaultAA.removePropertyChangeListener(PropertyValueModel.VALUE, this.cacheTypeDefaultListener);
+		assertFalse(subjectCaching.hasAnyPropertyChangeListeners(Caching.CACHE_TYPE_DEFAULT_PROPERTY));
+		assertFalse(cacheTypeDefaultAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		
+		PropertyAspectAdapter<Caching, Boolean> sharedCacheDefaultAA = 
+			(PropertyAspectAdapter<Caching, Boolean>) this.sharedCacheDefaultHolder;
+		assertTrue(sharedCacheDefaultAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		assertTrue(subjectCaching.hasAnyPropertyChangeListeners(Caching.SHARED_CACHE_DEFAULT_PROPERTY));
+		
+		sharedCacheDefaultAA.removePropertyChangeListener(PropertyValueModel.VALUE, this.sharedCacheDefaultListener);
+		assertFalse(subjectCaching.hasAnyPropertyChangeListeners(Caching.SHARED_CACHE_DEFAULT_PROPERTY));
+		assertFalse(sharedCacheDefaultAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing.
+	 */
+	@Override
+	protected void populatePu() {
+		this.persistenceUnitSetProperty(
+			Caching.ECLIPSELINK_CACHE_TYPE + ENTITY_NAME_TEST_VALUE, 
+			CACHE_TYPE_TEST_VALUE);
+		this.persistenceUnitSetProperty(
+			Caching.ECLIPSELINK_SHARED_CACHE + ENTITY_NAME_TEST_VALUE, 
+			SHARED_CACHE_TEST_VALUE);
+		this.persistenceUnitSetProperty(
+			Caching.ECLIPSELINK_CACHE_TYPE_DEFAULT, 
+			CACHE_TYPE_DEFAULT_TEST_VALUE);
+		this.persistenceUnitSetProperty(
+			Caching.ECLIPSELINK_CACHE_SHARED_DEFAULT, 
+			SHARED_CACHE_DEFAULT_TEST_VALUE);
+		return;
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.caching;
+	}
+
+	/** ****** CacheType ******* */
+	private WritablePropertyValueModel<CacheType> buildCacheTypeAA(PropertyValueModel<Caching> subjectHolder) {
+		return new PropertyAspectAdapter<Caching, CacheType>(subjectHolder, Caching.CACHE_TYPE_PROPERTY) {
+			@Override
+			protected CacheType buildValue_() {
+				return this.subject.getCacheTypeOf(ENTITY_NAME_TEST_VALUE);
+			}
+
+			@Override
+			protected void setValue_(CacheType enumValue) {
+				this.subject.setCacheTypeOf(ENTITY_NAME_TEST_VALUE, enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildCacheTypeChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				CachingValueModelTests.this.cacheTypeEvent = e;
+			}
+		};
+	}
+
+	/** ****** SharedCache ******* */
+	private WritablePropertyValueModel<Boolean> buildSharedCacheAA(PropertyValueModel<Caching> subjectHolder) {
+		return new PropertyAspectAdapter<Caching, Boolean>(subjectHolder, Caching.SHARED_CACHE_PROPERTY) {
+			@Override
+			protected Boolean buildValue_() {
+				return this.subject.getSharedCacheOf(ENTITY_NAME_TEST_VALUE);
+			}
+
+			@Override
+			protected void setValue_(Boolean enumValue) {
+				this.subject.setSharedCacheOf(ENTITY_NAME_TEST_VALUE, enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildSharedCacheChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				CachingValueModelTests.this.sharedCacheEvent = e;
+			}
+		};
+	}
+
+	/** ****** CacheTypeDefault ******* */
+	private WritablePropertyValueModel<CacheType> buildCacheTypeDefaultAA(PropertyValueModel<Caching> subjectHolder) {
+		return new PropertyAspectAdapter<Caching, CacheType>(subjectHolder, Caching.CACHE_TYPE_DEFAULT_PROPERTY) {
+			@Override
+			protected CacheType buildValue_() {
+				return this.subject.getCacheTypeDefault();
+			}
+
+			@Override
+			protected void setValue_(CacheType enumValue) {
+				this.subject.setCacheTypeDefault(enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildCacheTypeDefaultChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				CachingValueModelTests.this.cacheTypeDefaultEvent = e;
+			}
+		};
+	}
+
+	/** ****** SharedCacheDefault ******* */
+	private WritablePropertyValueModel<Boolean> buildSharedCacheDefaultAA(PropertyValueModel<Caching> subjectHolder) {
+		return new PropertyAspectAdapter<Caching, Boolean>(subjectHolder, Caching.SHARED_CACHE_DEFAULT_PROPERTY) {
+			@Override
+			protected Boolean buildValue_() {
+				return this.subject.getSharedCacheDefault();
+			}
+
+			@Override
+			protected void setValue_(Boolean enumValue) {
+				this.subject.setSharedCacheDefault(enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildSharedCacheDefaultChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				CachingValueModelTests.this.sharedCacheDefaultEvent = e;
+			}
+		};
+	}
+
+	/** ****** Basic Entity's Properties Tests ******* */
+
+	public void testClone() {
+		Entity entity = this.buildEntity("TestEntity", CacheType.full, 100, true);
+
+		this.verifyClone(entity, entity.clone());
+	}
+	
+	public void testEquals() {
+		Entity entity1 = this.buildEntity("TestEntityA", CacheType.full, 100, true);
+		Entity entity2 = this.buildEntity("TestEntityB", CacheType.full, 100, true);
+		assertEquals(entity1, entity2);
+		Entity entity3 = this.buildEntity("TestEntityC", CacheType.full, 100, true);
+		assertEquals(entity1, entity3);
+		assertEquals(entity2, entity3);
+	}
+	
+	public void testIsEmpty() {
+		Entity entity = this.buildEntity("TestEntity");
+		assertTrue(entity.isEmpty());
+		this.caching.setCacheSizeOf(entity.getName(), 100);
+		assertFalse(entity.isEmpty());
+	}
+
+	private void verifyClone(Entity original, Entity clone) {
+		assertNotSame(original, clone);
+		assertEquals(original, original);
+		assertEquals(original, clone);
+	}
+
+	private Entity buildEntity(String name) {
+		return this.caching.addEntity(name);
+	}
+
+	private Entity buildEntity(String name, CacheType cacheType, Integer size, Boolean isShared) {
+		Entity entity = this.caching.addEntity(name);
+		this.caching.setCacheTypeOf(entity.getName(), cacheType);
+		this.caching.setCacheSizeOf(entity.getName(), size);
+		this.caching.setSharedCacheOf(entity.getName(), isShared);
+		return entity;
+	}
+	
+	/** ****** Caching Tests ******* */
+	public void testValue() {
+		/** ****** CacheType - defaults for entity level caching are equal to the persistence unit settings ******* */
+		this.verifyCacheTypeAAValue(CACHE_TYPE_TEST_VALUE);
+		assertEquals(this.caching.getCacheTypeDefault(), this.caching.getDefaultCacheType());
+		/** ****** SharedCache - defaults for entity level caching are equal to the persistence unit settings ******* */
+		this.verifySharedCacheAAValue(SHARED_CACHE_TEST_VALUE);
+		assertEquals(this.caching.getSharedCacheDefault(), this.caching.getDefaultSharedCache());
+		/** ****** CacheTypeDefault ******* */
+		this.verifyCacheTypeDefaultAAValue(CACHE_TYPE_DEFAULT_TEST_VALUE);
+		assertEquals(Caching.DEFAULT_CACHE_TYPE_DEFAULT, this.caching.getDefaultCacheTypeDefault());
+		/** ****** SharedCacheDefault ******* */
+		this.verifySharedCacheDefaultAAValue(SHARED_CACHE_DEFAULT_TEST_VALUE);
+		assertEquals(Caching.DEFAULT_SHARED_CACHE_DEFAULT, this.caching.getDefaultSharedCacheDefault());
+	}
+
+	public void testSetValue() throws Exception {
+		/** ****** CacheType ******* */
+		this.cacheTypeEvent = null;
+		this.verifyHasListeners(this.cacheTypeHolder, PropertyValueModel.VALUE);
+		CacheType newCacheType = CacheType.full;
+		// Modify the property holder
+		this.cacheTypeHolder.setValue(newCacheType);
+		this.verifyCacheTypeAAValue(newCacheType);
+		assertNotNull(this.cacheTypeEvent);
+		/** ****** SharedCache ******* */
+		this.sharedCacheEvent = null;
+		this.verifyHasListeners(this.sharedCacheHolder, PropertyValueModel.VALUE);
+		Boolean newSharedCache = !SHARED_CACHE_TEST_VALUE;
+		// Modify the property holder
+		this.sharedCacheHolder.setValue(newSharedCache);
+		this.verifySharedCacheAAValue(newSharedCache);
+		assertNotNull(this.sharedCacheEvent);
+		/** ****** CacheTypeDefault ******* */
+		this.cacheTypeDefaultEvent = null;
+		this.verifyHasListeners(this.cacheTypeDefaultHolder, PropertyValueModel.VALUE);
+		CacheType newCacheTypeDefault = CacheType.none;
+		// Modify the property holder
+		this.cacheTypeDefaultHolder.setValue(newCacheTypeDefault);
+		this.verifyCacheTypeDefaultAAValue(newCacheTypeDefault);
+		assertNotNull(this.cacheTypeDefaultEvent);
+		/** ****** SharedCacheDefault ******* */
+		this.sharedCacheDefaultEvent = null;
+		this.verifyHasListeners(this.sharedCacheDefaultHolder, PropertyValueModel.VALUE);
+		Boolean newSharedCacheDefault = !SHARED_CACHE_DEFAULT_TEST_VALUE;
+		// Modify the property holder
+		this.sharedCacheDefaultHolder.setValue(newSharedCacheDefault);
+		this.verifySharedCacheDefaultAAValue(newSharedCacheDefault);
+		assertNotNull(this.sharedCacheDefaultEvent);
+	}
+
+	public void testSetNullValue() {
+		String notDeleted = "Property not deleted";
+		/** ****** CacheType ******* */
+		this.cacheTypeEvent = null;
+		// Setting the property holder
+		this.cacheTypeHolder.setValue(null);
+		// testing Holder
+		this.verifyCacheTypeAAValue(null);
+		assertNotNull(this.cacheTypeEvent);
+		// testing PU properties
+		this.verifyPuHasNotProperty(Caching.ECLIPSELINK_CACHE_TYPE + ENTITY_NAME_TEST_VALUE, notDeleted);
+		/** ****** SharedCache ******* */
+		this.sharedCacheEvent = null;
+		// Setting the property holder
+		this.sharedCacheHolder.setValue(null);
+		// testing Holder
+		this.verifySharedCacheAAValue(null);
+		assertNotNull(this.sharedCacheEvent);
+		// testing PU properties
+		this.verifyPuHasNotProperty(Caching.ECLIPSELINK_SHARED_CACHE + ENTITY_NAME_TEST_VALUE, notDeleted);
+		/** ****** CacheTypeDefault ******* */
+		this.cacheTypeDefaultEvent = null;
+		// Setting the property holder
+		this.cacheTypeDefaultHolder.setValue(null);
+		// testing Holder
+		this.verifyCacheTypeDefaultAAValue(null);
+		assertNotNull(this.cacheTypeDefaultEvent);
+		// testing PU properties
+		this.verifyPuHasNotProperty(Caching.ECLIPSELINK_CACHE_TYPE_DEFAULT, notDeleted);
+		/** ****** SharedCacheDefault ******* */
+		this.sharedCacheDefaultEvent = null;
+		// Setting the property holder
+		this.sharedCacheDefaultHolder.setValue(null);
+		// testing Holder
+		this.verifySharedCacheDefaultAAValue(null);
+		assertNotNull(this.sharedCacheDefaultEvent);
+		// testing PU properties
+		this.verifyPuHasNotProperty(Caching.ECLIPSELINK_CACHE_SHARED_DEFAULT, notDeleted);
+	}
+
+	/** ****** convenience methods ******* */
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifyCacheTypeAAValue(CacheType testValue) {
+		this.verifyAAValue(
+			testValue, 
+			this.caching.getCacheTypeOf(ENTITY_NAME_TEST_VALUE), 
+			this.cacheTypeHolder, 
+			Caching.ECLIPSELINK_CACHE_TYPE + ENTITY_NAME_TEST_VALUE);
+	}
+
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifySharedCacheAAValue(Boolean testValue) {
+		this.verifyAAValue(
+			testValue, 
+			this.caching.getSharedCacheOf(ENTITY_NAME_TEST_VALUE), 
+			this.sharedCacheHolder, 
+			Caching.ECLIPSELINK_SHARED_CACHE + ENTITY_NAME_TEST_VALUE);
+	}
+
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifyCacheTypeDefaultAAValue(CacheType testValue) {
+		this.verifyAAValue(
+			testValue, 
+			this.caching.getCacheTypeDefault(), 
+			this.cacheTypeDefaultHolder, 
+			Caching.ECLIPSELINK_CACHE_TYPE_DEFAULT);
+	}
+
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifySharedCacheDefaultAAValue(Boolean testValue) {
+		this.verifyAAValue(
+			testValue, 
+			this.caching.getSharedCacheDefault(), 
+			this.sharedCacheDefaultHolder, 
+			Caching.ECLIPSELINK_CACHE_SHARED_DEFAULT);
+	}
+
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/caching/JptEclipseLinkPersistenceCachingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/caching/JptEclipseLinkPersistenceCachingTests.java
new file mode 100644
index 0000000..fd24717
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/caching/JptEclipseLinkPersistenceCachingTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.caching;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * decentralize test creation code
+ */
+public class JptEclipseLinkPersistenceCachingTests
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkPersistenceCachingTests.class.getPackage().getName());
+		
+		suite.addTestSuite(CachingValueModelTests.class);
+		suite.addTestSuite(CachingAdapterTests.class);
+		
+		return suite;
+	}
+
+	private JptEclipseLinkPersistenceCachingTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/connection/EclipseLinkConnectionTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/connection/EclipseLinkConnectionTests.java
new file mode 100644
index 0000000..bf955c5
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/connection/EclipseLinkConnectionTests.java
@@ -0,0 +1,542 @@
+/*******************************************************************************
+* Copyright (c) 2008, 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.connection;
+
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitTransactionType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.connection.BatchWriting;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.connection.Connection;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.connection.ExclusiveConnectionMode;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ *  ConnectionAdapterTests
+ */
+@SuppressWarnings("nls")
+public class EclipseLinkConnectionTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private Connection connection;
+
+	public static final PersistenceUnitTransactionType TRANSACTION_TYPE_TEST_VALUE = PersistenceUnitTransactionType.RESOURCE_LOCAL;
+	public static final PersistenceUnitTransactionType TRANSACTION_TYPE_TEST_VALUE_2 = PersistenceUnitTransactionType.JTA;
+
+	public static final String JTA_DATA_SOURCE_TEST_VALUE = "Test_JTA";
+	public static final String JTA_DATA_SOURCE_TEST_VALUE_2 = "Test_JTA_2";
+
+	public static final String NON_JTA_DATA_SOURCE_TEST_VALUE = "Test_Non_JTA";
+	public static final String NON_JTA_DATA_SOURCE_TEST_VALUE_2 = "Test_Non_JTA_2";
+	
+	public static final String NATIVE_SQL_KEY = Connection.ECLIPSELINK_NATIVE_SQL;
+	public static final Boolean NATIVE_SQL_TEST_VALUE = false;
+	public static final Boolean NATIVE_SQL_TEST_VALUE_2 = ! NATIVE_SQL_TEST_VALUE;
+
+	public static final String BATCH_WRITING_KEY = Connection.ECLIPSELINK_BATCH_WRITING;
+	public static final BatchWriting BATCH_WRITING_TEST_VALUE = BatchWriting.oracle_jdbc;
+	public static final BatchWriting BATCH_WRITING_TEST_VALUE_2 = BatchWriting.buffered;
+	
+	public static final String CACHE_STATEMENTS_KEY = Connection.ECLIPSELINK_CACHE_STATEMENTS;
+	public static final Boolean CACHE_STATEMENTS_TEST_VALUE = false;
+	public static final Boolean CACHE_STATEMENTS_TEST_VALUE_2 = ! CACHE_STATEMENTS_TEST_VALUE;
+	
+	public static final String CACHE_STATEMENTS_SIZE_KEY = Connection.ECLIPSELINK_CACHE_STATEMENTS_SIZE;
+	public static final Integer CACHE_STATEMENTS_SIZE_TEST_VALUE = 100;
+	public static final Integer CACHE_STATEMENTS_SIZE_TEST_VALUE_2 = 200;
+	
+	public static final String DRIVER_KEY = Connection.ECLIPSELINK_DRIVER;
+	public static final String DRIVER_TEST_VALUE = "connection.driver";
+	public static final String DRIVER_TEST_VALUE_2 = "connection.driver.2";
+	
+	public static final String URL_KEY = Connection.ECLIPSELINK_URL;
+	public static final String URL_TEST_VALUE = "test";
+	public static final String URL_TEST_VALUE_2 = "test_2";
+
+	public static final String USER_KEY = Connection.ECLIPSELINK_USER;
+	public static final String USER_TEST_VALUE = "test";
+	public static final String USER_TEST_VALUE_2 = "test_2";
+
+	public static final String PASSWORD_KEY = Connection.ECLIPSELINK_PASSWORD;
+	public static final String PASSWORD_TEST_VALUE = "test";
+	public static final String PASSWORD_TEST_VALUE_2 = "test_2";
+	
+	public static final String BIND_PARAMETERS_KEY = Connection.ECLIPSELINK_BIND_PARAMETERS;
+	public static final Boolean BIND_PARAMETERS_TEST_VALUE = false;
+	public static final Boolean BIND_PARAMETERS_TEST_VALUE_2 = ! BIND_PARAMETERS_TEST_VALUE;
+	
+	public static final String READ_CONNECTIONS_SHARED_KEY = Connection.ECLIPSELINK_READ_CONNECTIONS_SHARED;
+	public static final Boolean READ_CONNECTIONS_SHARED_TEST_VALUE = false;
+	public static final Boolean READ_CONNECTIONS_SHARED_TEST_VALUE_2 = ! READ_CONNECTIONS_SHARED_TEST_VALUE;
+	
+	public static final String READ_CONNECTIONS_MIN_KEY = Connection.ECLIPSELINK_READ_CONNECTIONS_MIN;
+	public static final Integer READ_CONNECTIONS_MIN_TEST_VALUE = 100;
+	public static final Integer READ_CONNECTIONS_MIN_TEST_VALUE_2 = 200;
+	
+	public static final String READ_CONNECTIONS_MAX_KEY = Connection.ECLIPSELINK_READ_CONNECTIONS_MAX;
+	public static final Integer READ_CONNECTIONS_MAX_TEST_VALUE = 100;
+	public static final Integer READ_CONNECTIONS_MAX_TEST_VALUE_2 = 200;
+	
+	public static final String WRITE_CONNECTIONS_MIN_KEY = Connection.ECLIPSELINK_WRITE_CONNECTIONS_MIN;
+	public static final Integer WRITE_CONNECTIONS_MIN_TEST_VALUE = 100;
+	public static final Integer WRITE_CONNECTIONS_MIN_TEST_VALUE_2 = 200;
+	
+	public static final String WRITE_CONNECTIONS_MAX_KEY = Connection.ECLIPSELINK_WRITE_CONNECTIONS_MAX;
+	public static final Integer WRITE_CONNECTIONS_MAX_TEST_VALUE = 100;
+	public static final Integer WRITE_CONNECTIONS_MAX_TEST_VALUE_2 = 200;
+
+	public static final String EXCLUSIVE_CONNECTION_MODE_KEY = Connection.ECLIPSELINK_EXCLUSIVE_CONNECTION_MODE;
+	public static final ExclusiveConnectionMode EXCLUSIVE_CONNECTION_MODE_TEST_VALUE = ExclusiveConnectionMode.always;
+	public static final ExclusiveConnectionMode EXCLUSIVE_CONNECTION_MODE_TEST_VALUE_2 = ExclusiveConnectionMode.isolated;
+	
+	public static final String LAZY_CONNECTION_KEY = Connection.ECLIPSELINK_LAZY_CONNECTION;
+	public static final Boolean LAZY_CONNECTION_TEST_VALUE = false;
+	public static final Boolean LAZY_CONNECTION_TEST_VALUE_2 = ! LAZY_CONNECTION_TEST_VALUE;
+	
+	// ********** constructors **********
+	public EclipseLinkConnectionTests(String name) {
+		super(name);
+	}
+
+	// ********** behavior **********
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.connection = this.subject.getConnection();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+		
+		this.connection.addPropertyChangeListener(Connection.NATIVE_SQL_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.BATCH_WRITING_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.CACHE_STATEMENTS_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.CACHE_STATEMENTS_SIZE_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.DRIVER_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.URL_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.USER_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.PASSWORD_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.BIND_PARAMETERS_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.READ_CONNECTIONS_SHARED_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.READ_CONNECTIONS_MIN_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.READ_CONNECTIONS_MAX_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.WRITE_CONNECTIONS_MIN_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.WRITE_CONNECTIONS_MAX_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.EXCLUSIVE_CONNECTION_MODE_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.LAZY_CONNECTION_PROPERTY, propertyChangeListener);
+		
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing.
+	 */
+	@Override
+	protected void populatePu() {
+		this.modelPropertiesSizeOriginal = 16; // EclipseLink properties
+		this.propertiesTotal = this.modelPropertiesSizeOriginal + 4; // 4 misc properties
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		// Initializes EclipseLink properties
+		this.persistenceUnitSetProperty("misc.property.1", "value.1");
+		this.persistenceUnitSetProperty(NATIVE_SQL_KEY, NATIVE_SQL_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(BATCH_WRITING_KEY, BATCH_WRITING_TEST_VALUE);
+		this.persistenceUnitSetProperty(CACHE_STATEMENTS_KEY, CACHE_STATEMENTS_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(CACHE_STATEMENTS_SIZE_KEY, CACHE_STATEMENTS_SIZE_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(DRIVER_KEY, DRIVER_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(URL_KEY, URL_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(USER_KEY, USER_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(PASSWORD_KEY, PASSWORD_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(BIND_PARAMETERS_KEY, BIND_PARAMETERS_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty("misc.property.2", "value.2");
+		this.persistenceUnitSetProperty("misc.property.3", "value.3");
+		this.persistenceUnitSetProperty(READ_CONNECTIONS_SHARED_KEY, READ_CONNECTIONS_SHARED_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(READ_CONNECTIONS_MIN_KEY, READ_CONNECTIONS_MIN_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(READ_CONNECTIONS_MAX_KEY, READ_CONNECTIONS_MAX_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(WRITE_CONNECTIONS_MIN_KEY, WRITE_CONNECTIONS_MIN_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(WRITE_CONNECTIONS_MAX_KEY, WRITE_CONNECTIONS_MAX_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty("misc.property.4", "value.4");
+		this.persistenceUnitSetProperty(EXCLUSIVE_CONNECTION_MODE_KEY, EXCLUSIVE_CONNECTION_MODE_TEST_VALUE);
+		this.persistenceUnitSetProperty(LAZY_CONNECTION_KEY, LAZY_CONNECTION_TEST_VALUE.toString());
+		
+		// Initializes PU elements
+		this.getPersistenceUnit().setSpecifiedTransactionType(TRANSACTION_TYPE_TEST_VALUE);
+		this.getPersistenceUnit().setJtaDataSource(JTA_DATA_SOURCE_TEST_VALUE);
+		this.getPersistenceUnit().setNonJtaDataSource(NON_JTA_DATA_SOURCE_TEST_VALUE);
+		return;
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.connection;
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		if (propertyName.equals(Connection.NATIVE_SQL_PROPERTY))
+			this.connection.setNativeSql((Boolean) newValue);
+		else if (propertyName.equals(Connection.BATCH_WRITING_PROPERTY))
+			this.connection.setBatchWriting((BatchWriting) newValue);
+		else if (propertyName.equals(Connection.CACHE_STATEMENTS_PROPERTY))
+			this.connection.setCacheStatements((Boolean) newValue);
+		else if (propertyName.equals(Connection.CACHE_STATEMENTS_SIZE_PROPERTY))
+			this.connection.setCacheStatementsSize((Integer) newValue);
+		else if (propertyName.equals(Connection.DRIVER_PROPERTY))
+			this.connection.setDriver((String) newValue);
+		else if (propertyName.equals(Connection.URL_PROPERTY))
+			this.connection.setUrl((String) newValue);
+		else if (propertyName.equals(Connection.USER_PROPERTY))
+			this.connection.setUser((String) newValue);
+		else if (propertyName.equals(Connection.PASSWORD_PROPERTY))
+			this.connection.setPassword((String) newValue);
+		else if (propertyName.equals(Connection.BIND_PARAMETERS_PROPERTY))
+			this.connection.setBindParameters((Boolean) newValue);
+		else if (propertyName.equals(Connection.READ_CONNECTIONS_SHARED_PROPERTY))
+			this.connection.setReadConnectionsShared((Boolean) newValue);
+		else if (propertyName.equals(Connection.READ_CONNECTIONS_MIN_PROPERTY))
+			this.connection.setReadConnectionsMin((Integer) newValue);
+		else if (propertyName.equals(Connection.READ_CONNECTIONS_MAX_PROPERTY))
+			this.connection.setReadConnectionsMax((Integer) newValue);
+		else if (propertyName.equals(Connection.WRITE_CONNECTIONS_MIN_PROPERTY))
+			this.connection.setWriteConnectionsMin((Integer) newValue);
+		else if (propertyName.equals(Connection.WRITE_CONNECTIONS_MAX_PROPERTY))
+			this.connection.setWriteConnectionsMax((Integer) newValue);
+		else if (propertyName.equals(Connection.EXCLUSIVE_CONNECTION_MODE_PROPERTY))
+			this.connection.setExclusiveConnectionMode((ExclusiveConnectionMode) newValue);
+		else if (propertyName.equals(Connection.LAZY_CONNECTION_PROPERTY))
+			this.connection.setLazyConnection((Boolean) newValue);
+		else
+			this.throwMissingDefinition("setProperty", propertyName);
+	}
+	
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		Object modelValue = null;
+		if (propertyName.equals(Connection.NATIVE_SQL_PROPERTY))
+			modelValue = this.connection.getNativeSql();
+		else if (propertyName.equals(Connection.BATCH_WRITING_PROPERTY))
+			modelValue = this.connection.getBatchWriting();
+		else if (propertyName.equals(Connection.CACHE_STATEMENTS_PROPERTY))
+			modelValue = this.connection.getCacheStatements();
+		else if (propertyName.equals(Connection.CACHE_STATEMENTS_SIZE_PROPERTY))
+			modelValue = this.connection.getCacheStatementsSize();
+		else if (propertyName.equals(Connection.DRIVER_PROPERTY))
+			modelValue = this.connection.getDriver();
+		else if (propertyName.equals(Connection.URL_PROPERTY))
+			modelValue = this.connection.getUrl();
+		else if (propertyName.equals(Connection.USER_PROPERTY))
+			modelValue = this.connection.getUser();
+		else if (propertyName.equals(Connection.PASSWORD_PROPERTY))
+			modelValue = this.connection.getPassword();
+		else if (propertyName.equals(Connection.BIND_PARAMETERS_PROPERTY))
+			modelValue = this.connection.getBindParameters();
+		else if (propertyName.equals(Connection.READ_CONNECTIONS_SHARED_PROPERTY))
+			modelValue = this.connection.getReadConnectionsShared();
+		else if (propertyName.equals(Connection.READ_CONNECTIONS_MIN_PROPERTY))
+			modelValue = this.connection.getReadConnectionsMin();
+		else if (propertyName.equals(Connection.READ_CONNECTIONS_MAX_PROPERTY))
+			modelValue = this.connection.getReadConnectionsMax();
+		else if (propertyName.equals(Connection.WRITE_CONNECTIONS_MIN_PROPERTY))
+			modelValue = this.connection.getWriteConnectionsMin();
+		else if (propertyName.equals(Connection.WRITE_CONNECTIONS_MAX_PROPERTY))
+			modelValue = this.connection.getWriteConnectionsMax();
+		else if (propertyName.equals(Connection.EXCLUSIVE_CONNECTION_MODE_PROPERTY))
+			modelValue = this.connection.getExclusiveConnectionMode();
+		else if (propertyName.equals(Connection.LAZY_CONNECTION_PROPERTY))
+			modelValue = this.connection.getLazyConnection();
+		else
+			this.throwMissingDefinition("getProperty", propertyName);
+		return modelValue;
+	}
+
+	// ********** NativeSql tests **********
+	public void testSetNativeSql() throws Exception {
+		this.verifyModelInitialized(
+			NATIVE_SQL_KEY,
+			NATIVE_SQL_TEST_VALUE);
+		this.verifySetProperty(
+			NATIVE_SQL_KEY,
+			NATIVE_SQL_TEST_VALUE,
+			NATIVE_SQL_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveNativeSql() throws Exception {
+		this.verifyAddRemoveProperty(
+			NATIVE_SQL_KEY,
+			NATIVE_SQL_TEST_VALUE,
+			NATIVE_SQL_TEST_VALUE_2);
+	}
+
+	// ********** BatchWriting tests **********
+	public void testSetBatchWriting() throws Exception {
+		this.verifyModelInitialized(
+			BATCH_WRITING_KEY,
+			BATCH_WRITING_TEST_VALUE);
+		this.verifySetProperty(
+			BATCH_WRITING_KEY,
+			BATCH_WRITING_TEST_VALUE,
+			BATCH_WRITING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveBatchWriting() throws Exception {
+		this.verifyAddRemoveProperty(
+			BATCH_WRITING_KEY,
+			BATCH_WRITING_TEST_VALUE,
+			BATCH_WRITING_TEST_VALUE_2);
+	}
+
+	// ********** CacheStatements tests **********
+	public void testSetCacheStatements() throws Exception {
+		this.verifyModelInitialized(
+			CACHE_STATEMENTS_KEY,
+			CACHE_STATEMENTS_TEST_VALUE);
+		this.verifySetProperty(
+			CACHE_STATEMENTS_KEY,
+			CACHE_STATEMENTS_TEST_VALUE,
+			CACHE_STATEMENTS_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveCacheStatements() throws Exception {
+		this.verifyAddRemoveProperty(
+			CACHE_STATEMENTS_KEY,
+			CACHE_STATEMENTS_TEST_VALUE,
+			CACHE_STATEMENTS_TEST_VALUE_2);
+	}
+	
+	// ********** CacheStatementsSize tests **********
+	public void testSetCacheStatementsSize() throws Exception {
+		this.verifyModelInitialized(
+			CACHE_STATEMENTS_SIZE_KEY,
+			CACHE_STATEMENTS_SIZE_TEST_VALUE);
+		this.verifySetProperty(
+			CACHE_STATEMENTS_SIZE_KEY,
+			CACHE_STATEMENTS_SIZE_TEST_VALUE,
+			CACHE_STATEMENTS_SIZE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveCacheStatementsSize() throws Exception {
+		this.verifyAddRemoveProperty(
+			CACHE_STATEMENTS_SIZE_KEY,
+			CACHE_STATEMENTS_SIZE_TEST_VALUE,
+			CACHE_STATEMENTS_SIZE_TEST_VALUE_2);
+	}
+
+	// ********** Driver tests **********
+	public void testSetDriver() throws Exception {
+		this.verifyModelInitialized(
+			DRIVER_KEY,
+			DRIVER_TEST_VALUE);
+		this.verifySetProperty(
+			DRIVER_KEY,
+			DRIVER_TEST_VALUE,
+			DRIVER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveDriver() throws Exception {
+		this.verifyAddRemoveProperty(
+			DRIVER_KEY,
+			DRIVER_TEST_VALUE,
+			DRIVER_TEST_VALUE_2);
+	}
+
+	// ********** Url tests **********
+	public void testSetUrl() throws Exception {
+		this.verifyModelInitialized(
+			URL_KEY,
+			URL_TEST_VALUE);
+		this.verifySetProperty(
+			URL_KEY,
+			URL_TEST_VALUE,
+			URL_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveUrl() throws Exception {
+		this.verifyAddRemoveProperty(
+			URL_KEY,
+			URL_TEST_VALUE,
+			URL_TEST_VALUE_2);
+	}
+
+	// ********** User tests **********
+	public void testSetUser() throws Exception {
+		this.verifyModelInitialized(
+			USER_KEY,
+			USER_TEST_VALUE);
+		this.verifySetProperty(
+			USER_KEY,
+			USER_TEST_VALUE,
+			USER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveUser() throws Exception {
+		this.verifyAddRemoveProperty(
+			USER_KEY,
+			USER_TEST_VALUE,
+			USER_TEST_VALUE_2);
+	}
+
+	// ********** Password tests **********
+	public void testSetPassword() throws Exception {
+		this.verifyModelInitialized(
+			PASSWORD_KEY,
+			PASSWORD_TEST_VALUE);
+		this.verifySetProperty(
+			PASSWORD_KEY,
+			PASSWORD_TEST_VALUE,
+			PASSWORD_TEST_VALUE_2);
+	}
+
+	public void testAddRemovePassword() throws Exception {
+		this.verifyAddRemoveProperty(
+			PASSWORD_KEY,
+			PASSWORD_TEST_VALUE,
+			PASSWORD_TEST_VALUE_2);
+	}
+
+	// ********** BindParameters tests **********
+	public void testSetBindParameters() throws Exception {
+		this.verifyModelInitialized(
+			BIND_PARAMETERS_KEY,
+			BIND_PARAMETERS_TEST_VALUE);
+		this.verifySetProperty(
+			BIND_PARAMETERS_KEY,
+			BIND_PARAMETERS_TEST_VALUE,
+			BIND_PARAMETERS_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveBindParameters() throws Exception {
+		this.verifyAddRemoveProperty(
+			BIND_PARAMETERS_KEY,
+			BIND_PARAMETERS_TEST_VALUE,
+			BIND_PARAMETERS_TEST_VALUE_2);
+	}
+
+	// ********** ReadConnectionsShared tests **********
+	public void testSetReadConnectionsShared() throws Exception {
+		this.verifyModelInitialized(
+			READ_CONNECTIONS_SHARED_KEY,
+			READ_CONNECTIONS_SHARED_TEST_VALUE);
+		this.verifySetProperty(
+			READ_CONNECTIONS_SHARED_KEY,
+			READ_CONNECTIONS_SHARED_TEST_VALUE,
+			READ_CONNECTIONS_SHARED_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveReadConnectionsShared() throws Exception {
+		this.verifyAddRemoveProperty(
+			READ_CONNECTIONS_SHARED_KEY,
+			READ_CONNECTIONS_SHARED_TEST_VALUE,
+			READ_CONNECTIONS_SHARED_TEST_VALUE_2);
+	}
+	
+	// ********** ReadConnectionsMin tests **********
+	public void testSetReadConnectionsMin() throws Exception {
+		this.verifyModelInitialized(
+			READ_CONNECTIONS_MIN_KEY,
+			READ_CONNECTIONS_MIN_TEST_VALUE);
+		this.verifySetProperty(
+			READ_CONNECTIONS_MIN_KEY,
+			READ_CONNECTIONS_MIN_TEST_VALUE,
+			READ_CONNECTIONS_MIN_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveReadConnectionsMin() throws Exception {
+		this.verifyAddRemoveProperty(
+			READ_CONNECTIONS_MIN_KEY,
+			READ_CONNECTIONS_MIN_TEST_VALUE,
+			READ_CONNECTIONS_MIN_TEST_VALUE_2);
+	}
+	
+	// ********** ReadConnectionsMax tests **********
+	public void testSetReadConnectionsMax() throws Exception {
+		this.verifyModelInitialized(
+			READ_CONNECTIONS_MAX_KEY,
+			READ_CONNECTIONS_MAX_TEST_VALUE);
+		this.verifySetProperty(
+			READ_CONNECTIONS_MAX_KEY,
+			READ_CONNECTIONS_MAX_TEST_VALUE,
+			READ_CONNECTIONS_MAX_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveReadConnectionsMax() throws Exception {
+		this.verifyAddRemoveProperty(
+			READ_CONNECTIONS_MAX_KEY,
+			READ_CONNECTIONS_MAX_TEST_VALUE,
+			READ_CONNECTIONS_MAX_TEST_VALUE_2);
+	}
+	
+	// ********** WriteConnectionsMin tests **********
+	public void testSetWriteConnectionsMin() throws Exception {
+		this.verifyModelInitialized(
+			WRITE_CONNECTIONS_MIN_KEY,
+			WRITE_CONNECTIONS_MIN_TEST_VALUE);
+		this.verifySetProperty(
+			WRITE_CONNECTIONS_MIN_KEY,
+			WRITE_CONNECTIONS_MIN_TEST_VALUE,
+			WRITE_CONNECTIONS_MIN_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveWriteConnectionsMin() throws Exception {
+		this.verifyAddRemoveProperty(
+			WRITE_CONNECTIONS_MIN_KEY,
+			WRITE_CONNECTIONS_MIN_TEST_VALUE,
+			WRITE_CONNECTIONS_MIN_TEST_VALUE_2);
+	}
+	
+	// ********** WriteConnectionsMax tests **********
+	public void testSetWriteConnectionsMax() throws Exception {
+		this.verifyModelInitialized(
+			WRITE_CONNECTIONS_MAX_KEY,
+			WRITE_CONNECTIONS_MAX_TEST_VALUE);
+		this.verifySetProperty(
+			WRITE_CONNECTIONS_MAX_KEY,
+			WRITE_CONNECTIONS_MAX_TEST_VALUE,
+			WRITE_CONNECTIONS_MAX_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveWriteConnectionsMax() throws Exception {
+		this.verifyAddRemoveProperty(
+			WRITE_CONNECTIONS_MAX_KEY,
+			WRITE_CONNECTIONS_MAX_TEST_VALUE,
+			WRITE_CONNECTIONS_MAX_TEST_VALUE_2);
+	}
+
+	// ********** ExclusiveConnectionMode tests **********
+	public void testSetExclusiveConnectionMode() throws Exception {
+		this.verifyModelInitialized(
+			EXCLUSIVE_CONNECTION_MODE_KEY,
+			EXCLUSIVE_CONNECTION_MODE_TEST_VALUE);
+		this.verifySetProperty(
+			EXCLUSIVE_CONNECTION_MODE_KEY,
+			EXCLUSIVE_CONNECTION_MODE_TEST_VALUE,
+			EXCLUSIVE_CONNECTION_MODE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveExclusiveConnectionMode() throws Exception {
+		this.verifyAddRemoveProperty(
+			EXCLUSIVE_CONNECTION_MODE_KEY,
+			EXCLUSIVE_CONNECTION_MODE_TEST_VALUE,
+			EXCLUSIVE_CONNECTION_MODE_TEST_VALUE_2);
+	}
+
+	// ********** LazyConnection tests **********
+	public void testSetLazyConnection() throws Exception {
+		this.verifyModelInitialized(
+			LAZY_CONNECTION_KEY,
+			LAZY_CONNECTION_TEST_VALUE);
+		this.verifySetProperty(
+			LAZY_CONNECTION_KEY,
+			LAZY_CONNECTION_TEST_VALUE,
+			LAZY_CONNECTION_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveLazyConnection() throws Exception {
+		this.verifyAddRemoveProperty(
+			LAZY_CONNECTION_KEY,
+			LAZY_CONNECTION_TEST_VALUE,
+			LAZY_CONNECTION_TEST_VALUE_2);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/connection/JptEclipseLinkPersistenceConnectionTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/connection/JptEclipseLinkPersistenceConnectionTests.java
new file mode 100644
index 0000000..84a595b
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/connection/JptEclipseLinkPersistenceConnectionTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.connection;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * decentralize test creation code
+ */
+public class JptEclipseLinkPersistenceConnectionTests
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkPersistenceConnectionTests.class.getPackage().getName());
+		
+//		suite.addTestSuite(ConnectionValueModelTests.class);
+		suite.addTestSuite(EclipseLinkConnectionTests.class);
+		
+		return suite;
+	}
+
+	private JptEclipseLinkPersistenceConnectionTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/customization/CustomizationValueModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/customization/CustomizationValueModelTests.java
new file mode 100644
index 0000000..abff999
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/customization/CustomizationValueModelTests.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.customization;
+
+import org.eclipse.jpt.common.utility.internal.model.AbstractModel;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.customization.Customization;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.customization.Entity;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * CustomizationValueModelTests
+ */
+public class CustomizationValueModelTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private Customization customization;
+
+	private WritablePropertyValueModel<Boolean> throwExceptionsHolder;
+	private PropertyChangeListener throwExceptionsListener;
+	private PropertyChangeEvent throwExceptionsEvent;
+
+	public static final String ENTITY_NAME_TEST_VALUE = "Employee";
+	public static final Boolean THROW_EXCEPTIONS_TEST_VALUE = Boolean.FALSE;
+	public static final String CUSTOMIZER_TEST_VALUE = "acme.sessions.Customizer";
+
+	public CustomizationValueModelTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.customization = this.subject.getCustomization(); // Subject
+		PropertyValueModel<Customization> customizationHolder = new SimplePropertyValueModel<Customization>(this.customization);
+		
+		this.throwExceptionsHolder = this.buildThrowExceptionsAA(customizationHolder);
+		this.throwExceptionsListener = this.buildThrowExceptionsChangeListener();
+		this.throwExceptionsHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.throwExceptionsListener);
+		this.throwExceptionsEvent = null;
+	}
+
+	public void testHasListeners() {
+		AbstractModel subjectCustomization = (AbstractModel) this.customization; // Subject
+		
+		PropertyAspectAdapter<Customization, Boolean> throwExceptionsAA = 
+			(PropertyAspectAdapter<Customization, Boolean>) this.throwExceptionsHolder;
+		assertTrue(throwExceptionsAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		assertTrue(subjectCustomization.hasAnyPropertyChangeListeners(Customization.THROW_EXCEPTIONS_PROPERTY));
+		
+		throwExceptionsAA.removePropertyChangeListener(PropertyValueModel.VALUE, this.throwExceptionsListener);
+		assertFalse(subjectCustomization.hasAnyPropertyChangeListeners(Customization.THROW_EXCEPTIONS_PROPERTY));
+		assertFalse(throwExceptionsAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing. 
+	 */
+	@Override
+	protected void populatePu() {
+		this.persistenceUnitSetProperty(
+			Customization.ECLIPSELINK_THROW_EXCEPTIONS, 
+			THROW_EXCEPTIONS_TEST_VALUE);
+		return;
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.customization;
+	}
+
+	// ****** ThrowExceptions *******
+	private WritablePropertyValueModel<Boolean> buildThrowExceptionsAA(PropertyValueModel<Customization> subjectHolder) {
+		return new PropertyAspectAdapter<Customization, Boolean>(subjectHolder, Customization.THROW_EXCEPTIONS_PROPERTY) {
+			@Override
+			protected Boolean buildValue_() {
+				return this.subject.getThrowExceptions();
+			}
+
+			@Override
+			protected void setValue_(Boolean enumValue) {
+				this.subject.setThrowExceptions(enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildThrowExceptionsChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				CustomizationValueModelTests.this.throwExceptionsEvent = e;
+			}
+		};
+	}
+
+	/** ****** Basic Entity's Properties Tests ******* */
+
+	public void testClone() {
+		Entity entity = this.buildEntity("TestEntity", CUSTOMIZER_TEST_VALUE);
+
+		this.verifyClone(entity, entity.clone());
+	}
+	
+	public void testEquals() {
+		Entity entity1 = this.buildEntity("TestEntityA", CUSTOMIZER_TEST_VALUE);
+		Entity entity2 = this.buildEntity("TestEntityB", CUSTOMIZER_TEST_VALUE);
+		assertEquals(entity1, entity2);
+		Entity entity3 = this.buildEntity("TestEntityC", CUSTOMIZER_TEST_VALUE);
+		assertEquals(entity1, entity3);
+		assertEquals(entity2, entity3);
+	}
+	
+	public void testIsEmpty() {
+		Entity entity = this.buildEntity("TestEntity");
+		assertTrue(entity.isEmpty());
+		this.customization.setDescriptorCustomizerOf(entity.getName(), CUSTOMIZER_TEST_VALUE);
+		assertFalse(entity.isEmpty());
+	}
+
+	private void verifyClone(Entity original, Entity clone) {
+		assertNotSame(original, clone);
+		assertEquals(original, original);
+		assertEquals(original, clone);
+	}
+
+	private Entity buildEntity(String name) {
+		return this.customization.addEntity(name);
+	}
+
+	private Entity buildEntity(String name, String aClassName) {
+		Entity entity = this.customization.addEntity(name);
+		this.customization.setDescriptorCustomizerOf(entity.getName(), aClassName);
+		return entity;
+	}
+
+	// ****** Tests ******* 
+	public void testValue() {
+		// ****** ThrowExceptions ******* 
+		this.verifyThrowExceptionsAAValue(THROW_EXCEPTIONS_TEST_VALUE);
+		assertEquals(Customization.DEFAULT_THROW_EXCEPTIONS, this.customization.getDefaultThrowExceptions());
+	}
+
+	public void testSetValue() throws Exception {
+		// ****** ThrowExceptions ******* 
+		this.throwExceptionsEvent = null;
+		this.verifyHasListeners(this.throwExceptionsHolder, PropertyValueModel.VALUE);
+		Boolean newThrowExceptions = !THROW_EXCEPTIONS_TEST_VALUE;
+		// Modify the property holder
+		this.throwExceptionsHolder.setValue(newThrowExceptions);
+		this.verifyThrowExceptionsAAValue(newThrowExceptions);
+		assertNotNull(this.throwExceptionsEvent);
+	}
+
+	public void testSetNullValue() {
+		String notDeleted = "Property not deleted";
+		// ****** ThrowExceptions *******
+		this.throwExceptionsEvent = null;
+		// Setting the property holder
+		this.throwExceptionsHolder.setValue(null);
+		// testing Holder
+		this.verifyThrowExceptionsAAValue(null);
+		assertNotNull(this.throwExceptionsEvent);
+		// testing PU properties
+		this.verifyPuHasNotProperty(Customization.ECLIPSELINK_THROW_EXCEPTIONS, notDeleted);
+	}
+
+	// ****** convenience methods *******
+
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifyThrowExceptionsAAValue(Boolean testValue) {
+		this.verifyAAValue(
+			testValue, 
+			this.customization.getThrowExceptions(), 
+			this.throwExceptionsHolder, 
+			Customization.ECLIPSELINK_THROW_EXCEPTIONS);
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/customization/EclipseLinkCustomizationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/customization/EclipseLinkCustomizationTests.java
new file mode 100644
index 0000000..d9af336
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/customization/EclipseLinkCustomizationTests.java
@@ -0,0 +1,761 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.customization;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.model.event.ListAddEvent;
+import org.eclipse.jpt.common.utility.model.event.ListChangeEvent;
+import org.eclipse.jpt.common.utility.model.event.ListClearEvent;
+import org.eclipse.jpt.common.utility.model.event.ListEvent;
+import org.eclipse.jpt.common.utility.model.event.ListMoveEvent;
+import org.eclipse.jpt.common.utility.model.event.ListRemoveEvent;
+import org.eclipse.jpt.common.utility.model.event.ListReplaceEvent;
+import org.eclipse.jpt.common.utility.model.listener.ListChangeListener;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.customization.Customization;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.customization.Profiler;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.customization.Weaving;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.customization.EclipseLinkCustomization;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.customization.Entity;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * Tests the update of model objects by the Customization adapter when the
+ * PersistenceUnit changes.
+ */
+@SuppressWarnings("nls")
+public class EclipseLinkCustomizationTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private Customization customization;
+	private ListEvent entitiesEvent;
+	private ListEvent sessionCustomizersEvent;
+
+	public static final String ENTITY_TEST = "Employee";
+	public static final String ENTITY_TEST_2 = "Address";
+
+	public static final String THROW_EXCEPTIONS_KEY = Customization.ECLIPSELINK_THROW_EXCEPTIONS;
+	public static final Boolean THROW_EXCEPTIONS_TEST_VALUE = false;
+	public static final Boolean THROW_EXCEPTIONS_TEST_VALUE_2 = ! THROW_EXCEPTIONS_TEST_VALUE;
+
+	public static final String WEAVING_LAZY_KEY = Customization.ECLIPSELINK_WEAVING_LAZY;
+	public static final Boolean WEAVING_LAZY_TEST_VALUE = false;
+	public static final Boolean WEAVING_LAZY_TEST_VALUE_2 = ! WEAVING_LAZY_TEST_VALUE;
+
+	public static final String WEAVING_CHANGE_TRACKING_KEY = Customization.ECLIPSELINK_WEAVING_CHANGE_TRACKING;
+	public static final Boolean WEAVING_CHANGE_TRACKING_TEST_VALUE = false;
+	public static final Boolean WEAVING_CHANGE_TRACKING_TEST_VALUE_2 = ! WEAVING_CHANGE_TRACKING_TEST_VALUE;
+
+	public static final String WEAVING_FETCH_GROUPS_KEY = Customization.ECLIPSELINK_WEAVING_FETCH_GROUPS;
+	public static final Boolean WEAVING_FETCH_GROUPS_TEST_VALUE = false;
+	public static final Boolean WEAVING_FETCH_GROUPS_TEST_VALUE_2 = ! WEAVING_FETCH_GROUPS_TEST_VALUE;
+
+	public static final String WEAVING_INTERNAL_KEY = Customization.ECLIPSELINK_WEAVING_INTERNAL;
+	public static final Boolean WEAVING_INTERNAL_TEST_VALUE = false;
+	public static final Boolean WEAVING_INTERNAL_TEST_VALUE_2 = ! WEAVING_INTERNAL_TEST_VALUE;
+
+	public static final String WEAVING_EAGER_KEY = Customization.ECLIPSELINK_WEAVING_EAGER;
+	public static final Boolean WEAVING_EAGER_TEST_VALUE = true;
+	public static final Boolean WEAVING_EAGER_TEST_VALUE_2 = ! WEAVING_EAGER_TEST_VALUE;
+
+	public static final String VALIDATION_ONLY_KEY = Customization.ECLIPSELINK_VALIDATION_ONLY;
+	public static final Boolean VALIDATION_ONLY_TEST_VALUE = false;
+	public static final Boolean VALIDATION_ONLY_TEST_VALUE_2 = ! VALIDATION_ONLY_TEST_VALUE;
+
+	public static final String VALIDATE_SCHEMA_KEY = Customization.ECLIPSELINK_VALIDATE_SCHEMA;
+	public static final Boolean VALIDATE_SCHEMA_TEST_VALUE = true;
+	public static final Boolean VALIDATE_SCHEMA_TEST_VALUE_2 = ! VALIDATE_SCHEMA_TEST_VALUE;
+
+	private static final String SESSION_CUSTOMIZER_KEY = Customization.ECLIPSELINK_SESSION_CUSTOMIZER;
+	private static final String SESSION_CUSTOMIZER_TEST_VALUE = "java.lang.String";
+	private static final String SESSION_CUSTOMIZER_TEST_VALUE_2 = "java.lang.Boolean";
+
+	public static final String WEAVING_KEY = Customization.ECLIPSELINK_WEAVING;
+	public static final Weaving WEAVING_TEST_VALUE = Weaving.false_;
+	public static final Weaving WEAVING_TEST_VALUE_2 = Weaving.static_;
+
+	public static final String CUSTOMIZER_KEY = Customization.ECLIPSELINK_DESCRIPTOR_CUSTOMIZER + ENTITY_TEST;
+	public static final String CUSTOMIZER_TEST_VALUE = "acme.sessions.DescriptorCustomizer";
+	public static final String CUSTOMIZER_TEST_VALUE_2 = "acme.sessions.Customizer";
+
+	private static final String PROFILER_KEY = Customization.ECLIPSELINK_PROFILER;
+	private static final Profiler PROFILER_TEST_VALUE = Profiler.query_monitor;
+	private static final String PROFILER_TEST_VALUE_2 = "custom.profiler.test";
+	
+	public static final String EXCEPTION_HANDLER_KEY = Customization.ECLIPSELINK_EXCEPTION_HANDLER;
+	public static final String EXCEPTION_HANDLER_TEST_VALUE = "acme.CustomSessionEventListener";
+	public static final String EXCEPTION_HANDLER_TEST_VALUE_2 = "oracle.sessions.CustomSessionEventListener";
+
+	// ********** constructors **********
+	public EclipseLinkCustomizationTests(String name) {
+		super(name);
+	}
+
+	// ********** behavior **********
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.customization = this.subject.getCustomization();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+		
+		this.customization.addPropertyChangeListener(Customization.THROW_EXCEPTIONS_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.WEAVING_LAZY_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.WEAVING_CHANGE_TRACKING_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.WEAVING_FETCH_GROUPS_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.WEAVING_INTERNAL_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.WEAVING_EAGER_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.WEAVING_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.VALIDATION_ONLY_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.VALIDATE_SCHEMA_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Entity.DESCRIPTOR_CUSTOMIZER_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.SESSION_CUSTOMIZER_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.PROFILER_PROPERTY, propertyChangeListener);
+		this.customization.addPropertyChangeListener(Customization.EXCEPTION_HANDLER_PROPERTY, propertyChangeListener);
+
+		ListChangeListener sessionCustomizersChangeListener = this.buildSessionCustomizersChangeListener();
+		this.customization.addListChangeListener(Customization.SESSION_CUSTOMIZER_LIST, sessionCustomizersChangeListener);
+		
+		ListChangeListener entitiesChangeListener = this.buildEntitiesChangeListener();
+		this.customization.addListChangeListener(Customization.ENTITIES_LIST, entitiesChangeListener);
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing.
+	 */
+	@Override
+	protected void populatePu() {
+		this.modelPropertiesSizeOriginal = 13;
+		this.propertiesTotal = this.modelPropertiesSizeOriginal + 4; // 4 misc properties
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		this.persistenceUnitSetProperty("misc.property.1", "value.1");
+		this.persistenceUnitSetProperty(THROW_EXCEPTIONS_KEY, THROW_EXCEPTIONS_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(WEAVING_LAZY_KEY, WEAVING_LAZY_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(WEAVING_CHANGE_TRACKING_KEY, WEAVING_CHANGE_TRACKING_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(WEAVING_FETCH_GROUPS_KEY, WEAVING_FETCH_GROUPS_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(WEAVING_INTERNAL_KEY, WEAVING_INTERNAL_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(WEAVING_EAGER_KEY, WEAVING_EAGER_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(VALIDATION_ONLY_KEY, VALIDATION_ONLY_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(VALIDATE_SCHEMA_KEY, VALIDATE_SCHEMA_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty("misc.property.2", "value.2");
+		this.persistenceUnitSetProperty(SESSION_CUSTOMIZER_KEY, SESSION_CUSTOMIZER_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(WEAVING_KEY, WEAVING_TEST_VALUE);
+		this.persistenceUnitSetProperty("misc.property.3", "value.3");
+		this.persistenceUnitSetProperty("misc.property.4", "value.4");
+		this.persistenceUnitSetProperty(CUSTOMIZER_KEY, CUSTOMIZER_TEST_VALUE);
+		this.persistenceUnitSetProperty(PROFILER_KEY, PROFILER_TEST_VALUE);
+		this.persistenceUnitSetProperty(EXCEPTION_HANDLER_KEY, EXCEPTION_HANDLER_TEST_VALUE);
+		return;
+	}
+
+	// ********** Listeners **********
+	private ListChangeListener buildEntitiesChangeListener() {
+		return new ListChangeListener() {
+			public void itemsAdded(ListAddEvent e) {
+				EclipseLinkCustomizationTests.this.entityAdded(e);
+			}
+
+			public void itemsRemoved(ListRemoveEvent e) {
+				EclipseLinkCustomizationTests.this.entityRemoved(e);
+			}
+
+			public void itemsReplaced(ListReplaceEvent e) {
+				EclipseLinkCustomizationTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void itemsMoved(ListMoveEvent e) {
+				EclipseLinkCustomizationTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void listCleared(ListClearEvent e) {
+				EclipseLinkCustomizationTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void listChanged(ListChangeEvent e) {
+				EclipseLinkCustomizationTests.this.throwUnsupportedOperationException(e);
+			}
+		};
+	}
+	
+	private ListChangeListener buildSessionCustomizersChangeListener() {
+		return new ListChangeListener() {
+			public void itemsAdded(ListAddEvent e) {
+				EclipseLinkCustomizationTests.this.sessionCustomizerAdded(e);
+			}
+
+			public void itemsRemoved(ListRemoveEvent e) {
+				EclipseLinkCustomizationTests.this.sessionCustomizerRemoved(e);
+			}
+
+			public void itemsReplaced(ListReplaceEvent e) {
+				EclipseLinkCustomizationTests.this.sessionCustomizerReplaced(e);
+			}
+
+			public void itemsMoved(ListMoveEvent e) {
+				EclipseLinkCustomizationTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void listCleared(ListClearEvent e) {
+				EclipseLinkCustomizationTests.this.sessionCustomizerListCleared(e);
+			}
+
+			public void listChanged(ListChangeEvent e) {
+				EclipseLinkCustomizationTests.this.throwUnsupportedOperationException(e);
+			}
+		};
+	}
+
+	@Override
+	protected void clearEvent() {
+		super.clearEvent();
+		this.entitiesEvent = null;
+		this.sessionCustomizersEvent = null;
+	}
+
+	void entityAdded(ListAddEvent e) {
+		this.entitiesEvent = e;
+	}
+
+	void entityRemoved(ListRemoveEvent e) {
+		this.entitiesEvent = e;
+	}
+
+	void sessionCustomizerAdded(ListAddEvent e) {
+		this.sessionCustomizersEvent = e;
+	}
+
+	void sessionCustomizerRemoved(ListRemoveEvent e) {
+		this.sessionCustomizersEvent = e;
+	}
+
+	void sessionCustomizerReplaced(ListReplaceEvent e) {
+		this.sessionCustomizersEvent = e;
+	}
+
+	void sessionCustomizerListCleared(ListClearEvent e) {
+		this.sessionCustomizersEvent = e;
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		if (propertyName.equals(Customization.THROW_EXCEPTIONS_PROPERTY))
+			this.customization.setThrowExceptions((Boolean) newValue);
+		else if (propertyName.equals(Customization.WEAVING_LAZY_PROPERTY))
+			this.customization.setWeavingLazy((Boolean) newValue);
+		else if (propertyName.equals(Customization.WEAVING_CHANGE_TRACKING_PROPERTY))
+			this.customization.setWeavingChangeTracking((Boolean) newValue);
+		else if (propertyName.equals(Customization.WEAVING_FETCH_GROUPS_PROPERTY))
+			this.customization.setWeavingFetchGroups((Boolean) newValue);
+		else if (propertyName.equals(Customization.WEAVING_INTERNAL_PROPERTY))
+			this.customization.setWeavingInternal((Boolean) newValue);
+		else if (propertyName.equals(Customization.WEAVING_EAGER_PROPERTY))
+			this.customization.setWeavingEager((Boolean) newValue);
+		else if (propertyName.equals(Customization.VALIDATION_ONLY_PROPERTY))
+			this.customization.setValidationOnly((Boolean) newValue);
+		else if (propertyName.equals(Customization.VALIDATE_SCHEMA_PROPERTY))
+			this.customization.setValidateSchema((Boolean) newValue);
+		else if (propertyName.equals(Customization.EXCEPTION_HANDLER_PROPERTY))
+			this.customization.setExceptionHandler((String) newValue);
+		else if (propertyName.equals(Customization.SESSION_CUSTOMIZER_PROPERTY))
+			this.customization.addSessionCustomizer((String) newValue);
+		else if (propertyName.equals(Customization.WEAVING_PROPERTY))
+			this.customization.setWeaving((Weaving) newValue);
+		else if (propertyName.equals(Customization.PROFILER_PROPERTY)) {
+			if (newValue.getClass().isEnum())
+				this.customization.setProfiler((Profiler) newValue);
+			else
+				this.customization.setProfiler((String) newValue);
+		}
+		else
+			this.throwMissingDefinition("setProperty", propertyName);
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		Object modelValue = null;
+		if (propertyName.equals(Customization.THROW_EXCEPTIONS_PROPERTY))
+			modelValue = this.customization.getThrowExceptions();
+		else if (propertyName.equals(Customization.WEAVING_PROPERTY))
+			modelValue = this.customization.getWeaving();
+		else if (propertyName.equals(Customization.WEAVING_LAZY_PROPERTY))
+			modelValue = this.customization.getWeavingLazy();
+		else if (propertyName.equals(Customization.WEAVING_CHANGE_TRACKING_PROPERTY))
+			modelValue = this.customization.getWeavingChangeTracking();
+		else if (propertyName.equals(Customization.WEAVING_FETCH_GROUPS_PROPERTY))
+			modelValue = this.customization.getWeavingFetchGroups();
+		else if (propertyName.equals(Customization.WEAVING_INTERNAL_PROPERTY))
+			modelValue = this.customization.getWeavingInternal();
+		else if (propertyName.equals(Customization.WEAVING_EAGER_PROPERTY))
+			modelValue = this.customization.getWeavingEager();
+		else if (propertyName.equals(Customization.VALIDATION_ONLY_PROPERTY))
+			modelValue = this.customization.getValidationOnly();
+		else if (propertyName.equals(Customization.VALIDATE_SCHEMA_PROPERTY))
+			modelValue = this.customization.getValidateSchema();
+		else if (propertyName.equals(Customization.EXCEPTION_HANDLER_PROPERTY))
+			modelValue = this.customization.getExceptionHandler();
+		else if (propertyName.equals(Customization.PROFILER_PROPERTY))
+			modelValue = this.customization.getProfiler();
+		else if (propertyName.equals(Customization.SESSION_CUSTOMIZER_PROPERTY)) {
+			ListIterator<String> iterator = this.customization.sessionCustomizers();
+			if(iterator.hasNext()) {
+				modelValue = iterator.next();
+			}
+		}
+		else if (propertyName.equals(Entity.DESCRIPTOR_CUSTOMIZER_PROPERTY))
+			modelValue = this.customization.getDescriptorCustomizerOf(ENTITY_TEST);
+		else
+			this.throwMissingDefinition("getProperty", propertyName);
+		return modelValue;
+	}
+	
+	@Override
+	protected void verifyPutProperty(String propertyName, Object expectedValue) throws Exception {
+		Object expectedValue_ = expectedValue;
+		if (propertyName.equals(Customization.PROFILER_PROPERTY)) {
+			
+			expectedValue_ = (expectedValue != null && expectedValue.getClass().isEnum()) ?
+				this.getPropertyStringValueOf(PROFILER_TEST_VALUE) : // model is storing EclipseLinkStringValue
+				expectedValue;
+		}
+		super.verifyPutProperty(propertyName, expectedValue_);
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.customization;
+	}
+
+	// ********** entities list **********
+	public void testEntitiesList() throws Exception {
+		// add
+		this.clearEvent();
+		this.customization.addEntity(ENTITY_TEST_2);
+		
+		// verify event received
+		assertNotNull("No Event Fired.", this.entitiesEvent);
+		// verify event for the expected property
+		assertEquals("Wrong Event.", this.entitiesEvent.getListName(), Customization.ENTITIES_LIST);
+		
+		// remove
+		this.clearEvent();
+		this.customization.removeEntity(ENTITY_TEST_2);
+		
+		// verify event received
+		assertNotNull("No Event Fired.", this.entitiesEvent);
+		// verify event for the expected property
+		assertEquals("Wrong Event.", this.entitiesEvent.getListName(), Customization.ENTITIES_LIST);
+	}
+
+	// ********** sessionCustomizers list **********
+	public void testSessionCustomizersList() throws Exception {
+		// add
+		this.clearEvent();
+		String className = this.customization.addSessionCustomizer(SESSION_CUSTOMIZER_TEST_VALUE_2);
+		
+		// verify event received
+		assertNotNull("No Event Fired.", this.sessionCustomizersEvent);
+		// verify event for the expected property
+		assertEquals("Wrong Event.", this.sessionCustomizersEvent.getListName(), Customization.SESSION_CUSTOMIZER_LIST);
+		
+		// remove
+		this.clearEvent();
+		
+		this.customization.removeSessionCustomizer(className);
+		// verify event received
+		assertNotNull("No Event Fired.", this.sessionCustomizersEvent);
+		// verify event for the expected property
+		assertEquals("Wrong Event.", this.sessionCustomizersEvent.getListName(), Customization.SESSION_CUSTOMIZER_LIST);
+	}
+
+	// ********** ThrowExceptions tests **********
+	public void testSetThrowExceptions() throws Exception {
+		this.verifyModelInitialized(
+			THROW_EXCEPTIONS_KEY,
+			THROW_EXCEPTIONS_TEST_VALUE);
+		this.verifySetProperty(
+			THROW_EXCEPTIONS_KEY,
+			THROW_EXCEPTIONS_TEST_VALUE,
+			THROW_EXCEPTIONS_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveThrowExceptions() throws Exception {
+		this.verifyAddRemoveProperty(
+			THROW_EXCEPTIONS_KEY,
+			THROW_EXCEPTIONS_TEST_VALUE,
+			THROW_EXCEPTIONS_TEST_VALUE_2);
+	}
+
+	// ********** WeavingLazy tests **********
+	public void testSetWeavingLazy() throws Exception {
+		this.verifyModelInitialized(
+			WEAVING_LAZY_KEY,
+			WEAVING_LAZY_TEST_VALUE);
+		this.verifySetProperty(
+			WEAVING_LAZY_KEY,
+			WEAVING_LAZY_TEST_VALUE,
+			WEAVING_LAZY_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveWeavingLazy() throws Exception {
+		this.verifyAddRemoveProperty(
+			WEAVING_LAZY_KEY,
+			WEAVING_LAZY_TEST_VALUE,
+			WEAVING_LAZY_TEST_VALUE_2);
+	}
+
+	// ********** WeavingChangeTracking tests **********
+	public void testSetWeavingChangeTracking() throws Exception {
+		this.verifyModelInitialized(
+			WEAVING_CHANGE_TRACKING_KEY,
+			WEAVING_CHANGE_TRACKING_TEST_VALUE);
+		this.verifySetProperty(
+			WEAVING_CHANGE_TRACKING_KEY,
+			WEAVING_CHANGE_TRACKING_TEST_VALUE,
+			WEAVING_CHANGE_TRACKING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveWeavingChangeTracking() throws Exception {
+		this.verifyAddRemoveProperty(
+			WEAVING_CHANGE_TRACKING_KEY,
+			WEAVING_CHANGE_TRACKING_TEST_VALUE,
+			WEAVING_CHANGE_TRACKING_TEST_VALUE_2);
+	}
+
+	// ********** WeavingFetchGroups tests **********
+	public void testSetWeavingFetchGroups() throws Exception {
+		this.verifyModelInitialized(
+			WEAVING_FETCH_GROUPS_KEY,
+			WEAVING_FETCH_GROUPS_TEST_VALUE);
+		this.verifySetProperty(
+			WEAVING_FETCH_GROUPS_KEY,
+			WEAVING_FETCH_GROUPS_TEST_VALUE,
+			WEAVING_FETCH_GROUPS_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveWeavingFetchGroups() throws Exception {
+		this.verifyAddRemoveProperty(
+			WEAVING_FETCH_GROUPS_KEY,
+			WEAVING_FETCH_GROUPS_TEST_VALUE,
+			WEAVING_FETCH_GROUPS_TEST_VALUE_2);
+	}
+
+	// ********** WeavingInternal tests **********
+	public void testSetWeavingInternal() throws Exception {
+		this.verifyModelInitialized(
+			WEAVING_INTERNAL_KEY,
+			WEAVING_INTERNAL_TEST_VALUE);
+		this.verifySetProperty(
+			WEAVING_INTERNAL_KEY,
+			WEAVING_INTERNAL_TEST_VALUE,
+			WEAVING_INTERNAL_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveWeavingInternal() throws Exception {
+		this.verifyAddRemoveProperty(
+			WEAVING_INTERNAL_KEY,
+			WEAVING_INTERNAL_TEST_VALUE,
+			WEAVING_INTERNAL_TEST_VALUE_2);
+	}
+
+	// ********** WeavingEager tests **********
+	public void testSetWeavingEager() throws Exception {
+		this.verifyModelInitialized(
+			WEAVING_EAGER_KEY,
+			WEAVING_EAGER_TEST_VALUE);
+		this.verifySetProperty(
+			WEAVING_EAGER_KEY,
+			WEAVING_EAGER_TEST_VALUE,
+			WEAVING_EAGER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveWeavingEager() throws Exception {
+		this.verifyAddRemoveProperty(
+			WEAVING_EAGER_KEY,
+			WEAVING_EAGER_TEST_VALUE,
+			WEAVING_EAGER_TEST_VALUE_2);
+	}
+
+	// ********** SessionCustomizer tests **********
+	public void testSetSessionCustomizer() throws Exception {
+		this.verifyModelInitialized(
+			SESSION_CUSTOMIZER_KEY,
+			SESSION_CUSTOMIZER_TEST_VALUE);
+		this.verifySetSessionCustomizationProperty(
+			Customization.SESSION_CUSTOMIZER_PROPERTY,
+			SESSION_CUSTOMIZER_KEY,
+			SESSION_CUSTOMIZER_TEST_VALUE,
+			SESSION_CUSTOMIZER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveSessionCustomizer() throws Exception {
+		this.verifyAddRemoveSessionCustomizationProperty(
+			Customization.SESSION_CUSTOMIZER_PROPERTY,
+			SESSION_CUSTOMIZER_KEY,
+			SESSION_CUSTOMIZER_TEST_VALUE,
+			SESSION_CUSTOMIZER_TEST_VALUE_2);
+	}
+
+	// ********** Weaving tests **********
+	/**
+	 * Tests the update of Weaving property by the Customization adapter when
+	 * the PU or the model changes.
+	 */
+	public void testSetWeaving() throws Exception {
+		this.verifyModelInitialized(
+			WEAVING_KEY,
+			WEAVING_TEST_VALUE);
+		this.verifySetProperty(
+			WEAVING_KEY,
+			WEAVING_TEST_VALUE,
+			WEAVING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveWeaving() throws Exception {
+		this.verifyAddRemoveProperty(
+			WEAVING_KEY,
+			WEAVING_TEST_VALUE,
+			WEAVING_TEST_VALUE_2);
+	}
+
+	// ********** ValidationOnly tests **********
+	public void testSetValidationOnly() throws Exception {
+		this.verifyModelInitialized(
+			VALIDATION_ONLY_KEY,
+			VALIDATION_ONLY_TEST_VALUE);
+		this.verifySetProperty(
+			VALIDATION_ONLY_KEY,
+			VALIDATION_ONLY_TEST_VALUE,
+			VALIDATION_ONLY_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveValidationOnly() throws Exception {
+		this.verifyAddRemoveProperty(
+			VALIDATION_ONLY_KEY,
+			VALIDATION_ONLY_TEST_VALUE,
+			VALIDATION_ONLY_TEST_VALUE_2);
+	}
+
+	// ********** ValidateSchema tests **********
+	public void testSetValidateSchema() throws Exception {
+		this.verifyModelInitialized(
+			VALIDATE_SCHEMA_KEY,
+			VALIDATE_SCHEMA_TEST_VALUE);
+		this.verifySetProperty(
+			VALIDATE_SCHEMA_KEY,
+			VALIDATE_SCHEMA_TEST_VALUE,
+			VALIDATE_SCHEMA_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveValidateSchema() throws Exception {
+		this.verifyAddRemoveProperty(
+			VALIDATE_SCHEMA_KEY,
+			VALIDATE_SCHEMA_TEST_VALUE,
+			VALIDATE_SCHEMA_TEST_VALUE_2);
+	}
+
+	// ********** ExceptionHandler tests **********
+	public void testSetExceptionHandler() throws Exception {
+		this.verifyModelInitialized(
+			EXCEPTION_HANDLER_KEY,
+			EXCEPTION_HANDLER_TEST_VALUE);
+		this.verifySetProperty(
+			EXCEPTION_HANDLER_KEY,
+			EXCEPTION_HANDLER_TEST_VALUE,
+			EXCEPTION_HANDLER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveExceptionHandler() throws Exception {
+		this.verifyAddRemoveProperty(
+			EXCEPTION_HANDLER_KEY,
+			EXCEPTION_HANDLER_TEST_VALUE,
+			EXCEPTION_HANDLER_TEST_VALUE_2);
+	}
+
+	// ********** Customization class **********
+	/**
+	 * Tests the update of Customization property by the Customization adapter when the
+	 * PU or the model changes.
+	 */
+	public void testSetCustomization() throws Exception {
+		this.verifyModelInitialized(
+			CUSTOMIZER_KEY,
+			CUSTOMIZER_TEST_VALUE);
+		this.verifySetCustomizationProperty(
+			Entity.DESCRIPTOR_CUSTOMIZER_PROPERTY,
+			CUSTOMIZER_KEY,
+			CUSTOMIZER_TEST_VALUE,
+			CUSTOMIZER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveCustomization() throws Exception {
+		this.verifyAddRemoveCustomizationProperty(
+			Entity.DESCRIPTOR_CUSTOMIZER_PROPERTY,
+			CUSTOMIZER_KEY,
+			CUSTOMIZER_TEST_VALUE,
+			CUSTOMIZER_TEST_VALUE_2);
+	}
+	
+	// ********** Profiler tests **********
+	public void testSetProfiler() throws Exception {
+		this.verifyModelInitialized(
+			PROFILER_KEY,
+			this.getPropertyStringValueOf(PROFILER_TEST_VALUE)); // model is storing EclipseLinkStringValue
+		// verify set enum value
+		this.verifySetProperty(
+			PROFILER_KEY,
+			PROFILER_TEST_VALUE,
+			PROFILER_TEST_VALUE_2);
+		// verify set custom and literal value
+		this.verifySetProfiler(
+			PROFILER_KEY,
+			PROFILER_TEST_VALUE,
+			PROFILER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveProfiler() throws Exception {
+		this.verifyAddRemoveProperty(
+			PROFILER_KEY,
+			PROFILER_TEST_VALUE,
+			PROFILER_TEST_VALUE_2);
+	}
+	
+	/**
+	 * Verifies setting custom profiler and literals.
+	 */
+	protected void verifySetProfiler(String elKey, Object testValue1, Object testValue2) throws Exception {
+		PersistenceUnit.Property property = this.getPersistenceUnit().getProperty(elKey);
+		String propertyName = this.getModel().propertyIdOf(property);
+		// test set custom profiler.
+		this.clearEvent();
+		this.setProperty(propertyName, testValue2);
+		this.verifyPutProperty(propertyName, testValue2);
+
+		// test set (Profiler) null
+		this.clearEvent();
+		this.customization.setProfiler((Profiler) null);
+		assertNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, null);
+		
+		// test set enum literal
+		this.clearEvent();
+		this.setProperty(propertyName, testValue1.toString());
+		assertNotNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, this.getPropertyStringValueOf(testValue1));
+
+		// test set (String) null
+		this.clearEvent();
+		this.customization.setProfiler((String) null);
+		assertNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, null);
+	}
+
+
+
+	// ****** convenience methods *******
+
+	// ********** verify SessionCustomizer property **********
+	protected void verifySetSessionCustomizationProperty(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		// Replace
+		this.persistenceUnitSetProperty(key, testValue2, true); 
+		this.propertiesTotal++;
+		this.verifyPutSessionCustomizerProperty(propertyName, testValue1);
+	}
+	
+	@SuppressWarnings("unused") 
+	protected void verifyAddRemoveSessionCustomizationProperty(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		// Remove
+		this.clearEvent();
+		--this.propertiesTotal;
+		--this.modelPropertiesSize;
+		this.getPersistenceUnit().removeProperty(key, (String) testValue1);
+		assertFalse(this.customization.sessionCustomizerExists(key));
+		assertEquals(this.modelPropertiesSize, this.modelPropertiesSizeOriginal - 1);
+		
+		// Add original Property
+		++this.propertiesTotal;
+		++this.modelPropertiesSize;
+		this.persistenceUnitSetProperty(key, testValue1, true); 
+		this.verifyPutSessionCustomizerProperty(propertyName, testValue1);
+	}
+
+	protected void verifyPutSessionCustomizerProperty(String propertyName, Object expectedValue) throws Exception {
+		// verify event received
+		assertNotNull("No Event Fired.", this.sessionCustomizersEvent);
+		this.verifySessionCustomizerEvent(propertyName, expectedValue);
+	}
+
+	@SuppressWarnings("unused")
+	protected void verifySessionCustomizerEvent(String propertyName, Object expectedValue) throws Exception {
+		// verify event value
+		EclipseLinkCustomization customization = (EclipseLinkCustomization) this.sessionCustomizersEvent.getSource();
+		assertTrue(customization.sessionCustomizerExists((String) expectedValue));
+		 return;
+	}
+	
+	// ********** verify entity property **********
+	protected void verifySetCustomizationProperty(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		// Replace
+		this.persistenceUnitSetProperty(key, testValue2);
+		this.verifyPutCustomizationProperty(propertyName, ENTITY_TEST, testValue2);
+		
+		// Replace by setting model object
+		this.clearEvent();
+		this.setCustomizationProperty(propertyName, ENTITY_TEST, testValue1);
+		this.verifyPutCustomizationProperty(propertyName, ENTITY_TEST, testValue1);
+	}
+
+	protected void verifyAddRemoveCustomizationProperty(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		// Remove
+		this.clearEvent();
+		--this.propertiesTotal;
+		--this.modelPropertiesSize;
+		this.getPersistenceUnit().removeProperty(key);
+		assertNull(this.getPersistenceUnit().getProperty(key));
+		assertEquals(this.modelPropertiesSize, this.modelPropertiesSizeOriginal - 1);
+		this.verifyPutCustomizationProperty(propertyName, ENTITY_TEST, null);
+		
+		// Add original Property
+		++this.propertiesTotal;
+		++this.modelPropertiesSize;
+		this.persistenceUnitSetProperty(key, testValue1);
+		this.verifyPutCustomizationProperty(propertyName, ENTITY_TEST, testValue1);
+		
+		// Replace
+		this.persistenceUnitSetProperty(key, testValue2);
+		this.verifyPutCustomizationProperty(propertyName, ENTITY_TEST, testValue2);
+	}
+
+	protected void verifyPutCustomizationProperty(String propertyName, String entityName, Object expectedValue) throws Exception {
+		this.verifyEvent(propertyName);
+		this.verifyCustomizationEvent(propertyName, entityName, expectedValue);
+	}
+
+	protected void verifyCustomizationEvent(String propertyName, String entityName, Object expectedValue) throws Exception {
+		// verify event value
+		Entity entity = (Entity) this.propertyChangedEvent.getNewValue();
+		if (propertyName.equals(Entity.DESCRIPTOR_CUSTOMIZER_PROPERTY)) {
+			assertEquals(expectedValue, entity.getParent().getDescriptorCustomizerOf(entityName));
+			assertEquals(expectedValue, this.customization.getDescriptorCustomizerOf(entityName));
+		}
+		else {
+			this.throwMissingDefinition("verifyCustomizationEvent", propertyName);
+		}
+	}
+
+	protected void setCustomizationProperty(String propertyName, String entityName, Object newValue) throws NoSuchFieldException {
+		if (propertyName.equals(Entity.DESCRIPTOR_CUSTOMIZER_PROPERTY))
+			this.customization.setDescriptorCustomizerOf(entityName, (String) newValue);
+		else
+			this.throwMissingDefinition("setCustomizationProperty", propertyName);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/customization/JptEclipseLinkPersistenceCustomizationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/customization/JptEclipseLinkPersistenceCustomizationTests.java
new file mode 100644
index 0000000..48445e2
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/customization/JptEclipseLinkPersistenceCustomizationTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.customization;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * decentralize test creation code
+ */
+public class JptEclipseLinkPersistenceCustomizationTests
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkPersistenceCustomizationTests.class.getPackage().getName());
+		
+		suite.addTestSuite(CustomizationValueModelTests.class);
+		suite.addTestSuite(EclipseLinkCustomizationTests.class);
+		
+		return suite;
+	}
+
+	private JptEclipseLinkPersistenceCustomizationTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/general/GeneralPropertiesAdapterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/general/GeneralPropertiesAdapterTests.java
new file mode 100644
index 0000000..7d8f4f5
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/general/GeneralPropertiesAdapterTests.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+* Copyright (c) 2008, 2009 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.general;
+
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.general.GeneralProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ *  GeneralAdapterTests
+ */
+@SuppressWarnings("nls")
+public class GeneralPropertiesAdapterTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private GeneralProperties generalProperties;
+
+	public static final String EXCLUDE_ECLIPSELINK_ORM_KEY = GeneralProperties.ECLIPSELINK_EXCLUDE_ECLIPSELINK_ORM;
+	public static final Boolean EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE = false;
+	public static final Boolean EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE_2 = ! EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE;
+
+	
+	public GeneralPropertiesAdapterTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.generalProperties = this.subject.getGeneralProperties();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+		
+		this.generalProperties.addPropertyChangeListener(GeneralProperties.EXCLUDE_ECLIPSELINK_ORM_PROPERTY, propertyChangeListener);
+
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing.
+	 */
+	@Override
+	protected void populatePu() {
+		this.modelPropertiesSizeOriginal = 1;
+		this.propertiesTotal = this.modelPropertiesSizeOriginal + 2; // misc properties
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		this.persistenceUnitSetProperty("misc.property.1", "value.1");
+		this.persistenceUnitSetProperty(EXCLUDE_ECLIPSELINK_ORM_KEY, EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty("misc.property.2", "value.2");
+
+		return;
+	}
+
+	
+	// ********** ExcludeEclipselinkOrm tests **********
+	public void testSetExcludeEclipselinkOrm() throws Exception {
+		this.verifyModelInitialized(
+			EXCLUDE_ECLIPSELINK_ORM_KEY,
+			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE);
+		this.verifySetProperty(
+			EXCLUDE_ECLIPSELINK_ORM_KEY,
+			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE,
+			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveExcludeEclipselinkOrm() throws Exception {
+		this.verifyAddRemoveProperty(
+			EXCLUDE_ECLIPSELINK_ORM_KEY,
+			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE,
+			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE_2);
+	}
+
+
+
+	// ********** get/set property **********
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		Object modelValue = null;
+		if (propertyName.equals(GeneralProperties.EXCLUDE_ECLIPSELINK_ORM_PROPERTY))
+			modelValue = this.generalProperties.getExcludeEclipselinkOrm();
+		else
+			this.throwMissingDefinition("getProperty", propertyName);
+		return modelValue;
+	}
+
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		if (propertyName.equals(GeneralProperties.EXCLUDE_ECLIPSELINK_ORM_PROPERTY))
+			this.generalProperties.setExcludeEclipselinkOrm((Boolean) newValue);
+		else
+			this.throwMissingDefinition("setProperty", propertyName);
+	}
+	
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.generalProperties;
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/general/GeneralPropertiesValueModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/general/GeneralPropertiesValueModelTests.java
new file mode 100644
index 0000000..4551315
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/general/GeneralPropertiesValueModelTests.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.general;
+
+import org.eclipse.jpt.common.utility.internal.model.AbstractModel;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.general.GeneralProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * GeneralPropertyValueModelTests
+ */
+@SuppressWarnings("nls")
+public class GeneralPropertiesValueModelTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private GeneralProperties generalProperty;
+
+	private WritablePropertyValueModel<Boolean> excludeEclipselinkOrmHolder;
+	private PropertyChangeListener excludeEclipselinkOrmListener;
+	private PropertyChangeEvent excludeEclipselinkOrmEvent;
+
+	public static final Boolean EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE = Boolean.FALSE;
+
+	public GeneralPropertiesValueModelTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.generalProperty = this.subject.getGeneralProperties(); // Subject
+		PropertyValueModel<GeneralProperties> generalPropertyHolder = new SimplePropertyValueModel<GeneralProperties>(this.generalProperty);
+		
+		this.excludeEclipselinkOrmHolder = this.buildExcludeEclipselinkOrmAA(generalPropertyHolder);
+		this.excludeEclipselinkOrmListener = this.buildExcludeEclipselinkOrmChangeListener();
+		this.excludeEclipselinkOrmHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.excludeEclipselinkOrmListener);
+		this.excludeEclipselinkOrmEvent = null;
+	}
+
+	public void testHasListeners() {
+		AbstractModel subjectGeneralProperty = (AbstractModel) this.generalProperty; // Subject
+		
+		PropertyAspectAdapter<GeneralProperties, Boolean> excludeEclipselinkOrmAA = 
+			(PropertyAspectAdapter<GeneralProperties, Boolean>) this.excludeEclipselinkOrmHolder;
+		assertTrue(excludeEclipselinkOrmAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		assertTrue(subjectGeneralProperty.hasAnyPropertyChangeListeners(GeneralProperties.EXCLUDE_ECLIPSELINK_ORM_PROPERTY));
+		
+		excludeEclipselinkOrmAA.removePropertyChangeListener(PropertyValueModel.VALUE, this.excludeEclipselinkOrmListener);
+		assertFalse(subjectGeneralProperty.hasAnyPropertyChangeListeners(GeneralProperties.EXCLUDE_ECLIPSELINK_ORM_PROPERTY));
+		assertFalse(excludeEclipselinkOrmAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing. 
+	 */
+	@Override
+	protected void populatePu() {
+		this.persistenceUnitSetProperty(
+			GeneralProperties.ECLIPSELINK_EXCLUDE_ECLIPSELINK_ORM, 
+			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE);
+		return;
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.generalProperty;
+	}
+
+	// ****** ExcludeEclipselinkOrm *******
+	private WritablePropertyValueModel<Boolean> buildExcludeEclipselinkOrmAA(PropertyValueModel<GeneralProperties> subjectHolder) {
+		return new PropertyAspectAdapter<GeneralProperties, Boolean>(subjectHolder, GeneralProperties.EXCLUDE_ECLIPSELINK_ORM_PROPERTY) {
+			@Override
+			protected Boolean buildValue_() {
+				return this.subject.getExcludeEclipselinkOrm();
+			}
+
+			@Override
+			protected void setValue_(Boolean enumValue) {
+				this.subject.setExcludeEclipselinkOrm(enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildExcludeEclipselinkOrmChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				GeneralPropertiesValueModelTests.this.excludeEclipselinkOrmEvent = e;
+			}
+		};
+	}
+
+	// ****** Tests ******* 
+	public void testValue() {
+		// ****** ExcludeEclipselinkOrm ******* 
+		this.verifyExcludeEclipselinkOrmAAValue(EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE);
+		assertEquals(GeneralProperties.DEFAULT_EXCLUDE_ECLIPSELINK_ORM, this.generalProperty.getDefaultExcludeEclipselinkOrm());
+	}
+
+	public void testSetValue() throws Exception {
+		// ****** ExcludeEclipselinkOrm ******* 
+		this.excludeEclipselinkOrmEvent = null;
+		this.verifyHasListeners(this.excludeEclipselinkOrmHolder, PropertyValueModel.VALUE);
+		Boolean newExcludeEclipselinkOrm = !EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE;
+		// Modify the property holder
+		this.excludeEclipselinkOrmHolder.setValue(newExcludeEclipselinkOrm);
+		this.verifyExcludeEclipselinkOrmAAValue(newExcludeEclipselinkOrm);
+		assertNotNull(this.excludeEclipselinkOrmEvent);
+	}
+
+	public void testSetNullValue() {
+		String notDeleted = "Property not deleted";
+		// ****** ExcludeEclipselinkOrm *******
+		this.excludeEclipselinkOrmEvent = null;
+		// Setting the property holder
+		this.excludeEclipselinkOrmHolder.setValue(null);
+		// testing Holder
+		this.verifyExcludeEclipselinkOrmAAValue(null);
+		assertNotNull(this.excludeEclipselinkOrmEvent);
+		// testing PU properties
+		this.verifyPuHasNotProperty(GeneralProperties.ECLIPSELINK_EXCLUDE_ECLIPSELINK_ORM, notDeleted);
+	}
+
+	// ****** convenience methods *******
+
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifyExcludeEclipselinkOrmAAValue(Boolean testValue) {
+		this.verifyAAValue(
+			testValue, 
+			this.generalProperty.getExcludeEclipselinkOrm(), 
+			this.excludeEclipselinkOrmHolder, 
+			GeneralProperties.ECLIPSELINK_EXCLUDE_ECLIPSELINK_ORM);
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/general/JptEclipseLinkPersistenceGeneralTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/general/JptEclipseLinkPersistenceGeneralTests.java
new file mode 100644
index 0000000..1c0be55
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/general/JptEclipseLinkPersistenceGeneralTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.general;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * decentralize test creation code
+ */
+public class JptEclipseLinkPersistenceGeneralTests
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkPersistenceGeneralTests.class.getPackage().getName());
+		
+		suite.addTestSuite(GeneralPropertiesValueModelTests.class);
+		suite.addTestSuite(GeneralPropertiesAdapterTests.class);
+		
+		return suite;
+	}
+
+	private JptEclipseLinkPersistenceGeneralTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/logging/JptEclipseLinkPersistenceLoggingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/logging/JptEclipseLinkPersistenceLoggingTests.java
new file mode 100644
index 0000000..30d2754
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/logging/JptEclipseLinkPersistenceLoggingTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.logging;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * decentralize test creation code
+ */
+public class JptEclipseLinkPersistenceLoggingTests
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkPersistenceLoggingTests.class.getPackage().getName());
+		
+		suite.addTestSuite(LoggingValueModelTests.class);
+		suite.addTestSuite(LoggingAdapterTests.class);
+		
+		return suite;
+	}
+
+	private JptEclipseLinkPersistenceLoggingTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/logging/LoggingAdapterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/logging/LoggingAdapterTests.java
new file mode 100644
index 0000000..b187332
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/logging/LoggingAdapterTests.java
@@ -0,0 +1,339 @@
+/*******************************************************************************
+* Copyright (c) 2008, 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.logging;
+
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.logging.Logger;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.logging.Logging;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.logging.LoggingLevel;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * Tests the update of model objects by the Logging adapter when the
+ * PersistenceUnit changes.
+ */
+public class LoggingAdapterTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private Logging logging;
+
+	public static final String LEVEL_KEY = Logging.ECLIPSELINK_LEVEL;
+	public static final LoggingLevel LEVEL_TEST_VALUE = LoggingLevel.fine;
+	public static final LoggingLevel LEVEL_TEST_VALUE_2 = LoggingLevel.finest;
+
+	public static final String TIMESTAMP_KEY = Logging.ECLIPSELINK_TIMESTAMP;
+	public static final Boolean TIMESTAMP_TEST_VALUE = false;
+	public static final Boolean TIMESTAMP_TEST_VALUE_2 = ! TIMESTAMP_TEST_VALUE;
+
+	public static final String THREAD_KEY = Logging.ECLIPSELINK_THREAD;
+	public static final Boolean THREAD_TEST_VALUE = false;
+	public static final Boolean THREAD_TEST_VALUE_2 = ! THREAD_TEST_VALUE;
+
+	public static final String SESSION_KEY = Logging.ECLIPSELINK_SESSION;
+	public static final Boolean SESSION_TEST_VALUE = false;
+	public static final Boolean SESSION_TEST_VALUE_2 = ! SESSION_TEST_VALUE;
+
+	public static final String EXCEPTIONS_KEY = Logging.ECLIPSELINK_EXCEPTIONS;
+	public static final Boolean EXCEPTIONS_TEST_VALUE = false;
+	public static final Boolean EXCEPTIONS_TEST_VALUE_2 = ! EXCEPTIONS_TEST_VALUE;
+
+	private static final String LOG_FILE_LOCATION_KEY = Logging.ECLIPSELINK_LOG_FILE_LOCATION;
+	private static final String LOG_FILE_LOCATION_TEST_VALUE = "C:/temp";
+	private static final String LOG_FILE_LOCATION_TEST_VALUE_2 = "C:/tmp";
+
+	private static final String LOGGER_KEY = Logging.ECLIPSELINK_LOGGER;
+	private static final Logger LOGGER_TEST_VALUE = Logger.java_logger;
+	private static final String LOGGER_TEST_VALUE_2 = "custom.logger.test";
+	
+	public LoggingAdapterTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.logging = this.subject.getLogging();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+		
+		this.logging.addPropertyChangeListener(Logging.LEVEL_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging.TIMESTAMP_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging.THREAD_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging.SESSION_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging.EXCEPTIONS_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging.LOG_FILE_LOCATION_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging.LOGGER_PROPERTY, propertyChangeListener);
+
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing.
+	 */
+	@Override
+	protected void populatePu() {
+		this.modelPropertiesSizeOriginal = 7;
+		this.propertiesTotal = this.modelPropertiesSizeOriginal + 4; // 4 misc properties
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		this.persistenceUnitSetProperty("misc.property.1", "value.1");
+		this.persistenceUnitSetProperty(TIMESTAMP_KEY, TIMESTAMP_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty("misc.property.2", "value.2");
+		this.persistenceUnitSetProperty(LEVEL_KEY, LEVEL_TEST_VALUE);
+		this.persistenceUnitSetProperty("misc.property.3", "value.3");
+		this.persistenceUnitSetProperty(THREAD_KEY, THREAD_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(SESSION_KEY, SESSION_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(EXCEPTIONS_KEY, EXCEPTIONS_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty("misc.property.4", "value.4");
+		this.persistenceUnitSetProperty(LOG_FILE_LOCATION_KEY, LOG_FILE_LOCATION_TEST_VALUE);
+		this.persistenceUnitSetProperty(LOGGER_KEY, LOGGER_TEST_VALUE);
+		return;
+	}
+	
+	// ********** Level tests **********
+	public void testSetLevel() throws Exception {
+		this.verifyModelInitialized(
+			LEVEL_KEY,
+			LEVEL_TEST_VALUE);
+		this.verifySetProperty(
+			LEVEL_KEY,
+			LEVEL_TEST_VALUE,
+			LEVEL_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			LEVEL_KEY,
+			LEVEL_TEST_VALUE,
+			LEVEL_TEST_VALUE_2);
+	}
+
+	// ********** Timestamp tests **********
+	public void testSetTimestamp() throws Exception {
+		this.verifyModelInitialized(
+			TIMESTAMP_KEY,
+			TIMESTAMP_TEST_VALUE);
+		this.verifySetProperty(
+			TIMESTAMP_KEY,
+			TIMESTAMP_TEST_VALUE,
+			TIMESTAMP_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveTimestamp() throws Exception {
+		this.verifyAddRemoveProperty(
+			TIMESTAMP_KEY,
+			TIMESTAMP_TEST_VALUE,
+			TIMESTAMP_TEST_VALUE_2);
+	}
+
+	// ********** Thread tests **********
+	public void testSetThread() throws Exception {
+		this.verifyModelInitialized(
+			THREAD_KEY,
+			THREAD_TEST_VALUE);
+		this.verifySetProperty(
+			THREAD_KEY,
+			THREAD_TEST_VALUE,
+			THREAD_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveThread() throws Exception {
+		this.verifyAddRemoveProperty(
+			THREAD_KEY,
+			THREAD_TEST_VALUE,
+			THREAD_TEST_VALUE_2);
+	}
+
+	// ********** Session tests **********
+	public void testSetSession() throws Exception {
+		this.verifyModelInitialized(
+			SESSION_KEY,
+			SESSION_TEST_VALUE);
+		this.verifySetProperty(
+			SESSION_KEY,
+			SESSION_TEST_VALUE,
+			SESSION_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveSession() throws Exception {
+		this.verifyAddRemoveProperty(
+			SESSION_KEY,
+			SESSION_TEST_VALUE,
+			SESSION_TEST_VALUE_2);
+	}
+
+	// ********** Exceptions tests **********
+	public void testSetExceptions() throws Exception {
+		this.verifyModelInitialized(
+			EXCEPTIONS_KEY,
+			EXCEPTIONS_TEST_VALUE);
+		this.verifySetProperty(
+			EXCEPTIONS_KEY,
+			EXCEPTIONS_TEST_VALUE,
+			EXCEPTIONS_TEST_VALUE_2);
+	}
+	
+	public void testAddRemoveExceptions() throws Exception {
+		this.verifyAddRemoveProperty(
+			EXCEPTIONS_KEY,
+			EXCEPTIONS_TEST_VALUE,
+			EXCEPTIONS_TEST_VALUE_2);
+	}
+
+	// ********** LogFileLocation **********
+	public void testSetLogFileLocation() throws Exception {
+		this.verifyModelInitialized(
+			LOG_FILE_LOCATION_KEY,
+			LOG_FILE_LOCATION_TEST_VALUE);
+		this.verifySetProperty(
+			LOG_FILE_LOCATION_KEY,
+			LOG_FILE_LOCATION_TEST_VALUE,
+			LOG_FILE_LOCATION_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveLogFileLocation() throws Exception {
+		this.verifyAddRemoveProperty(
+			LOG_FILE_LOCATION_KEY,
+			LOG_FILE_LOCATION_TEST_VALUE,
+			LOG_FILE_LOCATION_TEST_VALUE_2);
+	}
+
+	public void testSetEmptyFileLocation() throws Exception {
+		String puKey = LOG_FILE_LOCATION_KEY;
+		PersistenceUnit.Property property = this.getPersistenceUnit().getProperty(puKey);
+		String propertyName = this.getModel().propertyIdOf(property);
+
+		// Set FileLocation to "" & verify that the property is deleted
+		this.verifyPuHasProperty(puKey,  "persistenceUnit.properties doesn't contains: ");
+		this.setProperty(propertyName, "");
+
+		this.verifyPuHasNotProperty(puKey,  "Property was not deleted");
+		this.verifyPutProperty(propertyName, null);
+		assertNull(this.getPersistenceUnit().getProperty(puKey));
+	}
+	
+	// ********** Logger tests **********
+	public void testSetLogger() throws Exception {
+		this.verifyModelInitialized(
+			LOGGER_KEY,
+			this.getPropertyStringValueOf(LOGGER_TEST_VALUE)); // model is storing EclipseLinkStringValue
+		// verify set enum value
+		this.verifySetProperty(
+			LOGGER_KEY,
+			LOGGER_TEST_VALUE,
+			LOGGER_TEST_VALUE_2);
+		// verify set custom and literal value
+		this.verifySetLogger(
+			LOGGER_KEY,
+			LOGGER_TEST_VALUE,
+			LOGGER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveLogger() throws Exception {
+		this.verifyAddRemoveProperty(
+			LOGGER_KEY,
+			LOGGER_TEST_VALUE,
+			LOGGER_TEST_VALUE_2);
+	}
+	
+	/**
+	 * Verifies setting custom logger and literals.
+	 */
+	protected void verifySetLogger(String elKey, Object testValue1, Object testValue2) throws Exception {
+		PersistenceUnit.Property property = this.getPersistenceUnit().getProperty(elKey);
+		String propertyName = this.getModel().propertyIdOf(property);
+		// test set custom logger.
+		this.clearEvent();
+		this.setProperty(propertyName, testValue2);
+		this.verifyPutProperty(propertyName, testValue2);
+
+		// test set (Logger) null
+		this.clearEvent();
+		this.logging.setLogger((Logger) null);
+		assertNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, null);
+		
+		// test set enum literal
+		this.clearEvent();
+		this.setProperty(propertyName, testValue1.toString());
+		assertNotNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, this.getPropertyStringValueOf(testValue1));
+
+		// test set (String) null
+		this.clearEvent();
+		this.logging.setLogger((String) null);
+		assertNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, null);
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		if (propertyName.equals(Logging.LEVEL_PROPERTY))
+			this.logging.setLevel((LoggingLevel) newValue);
+		else if (propertyName.equals(Logging.TIMESTAMP_PROPERTY))
+			this.logging.setTimestamp((Boolean) newValue);
+		else if (propertyName.equals(Logging.THREAD_PROPERTY))
+			this.logging.setThread((Boolean) newValue);
+		else if (propertyName.equals(Logging.SESSION_PROPERTY))
+			this.logging.setSession((Boolean) newValue);
+		else if (propertyName.equals(Logging.EXCEPTIONS_PROPERTY))
+			this.logging.setExceptions((Boolean) newValue);
+		else if (propertyName.equals(Logging.LOG_FILE_LOCATION_PROPERTY))
+			this.logging.setLogFileLocation((String) newValue);
+		else if (propertyName.equals(Logging.LOGGER_PROPERTY)) {
+			if (newValue.getClass().isEnum())
+				this.logging.setLogger((Logger) newValue);
+			else
+				this.logging.setLogger((String) newValue);
+		}
+		else
+			this.throwMissingDefinition("setProperty", propertyName);
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		Object modelValue = null;
+		if (propertyName.equals(Logging.LEVEL_PROPERTY))
+			modelValue = this.logging.getLevel();
+		else if (propertyName.equals(Logging.TIMESTAMP_PROPERTY))
+			modelValue = this.logging.getTimestamp();
+		else if (propertyName.equals(Logging.THREAD_PROPERTY))
+			modelValue = this.logging.getThread();
+		else if (propertyName.equals(Logging.SESSION_PROPERTY))
+			modelValue = this.logging.getSession();
+		else if (propertyName.equals(Logging.EXCEPTIONS_PROPERTY))
+			modelValue = this.logging.getExceptions();
+		else if (propertyName.equals(Logging.LOG_FILE_LOCATION_PROPERTY))
+			modelValue = this.logging.getLogFileLocation();
+		else if (propertyName.equals(Logging.LOGGER_PROPERTY))
+			modelValue = this.logging.getLogger();
+		else
+			this.throwMissingDefinition("getProperty", propertyName);
+		return modelValue;
+	}
+	
+	@Override
+	protected void verifyPutProperty(String propertyName, Object expectedValue) throws Exception {
+		Object expectedValue_ = expectedValue;
+		if (propertyName.equals(Logging.LOGGER_PROPERTY)) {
+			
+			expectedValue_ = (expectedValue != null && expectedValue.getClass().isEnum()) ?
+				this.getPropertyStringValueOf(LOGGER_TEST_VALUE) : // model is storing EclipseLinkStringValue
+				expectedValue;
+		}
+		super.verifyPutProperty(propertyName, expectedValue_);
+	}
+	
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.logging;
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/logging/LoggingValueModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/logging/LoggingValueModelTests.java
new file mode 100644
index 0000000..cf1076f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/logging/LoggingValueModelTests.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.logging;
+
+import org.eclipse.jpt.common.utility.internal.model.AbstractModel;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.logging.Logging;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * LoggingValueModelTests
+ */
+@SuppressWarnings("nls")
+public class LoggingValueModelTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private Logging logging;
+
+	private WritablePropertyValueModel<Boolean> timestampHolder;
+	private PropertyChangeListener timestampListener;
+	private PropertyChangeEvent timestampEvent;
+
+	public static final Boolean TIMESTAMP_TEST_VALUE = Boolean.FALSE;
+
+	public LoggingValueModelTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.logging = this.subject.getLogging(); // Subject
+		PropertyValueModel<Logging> loggingHolder = new SimplePropertyValueModel<Logging>(this.logging);
+		
+		this.timestampHolder = this.buildTimestampAA(loggingHolder);
+		this.timestampListener = this.buildTimestampChangeListener();
+		this.timestampHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.timestampListener);
+		this.timestampEvent = null;
+	}
+
+	public void testHasListeners() {
+		AbstractModel subjectLogging = (AbstractModel) this.logging; // Subject
+		
+		PropertyAspectAdapter<Logging, Boolean> timestampAA = 
+			(PropertyAspectAdapter<Logging, Boolean>) this.timestampHolder;
+		assertTrue(timestampAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		assertTrue(subjectLogging.hasAnyPropertyChangeListeners(Logging.TIMESTAMP_PROPERTY));
+		
+		timestampAA.removePropertyChangeListener(PropertyValueModel.VALUE, this.timestampListener);
+		assertFalse(subjectLogging.hasAnyPropertyChangeListeners(Logging.TIMESTAMP_PROPERTY));
+		assertFalse(timestampAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing. 
+	 */
+	@Override
+	protected void populatePu() {
+		this.persistenceUnitSetProperty(
+			Logging.ECLIPSELINK_TIMESTAMP, 
+			TIMESTAMP_TEST_VALUE);
+		return;
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.logging;
+	}
+
+	// ****** Timestamp *******
+	private WritablePropertyValueModel<Boolean> buildTimestampAA(PropertyValueModel<Logging> subjectHolder) {
+		return new PropertyAspectAdapter<Logging, Boolean>(subjectHolder, Logging.TIMESTAMP_PROPERTY) {
+			@Override
+			protected Boolean buildValue_() {
+				return this.subject.getTimestamp();
+			}
+
+			@Override
+			protected void setValue_(Boolean enumValue) {
+				this.subject.setTimestamp(enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildTimestampChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				LoggingValueModelTests.this.timestampEvent = e;
+			}
+		};
+	}
+
+	// ****** Tests ******* 
+	public void testValue() {
+		// ****** Timestamp ******* 
+		this.verifyTimestampAAValue(TIMESTAMP_TEST_VALUE);
+		assertEquals(Logging.DEFAULT_TIMESTAMP, this.logging.getDefaultTimestamp());
+	}
+
+	public void testSetValue() throws Exception {
+		// ****** Timestamp ******* 
+		this.timestampEvent = null;
+		this.verifyHasListeners(this.timestampHolder, PropertyValueModel.VALUE);
+		Boolean newTimestamp = !TIMESTAMP_TEST_VALUE;
+		// Modify the property holder
+		this.timestampHolder.setValue(newTimestamp);
+		this.verifyTimestampAAValue(newTimestamp);
+		assertNotNull(this.timestampEvent);
+	}
+
+	public void testSetNullValue() {
+		String notDeleted = "Property not deleted";
+		// ****** Timestamp *******
+		this.timestampEvent = null;
+		// Setting the property holder
+		this.timestampHolder.setValue(null);
+		// testing Holder
+		this.verifyTimestampAAValue(null);
+		assertNotNull(this.timestampEvent);
+		// testing PU properties
+		this.verifyPuHasNotProperty(Logging.ECLIPSELINK_TIMESTAMP, notDeleted);
+	}
+
+	// ****** convenience methods *******
+
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifyTimestampAAValue(Boolean testValue) {
+		this.verifyAAValue(
+			testValue, 
+			this.logging.getTimestamp(), 
+			this.timestampHolder, 
+			Logging.ECLIPSELINK_TIMESTAMP);
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/options/JptEclipseLinkPersistenceOptionsTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/options/JptEclipseLinkPersistenceOptionsTests.java
new file mode 100644
index 0000000..102a23f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/options/JptEclipseLinkPersistenceOptionsTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.options;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * decentralize test creation code
+ */
+public class JptEclipseLinkPersistenceOptionsTests
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkPersistenceOptionsTests.class.getPackage().getName());
+		
+		suite.addTestSuite(OptionsValueModelTests.class);
+		suite.addTestSuite(OptionsAdapterTests.class);
+		
+		return suite;
+	}
+
+	private JptEclipseLinkPersistenceOptionsTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/options/OptionsAdapterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/options/OptionsAdapterTests.java
new file mode 100644
index 0000000..9539639
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/options/OptionsAdapterTests.java
@@ -0,0 +1,379 @@
+/*******************************************************************************
+* Copyright (c) 2008, 2009 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.options;
+
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.options.Options;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.options.TargetDatabase;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.options.TargetServer;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * Tests the update of model objects by the Option adapter when the
+ * PersistenceUnit changes.
+ */
+public class OptionsAdapterTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private Options options;
+
+	private static final String SESSION_NAME_KEY = Options.ECLIPSELINK_SESSION_NAME;
+	private static final String SESSION_NAME_TEST_VALUE = "session-name.test";
+	private static final String SESSION_NAME_TEST_VALUE_2 = "session-name-2.test";
+
+	private static final String SESSIONS_XML_KEY = Options.ECLIPSELINK_SESSIONS_XML;
+	private static final String SESSIONS_XML_TEST_VALUE = "sessions-xml.test";
+	private static final String SESSIONS_XML_TEST_VALUE_2 = "sessions-xml-2.test";
+
+	public static final String TARGET_DATABASE_KEY = Options.ECLIPSELINK_TARGET_DATABASE;
+	public static final TargetDatabase TARGET_DATABASE_TEST_VALUE = TargetDatabase.cloudscape;
+	public static final String TARGET_DATABASE_TEST_VALUE_2 = "custom.targetDatabase.test";
+
+	private static final String TARGET_SERVER_KEY = Options.ECLIPSELINK_TARGET_SERVER;
+	private static final TargetServer TARGET_SERVER_TEST_VALUE = TargetServer.weblogic_9;
+	private static final String TARGET_SERVER_TEST_VALUE_2 = "custom.targetServer.test";
+
+	public static final String INCLUDE_DESCRIPTOR_QUERIES_KEY = Options.ECLIPSELINK_SESSION_INCLUDE_DESCRIPTOR_QUERIES;
+	public static final Boolean INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE = false;
+	public static final Boolean INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE_2 = ! INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE;
+
+	public static final String SESSION_EVENT_LISTENER_KEY = Options.ECLIPSELINK_SESSION_EVENT_LISTENER;
+	public static final String SESSION_EVENT_LISTENER_TEST_VALUE = "acme.CustomSessionEventListener";
+	public static final String SESSION_EVENT_LISTENER_TEST_VALUE_2 = "oracle.sessions.CustomSessionEventListener";
+
+	public static final String TEMPORAL_MUTABLE_KEY = Options.ECLIPSELINK_TEMPORAL_MUTABLE;
+	public static final Boolean TEMPORAL_MUTABLE_TEST_VALUE = true;
+	public static final Boolean TEMPORAL_MUTABLE_TEST_VALUE_2 = ! TEMPORAL_MUTABLE_TEST_VALUE;
+
+	public OptionsAdapterTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.options = this.subject.getOptions();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+
+		this.options.addPropertyChangeListener(Options.SESSION_NAME_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(Options.SESSIONS_XML_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(Options.TARGET_DATABASE_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(Options.TARGET_SERVER_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(Options.SESSION_EVENT_LISTENER_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(
+			Options.SESSION_INCLUDE_DESCRIPTOR_QUERIES_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(Options.TEMPORAL_MUTABLE_PROPERTY, propertyChangeListener);
+
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing.
+	 */
+	@Override
+	protected void populatePu() {
+		this.modelPropertiesSizeOriginal = 7;
+		this.propertiesTotal = this.modelPropertiesSizeOriginal + 4; // 4 misc properties
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		this.persistenceUnitSetProperty(SESSION_NAME_KEY, SESSION_NAME_TEST_VALUE);
+		this.persistenceUnitSetProperty(SESSIONS_XML_KEY, SESSIONS_XML_TEST_VALUE);
+		this.persistenceUnitSetProperty("misc.property.1", "value.1");
+		this.persistenceUnitSetProperty(INCLUDE_DESCRIPTOR_QUERIES_KEY, INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty("misc.property.2", "value.2");
+		this.persistenceUnitSetProperty("misc.property.3", "value.3");
+		this.persistenceUnitSetProperty(TARGET_DATABASE_KEY, TARGET_DATABASE_TEST_VALUE);
+		this.persistenceUnitSetProperty(TARGET_SERVER_KEY, TARGET_SERVER_TEST_VALUE);
+		this.persistenceUnitSetProperty(SESSION_EVENT_LISTENER_KEY, SESSION_EVENT_LISTENER_TEST_VALUE);
+		this.persistenceUnitSetProperty("misc.property.4", "value.4");
+		this.persistenceUnitSetProperty(TEMPORAL_MUTABLE_KEY, TEMPORAL_MUTABLE_TEST_VALUE.toString());
+		return;
+	}
+	
+	// ********** Listeners **********
+
+	// ********** SessionName tests **********
+	public void testSetSessionName() throws Exception {
+		this.verifyModelInitialized(
+			SESSION_NAME_KEY,
+			SESSION_NAME_TEST_VALUE);
+		this.verifySetProperty(
+			SESSION_NAME_KEY,
+			SESSION_NAME_TEST_VALUE,
+			SESSION_NAME_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveSessionName() throws Exception {
+		this.verifyAddRemoveProperty(
+			SESSION_NAME_KEY,
+			SESSION_NAME_TEST_VALUE,
+			SESSION_NAME_TEST_VALUE_2);
+	}
+
+	// ********** SessionsXml tests **********
+	public void testSetSessionsXml() throws Exception {
+		this.verifyModelInitialized(
+			SESSIONS_XML_KEY,
+			SESSIONS_XML_TEST_VALUE);
+		this.verifySetProperty(
+			SESSIONS_XML_KEY,
+			SESSIONS_XML_TEST_VALUE,
+			SESSIONS_XML_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveSessionsXml() throws Exception {
+		this.verifyAddRemoveProperty(
+			SESSIONS_XML_KEY,
+			SESSIONS_XML_TEST_VALUE,
+			SESSIONS_XML_TEST_VALUE_2);
+	}
+
+	// ********** IncludeDescriptorQueries tests **********
+	public void testSetIncludeDescriptorQueries() throws Exception {
+		this.verifyModelInitialized(
+			INCLUDE_DESCRIPTOR_QUERIES_KEY,
+			INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE);
+		this.verifySetProperty(
+			INCLUDE_DESCRIPTOR_QUERIES_KEY,
+			INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE,
+			INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveIncludeDescriptorQueries() throws Exception {
+		this.verifyAddRemoveProperty(
+			INCLUDE_DESCRIPTOR_QUERIES_KEY,
+			INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE,
+			INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE_2);
+	}
+
+	// ********** TargetDatabase tests **********
+	public void testSetTargetDatabase() throws Exception {
+		this.verifyModelInitialized(
+			TARGET_DATABASE_KEY,
+			this.getPropertyStringValueOf(TARGET_DATABASE_TEST_VALUE)); // model is storing EclipseLinkStringValue
+		this.verifySetProperty(
+			TARGET_DATABASE_KEY,
+			TARGET_DATABASE_TEST_VALUE,
+			TARGET_DATABASE_TEST_VALUE_2);
+		// verify set custom and literal value
+		this.verifySetTargetDatabase(
+			TARGET_DATABASE_KEY,
+			TARGET_DATABASE_TEST_VALUE,
+			TARGET_DATABASE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveTargetDatabase() throws Exception {
+		this.verifyAddRemoveProperty(
+			TARGET_DATABASE_KEY,
+			TARGET_DATABASE_TEST_VALUE,
+			TARGET_DATABASE_TEST_VALUE_2);
+	}
+	
+	/**
+	 * Verifies setting custom targetDatabase and literals.
+	 */
+	protected void verifySetTargetDatabase(String elKey, Object testValue1, Object testValue2) throws Exception {
+		PersistenceUnit.Property property = this.getPersistenceUnit().getProperty(elKey);
+		String propertyName = this.getModel().propertyIdOf(property);
+		// test set custom targetDatabase.
+		this.clearEvent();
+		this.setProperty(propertyName, testValue2);
+		this.verifyPutProperty(propertyName, testValue2);
+
+		// test set (TargetDatabase) null
+		this.clearEvent();
+		this.options.setTargetDatabase((TargetDatabase) null);
+		assertNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, null);
+		
+		// test set enum literal
+		this.clearEvent();
+		this.setProperty(propertyName, testValue1.toString());
+		assertNotNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, this.getPropertyStringValueOf(testValue1));
+
+		// test set (String) null
+		this.clearEvent();
+		this.options.setTargetDatabase((String) null);
+		assertNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, null);
+	}
+	
+	// ********** TargetServer tests **********
+	public void testSetTargetServer() throws Exception {
+		this.verifyModelInitialized(
+			TARGET_SERVER_KEY,
+			this.getPropertyStringValueOf(TARGET_SERVER_TEST_VALUE)); // model is storing EclipseLinkStringValue
+		// verify set enum value
+		this.verifySetProperty(
+			TARGET_SERVER_KEY,
+			TARGET_SERVER_TEST_VALUE,
+			TARGET_SERVER_TEST_VALUE_2);
+		// verify set custom and literal value
+		this.verifySetTargetServer(
+			TARGET_SERVER_KEY,
+			TARGET_SERVER_TEST_VALUE,
+			TARGET_SERVER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveTargetServer() throws Exception {
+		this.verifyAddRemoveProperty(
+			TARGET_SERVER_KEY,
+			TARGET_SERVER_TEST_VALUE,
+			TARGET_SERVER_TEST_VALUE_2);
+	}
+	
+	/**
+	 * Verifies setting custom targetServer and literals.
+	 */
+	protected void verifySetTargetServer(String elKey, Object testValue1, Object testValue2) throws Exception {
+		PersistenceUnit.Property property = this.getPersistenceUnit().getProperty(elKey);
+		String propertyName = this.getModel().propertyIdOf(property);
+		// test set custom targetServer.
+		this.clearEvent();
+		this.setProperty(propertyName, testValue2);
+		this.verifyPutProperty(propertyName, testValue2);
+
+		// test set (TargetServer) null
+		this.clearEvent();
+		this.options.setTargetServer((TargetServer) null);
+		assertNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, null);
+		
+		// test set enum literal
+		this.clearEvent();
+		this.setProperty(propertyName, testValue1.toString());
+		assertNotNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, this.getPropertyStringValueOf(testValue1));
+
+		// test set (String) null
+		this.clearEvent();
+		this.options.setTargetServer((String) null);
+		assertNull(this.getPersistenceUnit().getProperty(elKey));
+		this.verifyPutProperty(propertyName, null);
+	}
+
+	// ********** EventListener tests **********
+	public void testSetEventListener() throws Exception {
+		this.verifyModelInitialized(
+			SESSION_EVENT_LISTENER_KEY,
+			SESSION_EVENT_LISTENER_TEST_VALUE);
+		this.verifySetProperty(
+			SESSION_EVENT_LISTENER_KEY,
+			SESSION_EVENT_LISTENER_TEST_VALUE,
+			SESSION_EVENT_LISTENER_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveEventListener() throws Exception {
+		this.verifyAddRemoveProperty(
+			SESSION_EVENT_LISTENER_KEY,
+			SESSION_EVENT_LISTENER_TEST_VALUE,
+			SESSION_EVENT_LISTENER_TEST_VALUE_2);
+	}
+
+	// ********** TemporalMutable tests **********
+	public void testSetTemporalMutable() throws Exception {
+		this.verifyModelInitialized(
+			TEMPORAL_MUTABLE_KEY,
+			TEMPORAL_MUTABLE_TEST_VALUE);
+		this.verifySetProperty(
+			TEMPORAL_MUTABLE_KEY,
+			TEMPORAL_MUTABLE_TEST_VALUE,
+			TEMPORAL_MUTABLE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveTemporalMutable() throws Exception {
+		this.verifyAddRemoveProperty(
+			TEMPORAL_MUTABLE_KEY,
+			TEMPORAL_MUTABLE_TEST_VALUE,
+			TEMPORAL_MUTABLE_TEST_VALUE_2);
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		if (propertyName.equals(Options.SESSION_NAME_PROPERTY))
+			this.options.setSessionName((String) newValue);
+		else if (propertyName.equals(Options.SESSIONS_XML_PROPERTY))
+			this.options.setSessionsXml((String) newValue);
+		else if (propertyName.equals(Options.SESSION_INCLUDE_DESCRIPTOR_QUERIES_PROPERTY))
+			this.options.setIncludeDescriptorQueries((Boolean) newValue);
+		else if (propertyName.equals(Options.TARGET_DATABASE_PROPERTY))
+			this.setTargetDatabaseProperty(newValue);
+		else if (propertyName.equals(Options.TARGET_SERVER_PROPERTY))
+			this.setTargetServerProperty(newValue);
+		else if (propertyName.equals(Options.SESSION_EVENT_LISTENER_PROPERTY))
+			this.options.setEventListener((String) newValue);
+		else if (propertyName.equals(Options.TEMPORAL_MUTABLE_PROPERTY))
+			this.options.setTemporalMutable((Boolean) newValue);
+		else
+			this.throwMissingDefinition("setProperty", propertyName);
+	}
+
+	private void setTargetDatabaseProperty(Object newValue) {
+		if (newValue.getClass().isEnum())
+			this.options.setTargetDatabase((TargetDatabase) newValue);
+		else
+			this.options.setTargetDatabase((String) newValue);
+	}
+
+	private void setTargetServerProperty(Object newValue) {
+		if (newValue.getClass().isEnum())
+			this.options.setTargetServer((TargetServer) newValue);
+		else
+			this.options.setTargetServer((String) newValue);
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		Object modelValue = null;
+		if (propertyName.equals(Options.SESSION_NAME_PROPERTY))
+			modelValue = this.options.getSessionName();
+		else if (propertyName.equals(Options.SESSIONS_XML_PROPERTY))
+			modelValue = this.options.getSessionsXml();
+		else if (propertyName.equals(Options.SESSION_INCLUDE_DESCRIPTOR_QUERIES_PROPERTY))
+			modelValue = this.options.getIncludeDescriptorQueries();
+		else if (propertyName.equals(Options.TARGET_DATABASE_PROPERTY))
+			modelValue = this.options.getTargetDatabase();
+		else if (propertyName.equals(Options.TARGET_SERVER_PROPERTY))
+			modelValue = this.options.getTargetServer();
+		else if (propertyName.equals(Options.SESSION_EVENT_LISTENER_PROPERTY))
+			modelValue = this.options.getEventListener();
+		else if (propertyName.equals(Options.TEMPORAL_MUTABLE_PROPERTY))
+			modelValue = this.options.getTemporalMutable();
+		else
+			this.throwMissingDefinition("getProperty", propertyName);
+		return modelValue;
+	}
+	
+	@Override
+	protected void verifyPutProperty(String propertyName, Object expectedValue) throws Exception {
+		Object expectedValue_ = expectedValue;
+		if (propertyName.equals(Options.TARGET_DATABASE_PROPERTY) ||
+			propertyName.equals(Options.TARGET_SERVER_PROPERTY)) {
+			
+			expectedValue_ = this.convertToEclipseLinkStringValue(expectedValue);
+		}
+		
+		super.verifyPutProperty(propertyName, expectedValue_);
+	}
+	
+	private String convertToEclipseLinkStringValue(Object expectedValue) {
+		return (String) ((expectedValue != null && expectedValue.getClass().isEnum()) ?
+				this.getPropertyStringValueOf(expectedValue) : // model is storing EclipseLinkStringValue
+				expectedValue); // already a EclipseLinkStringValue
+	}
+	
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.options;
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/options/OptionsValueModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/options/OptionsValueModelTests.java
new file mode 100644
index 0000000..8ba58a0
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/options/OptionsValueModelTests.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.options;
+
+import org.eclipse.jpt.common.utility.internal.model.AbstractModel;
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.options.Options;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * OptionsValueModelTests
+ */
+public class OptionsValueModelTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private Options options;
+
+	private WritablePropertyValueModel<Boolean> includeDescriptorQueriesHolder;
+	private PropertyChangeListener includeDescriptorQueriesListener;
+	private PropertyChangeEvent includeDescriptorQueriesEvent;
+
+	public static final Boolean INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE = Boolean.FALSE;
+
+	public OptionsValueModelTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.options = this.subject.getOptions(); // Subject
+		PropertyValueModel<Options> optionsHolder = new SimplePropertyValueModel<Options>(this.options);
+		
+		this.includeDescriptorQueriesHolder = this.buildIncludeDescriptorQueriesAA(optionsHolder);
+		this.includeDescriptorQueriesListener = this.buildIncludeDescriptorQueriesChangeListener();
+		this.includeDescriptorQueriesHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.includeDescriptorQueriesListener);
+		this.includeDescriptorQueriesEvent = null;
+	}
+
+	public void testHasListeners() {
+		AbstractModel subjectOptions = (AbstractModel) this.options; // Subject
+		
+		PropertyAspectAdapter<Options, Boolean> includeDescriptorQueriesAA = 
+			(PropertyAspectAdapter<Options, Boolean>) this.includeDescriptorQueriesHolder;
+		assertTrue(includeDescriptorQueriesAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+		assertTrue(subjectOptions.hasAnyPropertyChangeListeners(Options.SESSION_INCLUDE_DESCRIPTOR_QUERIES_PROPERTY));
+		
+		includeDescriptorQueriesAA.removePropertyChangeListener(PropertyValueModel.VALUE, this.includeDescriptorQueriesListener);
+		assertFalse(subjectOptions.hasAnyPropertyChangeListeners(Options.SESSION_INCLUDE_DESCRIPTOR_QUERIES_PROPERTY));
+		assertFalse(includeDescriptorQueriesAA.hasAnyPropertyChangeListeners(PropertyValueModel.VALUE));
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing. 
+	 */
+	@Override
+	protected void populatePu() {
+		this.persistenceUnitSetProperty(
+			Options.ECLIPSELINK_SESSION_INCLUDE_DESCRIPTOR_QUERIES, 
+			INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE);
+		return;
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.options;
+	}
+
+	// ****** IncludeDescriptorQueries *******
+	private WritablePropertyValueModel<Boolean> buildIncludeDescriptorQueriesAA(PropertyValueModel<Options> subjectHolder) {
+		return new PropertyAspectAdapter<Options, Boolean>(subjectHolder, Options.SESSION_INCLUDE_DESCRIPTOR_QUERIES_PROPERTY) {
+			@Override
+			protected Boolean buildValue_() {
+				return this.subject.getIncludeDescriptorQueries();
+			}
+
+			@Override
+			protected void setValue_(Boolean enumValue) {
+				this.subject.setIncludeDescriptorQueries(enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildIncludeDescriptorQueriesChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				OptionsValueModelTests.this.includeDescriptorQueriesEvent = e;
+			}
+		};
+	}
+
+	// ****** Tests ******* 
+	public void testValue() {
+		// ****** IncludeDescriptorQueries ******* 
+		this.verifyIncludeDescriptorQueriesAAValue(INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE);
+		assertEquals(Options.DEFAULT_SESSION_INCLUDE_DESCRIPTOR_QUERIES, this.options.getDefaultIncludeDescriptorQueries());
+	}
+
+	public void testSetValue() throws Exception {
+		// ****** IncludeDescriptorQueries ******* 
+		this.includeDescriptorQueriesEvent = null;
+		this.verifyHasListeners(this.includeDescriptorQueriesHolder, PropertyValueModel.VALUE);
+		Boolean newIncludeDescriptorQueries = !INCLUDE_DESCRIPTOR_QUERIES_TEST_VALUE;
+		// Modify the property holder
+		this.includeDescriptorQueriesHolder.setValue(newIncludeDescriptorQueries);
+		this.verifyIncludeDescriptorQueriesAAValue(newIncludeDescriptorQueries);
+		assertNotNull(this.includeDescriptorQueriesEvent);
+	}
+
+	public void testSetNullValue() {
+		String notDeleted = "Property not deleted";
+		// ****** IncludeDescriptorQueries *******
+		this.includeDescriptorQueriesEvent = null;
+		// Setting the property holder
+		this.includeDescriptorQueriesHolder.setValue(null);
+		// testing Holder
+		this.verifyIncludeDescriptorQueriesAAValue(null);
+		assertNotNull(this.includeDescriptorQueriesEvent);
+		// testing PU properties
+		this.verifyPuHasNotProperty(Options.ECLIPSELINK_SESSION_INCLUDE_DESCRIPTOR_QUERIES, notDeleted);
+	}
+
+	// ****** convenience methods *******
+
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifyIncludeDescriptorQueriesAAValue(Boolean testValue) {
+		this.verifyAAValue(
+			testValue, 
+			this.options.getIncludeDescriptorQueries(), 
+			this.includeDescriptorQueriesHolder, 
+			Options.ECLIPSELINK_SESSION_INCLUDE_DESCRIPTOR_QUERIES);
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/JptEclipseLinkPersistenceSchemaGenerationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/JptEclipseLinkPersistenceSchemaGenerationTests.java
new file mode 100644
index 0000000..2f7e745
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/JptEclipseLinkPersistenceSchemaGenerationTests.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.schema.generation;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * decentralize test creation code
+ */
+public class JptEclipseLinkPersistenceSchemaGenerationTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkPersistenceSchemaGenerationTests.class.getPackage().getName());
+
+		suite.addTestSuite(SchemaGenerationValueModelTests.class);
+		suite.addTestSuite(SchemaGenerationBasicAdapterTests.class);
+		suite.addTestSuite(SchemaGenerationAdapterTests.class);
+
+		return suite;
+	}
+
+	private JptEclipseLinkPersistenceSchemaGenerationTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/SchemaGenerationAdapterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/SchemaGenerationAdapterTests.java
new file mode 100644
index 0000000..18e265c
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/SchemaGenerationAdapterTests.java
@@ -0,0 +1,254 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.schema.generation;
+
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.schema.generation.DdlGenerationType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.schema.generation.OutputMode;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.schema.generation.SchemaGeneration;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * Tests the update of OutputMode model object by the SchemaGeneration adapter
+ * when the PersistenceUnit changes.
+ */
+@SuppressWarnings("nls")
+public class SchemaGenerationAdapterTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private SchemaGeneration schemaGeneration;
+
+	public static final String DDL_GENERATION_TYPE_KEY = SchemaGeneration.ECLIPSELINK_DDL_GENERATION_TYPE;
+	public static final DdlGenerationType DDL_GENERATION_TYPE_TEST_VALUE = DdlGenerationType.drop_and_create_tables;
+	public static final DdlGenerationType DDL_GENERATION_TYPE_TEST_VALUE_2 = DdlGenerationType.none;
+
+	public static final String OUTPUT_MODE_KEY = SchemaGeneration.ECLIPSELINK_DDL_GENERATION_OUTPUT_MODE;
+	public static final OutputMode OUTPUT_MODE_TEST_VALUE = OutputMode.sql_script;
+	public static final OutputMode OUTPUT_MODE_TEST_VALUE_2 = OutputMode.database;
+
+	private static final String CREATE_FILE_NAME_KEY = SchemaGeneration.ECLIPSELINK_CREATE_FILE_NAME;
+	private static final String CREATE_FILE_NAME_TEST_VALUE = "create-file-name.test";
+	private static final String CREATE_FILE_NAME_TEST_VALUE_2 = "create-file-name-2.test";
+
+	private static final String DROP_FILE_NAME_KEY = SchemaGeneration.ECLIPSELINK_DROP_FILE_NAME;
+	private static final String DROP_FILE_NAME_TEST_VALUE = "drop-file-name.test";
+	private static final String DROP_FILE_NAME_TEST_VALUE_2 = "drop-file-name-2.test";
+
+	private static final String APPLICATION_LOCATION_KEY = SchemaGeneration.ECLIPSELINK_APPLICATION_LOCATION;
+	private static final String APPLICATION_LOCATION_TEST_VALUE = "C:/temp";
+	private static final String APPLICATION_LOCATION_TEST_VALUE_2 = "C:/tmp";
+
+	public SchemaGenerationAdapterTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.schemaGeneration = this.subject.getSchemaGeneration();
+		
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+		this.schemaGeneration.addPropertyChangeListener(SchemaGeneration.OUTPUT_MODE_PROPERTY, propertyChangeListener);
+		this.schemaGeneration.addPropertyChangeListener(SchemaGeneration.DDL_GENERATION_TYPE_PROPERTY, propertyChangeListener);
+		this.schemaGeneration.addPropertyChangeListener(SchemaGeneration.CREATE_FILE_NAME_PROPERTY, propertyChangeListener);
+		this.schemaGeneration.addPropertyChangeListener(SchemaGeneration.DROP_FILE_NAME_PROPERTY, propertyChangeListener);
+		this.schemaGeneration.addPropertyChangeListener(SchemaGeneration.APPLICATION_LOCATION_PROPERTY, propertyChangeListener);
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing. Cannot use
+	 * Property Holder to initialize because it is not created yet
+	 */
+	@Override
+	protected void populatePu() {
+		this.propertiesTotal = 9;
+		this.modelPropertiesSizeOriginal = 5;
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		this.persistenceUnitSetProperty("property.0", "value.0");
+		this.persistenceUnitSetProperty(OUTPUT_MODE_KEY, this.getPropertyStringValueOf(OUTPUT_MODE_TEST_VALUE));
+		this.persistenceUnitSetProperty("property.2", "value.2");
+		this.persistenceUnitSetProperty("property.3", "value.3");
+		this.persistenceUnitSetProperty("property.4", "value.4");
+		this.persistenceUnitSetProperty(DDL_GENERATION_TYPE_KEY, this.getPropertyStringValueOf(DDL_GENERATION_TYPE_TEST_VALUE));
+		this.persistenceUnitSetProperty(CREATE_FILE_NAME_KEY, CREATE_FILE_NAME_TEST_VALUE);
+		this.persistenceUnitSetProperty(DROP_FILE_NAME_KEY, DROP_FILE_NAME_TEST_VALUE);
+		this.persistenceUnitSetProperty(APPLICATION_LOCATION_KEY, APPLICATION_LOCATION_TEST_VALUE);
+		return;
+	}
+
+	// ********** CreateFileName **********
+	/**
+	 * Tests the update of CreateFileName property by the SchemaGeneration
+	 * adapter when the PU or the model changes.
+	 */
+	public void testSetCreateFileName() throws Exception {
+		this.verifyModelInitialized(
+			CREATE_FILE_NAME_KEY,
+			CREATE_FILE_NAME_TEST_VALUE);
+		this.verifySetProperty(
+			CREATE_FILE_NAME_KEY,
+			CREATE_FILE_NAME_TEST_VALUE,
+			CREATE_FILE_NAME_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveCreateFileName() throws Exception {
+		this.verifyAddRemoveProperty(
+			CREATE_FILE_NAME_KEY,
+			CREATE_FILE_NAME_TEST_VALUE,
+			CREATE_FILE_NAME_TEST_VALUE_2);
+	}
+	
+	// ********** DropFileName **********
+	/**
+	 * Tests the update of DropFileName property by the SchemaGeneration adapter
+	 * when the PU or the model changes.
+	 */
+	public void testSetDropFileName() throws Exception {
+		this.verifyModelInitialized(
+			DROP_FILE_NAME_KEY,
+			DROP_FILE_NAME_TEST_VALUE);
+		this.verifySetProperty(
+			DROP_FILE_NAME_KEY,
+			DROP_FILE_NAME_TEST_VALUE,
+			DROP_FILE_NAME_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveDropFileName() throws Exception {
+		this.verifyAddRemoveProperty(
+			DROP_FILE_NAME_KEY, 
+			DROP_FILE_NAME_TEST_VALUE, 
+			DROP_FILE_NAME_TEST_VALUE_2);
+	}
+
+	// ********** ApplicationLocation **********
+	/**
+	 * Tests the update of ApplicationLocation property by the SchemaGeneration
+	 * adapter when the PU or the model changes.
+	 */
+	public void testSetApplicationLocation() throws Exception {
+		this.verifyModelInitialized(
+			APPLICATION_LOCATION_KEY,
+			APPLICATION_LOCATION_TEST_VALUE);
+		this.verifySetProperty(
+			APPLICATION_LOCATION_KEY,
+			APPLICATION_LOCATION_TEST_VALUE,
+			APPLICATION_LOCATION_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveApplicationLocation() throws Exception {
+		this.verifyAddRemoveProperty(
+			APPLICATION_LOCATION_KEY,
+			APPLICATION_LOCATION_TEST_VALUE,
+			APPLICATION_LOCATION_TEST_VALUE_2);
+	}
+
+	public void testSetEmptyApplicationLocation() throws Exception {
+		String puKey = APPLICATION_LOCATION_KEY;
+		PersistenceUnit.Property property = this.getPersistenceUnit().getProperty(puKey);
+		String propertyName = this.getModel().propertyIdOf(property);
+
+		// Set ApplicationLocation to "" & verify that the property is deleted
+		this.verifyPuHasProperty(puKey,  "persistenceUnit.properties doesn't contains: ");
+		this.setProperty(propertyName, "");
+
+		this.verifyPuHasNotProperty(puKey,  "Property was not deleted");
+		this.verifyPutProperty(propertyName, null);
+		assertNull(this.getPersistenceUnit().getProperty(puKey));
+	}
+
+	// ********** OutputMode **********
+	/**
+	 * Tests the update of OutputMode property by the SchemaGeneration adapter
+	 * when the PU or the model changes.
+	 */
+	public void testSetOutputMode() throws Exception {
+		this.verifyModelInitialized(
+			OUTPUT_MODE_KEY,
+			OUTPUT_MODE_TEST_VALUE);
+		this.verifySetProperty(
+			OUTPUT_MODE_KEY,
+			OUTPUT_MODE_TEST_VALUE,
+			OUTPUT_MODE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveOutputMode() throws Exception {
+		this.verifyAddRemoveProperty(
+			OUTPUT_MODE_KEY, 
+			OUTPUT_MODE_TEST_VALUE, 
+			OUTPUT_MODE_TEST_VALUE_2);
+	}
+
+	// ********** DdlGenerationType **********
+	/**
+	 * Tests the update of DdlGenerationType property by the SchemaGeneration
+	 * adapter when the PU or the model changes.
+	 */
+	public void testSetDdlGenerationType() throws Exception {
+		this.verifyModelInitialized(
+			DDL_GENERATION_TYPE_KEY,
+			DDL_GENERATION_TYPE_TEST_VALUE);
+		this.verifySetProperty(
+			DDL_GENERATION_TYPE_KEY,
+			DDL_GENERATION_TYPE_TEST_VALUE,
+			DDL_GENERATION_TYPE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveDdlGenerationType() throws Exception {
+		this.verifyAddRemoveProperty(
+			DDL_GENERATION_TYPE_KEY, 
+			DDL_GENERATION_TYPE_TEST_VALUE, 
+			DDL_GENERATION_TYPE_TEST_VALUE_2);
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws NoSuchFieldException {
+		if (propertyName.equals(SchemaGeneration.OUTPUT_MODE_PROPERTY))
+			this.schemaGeneration.setOutputMode((OutputMode) newValue);
+		// else if( propertyName.equals( Caching.CACHE_SIZE_PROPERTY))
+		// TODO
+		else if (propertyName.equals(SchemaGeneration.DDL_GENERATION_TYPE_PROPERTY))
+			this.schemaGeneration.setDdlGenerationType((DdlGenerationType) newValue);
+		else if (propertyName.equals(SchemaGeneration.APPLICATION_LOCATION_PROPERTY))
+			this.schemaGeneration.setApplicationLocation((String) newValue);
+		else if (propertyName.equals(SchemaGeneration.CREATE_FILE_NAME_PROPERTY))
+			this.schemaGeneration.setCreateFileName((String) newValue);
+		else if (propertyName.equals(SchemaGeneration.DROP_FILE_NAME_PROPERTY))
+			this.schemaGeneration.setDropFileName((String) newValue);
+		else
+			this.throwMissingDefinition("setProperty", propertyName);
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		Object modelValue = null;
+		if (propertyName.equals(SchemaGeneration.OUTPUT_MODE_PROPERTY))
+			modelValue = this.schemaGeneration.getOutputMode();
+		else if (propertyName.equals(SchemaGeneration.DDL_GENERATION_TYPE_PROPERTY))
+			modelValue = this.schemaGeneration.getDdlGenerationType();
+		else if (propertyName.equals(SchemaGeneration.APPLICATION_LOCATION_PROPERTY))
+			modelValue = this.schemaGeneration.getApplicationLocation();
+		else if (propertyName.equals(SchemaGeneration.CREATE_FILE_NAME_PROPERTY))
+			modelValue = this.schemaGeneration.getCreateFileName();
+		else if (propertyName.equals(SchemaGeneration.DROP_FILE_NAME_PROPERTY))
+			modelValue = this.schemaGeneration.getDropFileName();
+		else
+			this.throwMissingDefinition("getProperty", propertyName);
+		return modelValue;
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.schemaGeneration;
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/SchemaGenerationBasicAdapterTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/SchemaGenerationBasicAdapterTests.java
new file mode 100644
index 0000000..f77c313
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/SchemaGenerationBasicAdapterTests.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.schema.generation;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.common.utility.model.value.ListValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.schema.generation.DdlGenerationType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.schema.generation.OutputMode;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.schema.generation.SchemaGeneration;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * Tests the update of OutputMode model object by the SchemaGeneration adapter
+ * when the PersistenceUnit changes.
+ */
+public class SchemaGenerationBasicAdapterTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private SchemaGeneration schemaGeneration;
+
+	public static final String outputModeKey = SchemaGeneration.ECLIPSELINK_DDL_GENERATION_OUTPUT_MODE;
+	public static final String ddlGenTypeKey = SchemaGeneration.ECLIPSELINK_DDL_GENERATION_TYPE;
+
+	public static final OutputMode OUTPUT_MODE_TEST_VALUE = OutputMode.sql_script;
+	public static final OutputMode OUTPUT_MODE_TEST_VALUE_2 = OutputMode.database;
+	
+	public static final DdlGenerationType DDL_GENERATION_TYPE_TEST_VALUE = DdlGenerationType.drop_and_create_tables;
+	public static final DdlGenerationType DDL_GENERATION_TYPE_TEST_VALUE_2 = DdlGenerationType.none;
+
+	public SchemaGenerationBasicAdapterTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		
+		this.schemaGeneration = this.subject.getSchemaGeneration();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+		this.schemaGeneration.addPropertyChangeListener(SchemaGeneration.OUTPUT_MODE_PROPERTY, propertyChangeListener);
+		this.schemaGeneration.addPropertyChangeListener(SchemaGeneration.DDL_GENERATION_TYPE_PROPERTY, propertyChangeListener);
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing. Cannot use
+	 * Property Holder to initialize because it is not created yet
+	 */
+	@Override
+	protected void populatePu() {
+		this.propertiesTotal = 6;
+		this.modelPropertiesSizeOriginal = 2;
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		this.persistenceUnitSetProperty("property.0", "value.0");
+		this.persistenceUnitSetProperty(outputModeKey, this.getPropertyStringValueOf(OUTPUT_MODE_TEST_VALUE));
+		this.persistenceUnitSetProperty("property.2", "value.2");
+		this.persistenceUnitSetProperty("property.3", "value.3");
+		this.persistenceUnitSetProperty("property.4", "value.4");
+		this.persistenceUnitSetProperty(ddlGenTypeKey, this.getPropertyStringValueOf(DDL_GENERATION_TYPE_TEST_VALUE));
+		return;
+	}
+
+	/** ****** test methods ******* */
+
+	/**
+	 * Tests the update of OutputMode property by the SchemaGeneration adapter
+	 * when the PU changes.
+	 */
+	public void testOutputModeUpdate() throws Exception {
+		ListValueModel<PersistenceUnit.Property> propertiesAdapter = this.buildPropertiesAdapter(this.subjectHolder);
+		ListValueModel<PersistenceUnit.Property> propertyListAdapter = new ItemPropertyListValueModelAdapter<PersistenceUnit.Property>(propertiesAdapter, PersistenceUnit.Property.VALUE_PROPERTY);
+		
+		this.verifyHasListeners(this.schemaGeneration, SchemaGeneration.OUTPUT_MODE_PROPERTY);
+		
+		// Basic
+		assertTrue(schemaGeneration.itemIsProperty(this.getPersistenceUnit().getProperty(outputModeKey)));
+		assertEquals(OUTPUT_MODE_TEST_VALUE, this.schemaGeneration.getOutputMode());
+		
+		// Replace
+		this.persistenceUnitSetProperty(outputModeKey, OUTPUT_MODE_TEST_VALUE_2);
+		this.verifyPutEvent(SchemaGeneration.OUTPUT_MODE_PROPERTY, OUTPUT_MODE_TEST_VALUE_2, this.schemaGeneration.getOutputMode());
+		
+		// Remove
+		this.clearEvent();
+		--this.propertiesTotal;
+		--this.modelPropertiesSize;
+		this.getPersistenceUnit().removeProperty(outputModeKey);
+		assertNull(this.getPersistenceUnit().getProperty(outputModeKey));
+		assertEquals(this.modelPropertiesSize, this.modelPropertiesSizeOriginal - 1);
+		assertNotNull(this.propertyChangedEvent);
+		assertNull(this.propertyChangedEvent.getNewValue());
+		
+		// Add original OutputMode
+		++this.propertiesTotal;
+		++this.modelPropertiesSize;
+		this.persistenceUnitSetProperty(outputModeKey, OUTPUT_MODE_TEST_VALUE);
+		this.verifyPutEvent(SchemaGeneration.OUTPUT_MODE_PROPERTY, OUTPUT_MODE_TEST_VALUE, this.schemaGeneration.getOutputMode());
+		
+		// Replace again
+		this.persistenceUnitSetProperty(outputModeKey, OUTPUT_MODE_TEST_VALUE_2);
+		this.verifyPutEvent(SchemaGeneration.OUTPUT_MODE_PROPERTY, OUTPUT_MODE_TEST_VALUE_2, this.schemaGeneration.getOutputMode());
+		
+		// Replace by setting model object
+		this.clearEvent();
+		this.schemaGeneration.setOutputMode(OUTPUT_MODE_TEST_VALUE);
+		this.verifyPutEvent(SchemaGeneration.OUTPUT_MODE_PROPERTY, OUTPUT_MODE_TEST_VALUE, this.schemaGeneration.getOutputMode());
+	}
+
+	// ****** convenience methods *******
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.schemaGeneration;
+	}
+
+	private ListValueModel<PersistenceUnit.Property> buildPropertiesAdapter(PropertyValueModel<EclipseLinkPersistenceUnit> subjectHolder) {
+		return new ListAspectAdapter<EclipseLinkPersistenceUnit, PersistenceUnit.Property>(subjectHolder, PersistenceUnit.PROPERTIES_LIST) {
+			@Override
+			protected ListIterator<PersistenceUnit.Property> listIterator_() {
+				return this.subject.properties();
+			}
+
+			@Override
+			protected int size_() {
+				return this.subject.propertiesSize();
+			}
+		};
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/SchemaGenerationValueModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/SchemaGenerationValueModelTests.java
new file mode 100644
index 0000000..2cda6ae
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/context/persistence/schema/generation/SchemaGenerationValueModelTests.java
@@ -0,0 +1,232 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.schema.generation;
+
+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.schema.generation.DdlGenerationType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.schema.generation.OutputMode;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.schema.generation.SchemaGeneration;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.persistence.EclipseLinkPersistenceUnitTestCase;
+
+/**
+ * SchemaGenerationValueModelTests
+ * 
+ * Tests the PropertyValueModel of SchemaGeneration model and the update of the
+ * PersistenceUnit.
+ */
+public class SchemaGenerationValueModelTests extends EclipseLinkPersistenceUnitTestCase
+{
+	private SchemaGeneration schemaGen;
+	private PropertyValueModel<SchemaGeneration> schemaGenHolder;
+
+	private WritablePropertyValueModel<DdlGenerationType> ddlGenerationTypeHolder;
+	private PropertyChangeEvent ddlGenerationTypeEvent;
+
+	private WritablePropertyValueModel<OutputMode> outputModeHolder;
+	private PropertyChangeEvent outputModeEvent;
+
+	public static final DdlGenerationType DDL_GENERATION_TYPE_TEST_VALUE = DdlGenerationType.drop_and_create_tables;
+	public static final OutputMode OUTPUT_MODE_TEST_VALUE = OutputMode.sql_script;
+
+	public SchemaGenerationValueModelTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.schemaGen = this.subject.getSchemaGeneration(); // Subject
+		this.schemaGenHolder = new SimplePropertyValueModel<SchemaGeneration>(this.schemaGen);
+		
+		this.ddlGenerationTypeHolder = this.buildDdlGenerationTypeAA(this.schemaGenHolder);
+		PropertyChangeListener ddlGenerationTypeListener = this.buildDdlGenerationTypeChangeListener();
+		this.ddlGenerationTypeHolder.addPropertyChangeListener(PropertyValueModel.VALUE, ddlGenerationTypeListener);
+		this.ddlGenerationTypeEvent = null;
+		
+		this.outputModeHolder = this.buildOutputModeAA(this.schemaGenHolder);
+		PropertyChangeListener outputModeListener = this.buildOutputModeChangeListener();
+		this.outputModeHolder.addPropertyChangeListener(PropertyValueModel.VALUE, outputModeListener);
+		this.outputModeEvent = null;
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing. Cannot use
+	 * Property Holder to initialize because it is not created yet
+	 */
+	@Override
+	protected void populatePu() {
+		this.persistenceUnitSetProperty(
+			SchemaGeneration.ECLIPSELINK_DDL_GENERATION_TYPE,
+			DDL_GENERATION_TYPE_TEST_VALUE);
+		this.persistenceUnitSetProperty(
+			SchemaGeneration.ECLIPSELINK_DDL_GENERATION_OUTPUT_MODE,
+			OUTPUT_MODE_TEST_VALUE);
+		return;
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.schemaGen;
+	}
+
+	/** ****** DdlGenerationType ******* */
+	private WritablePropertyValueModel<DdlGenerationType> buildDdlGenerationTypeAA(PropertyValueModel<SchemaGeneration> subjectHolder) {
+		return new PropertyAspectAdapter<SchemaGeneration, DdlGenerationType>(subjectHolder, SchemaGeneration.DDL_GENERATION_TYPE_PROPERTY) {
+			@Override
+			protected DdlGenerationType buildValue_() {
+				return this.subject.getDdlGenerationType();
+			}
+
+			@Override
+			protected void setValue_(DdlGenerationType enumValue) {
+				this.subject.setDdlGenerationType(enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildDdlGenerationTypeChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				SchemaGenerationValueModelTests.this.ddlGenerationTypeEvent = e;
+			}
+		};
+	}
+
+	/** ****** OutputMode ******* */
+	private WritablePropertyValueModel<OutputMode> buildOutputModeAA(PropertyValueModel<SchemaGeneration> subjectHolder) {
+		return new PropertyAspectAdapter<SchemaGeneration, OutputMode>(subjectHolder, SchemaGeneration.OUTPUT_MODE_PROPERTY) {
+			@Override
+			protected OutputMode buildValue_() {
+				return this.subject.getOutputMode();
+			}
+
+			@Override
+			protected void setValue_(OutputMode enumValue) {
+				this.subject.setOutputMode(enumValue);
+			}
+		};
+	}
+
+	private PropertyChangeListener buildOutputModeChangeListener() {
+		return new PropertyChangeListener() {
+			public void propertyChanged(PropertyChangeEvent e) {
+				SchemaGenerationValueModelTests.this.outputModeEvent = e;
+			}
+		};
+	}
+
+	public void testValue() {
+		/** ****** DdlGenerationType ******* */
+		this.verifyDdlGenerationTypeAAValue(DDL_GENERATION_TYPE_TEST_VALUE);
+		assertEquals(
+			SchemaGeneration.DEFAULT_SCHEMA_GENERATION_DDL_GENERATION_TYPE,
+			this.schemaGen.getDefaultDdlGenerationType());
+		/** ****** OutputMode ******* */
+		this.verifyOutputModeAAValue(OUTPUT_MODE_TEST_VALUE);
+		assertEquals(
+			SchemaGeneration.DEFAULT_SCHEMA_GENERATION_OUTPUT_MODE,
+			this.schemaGen.getDefaultOutputMode());
+	}
+
+	public void testSetValue() throws Exception {
+		/** ****** DdlGenerationType ******* */
+		this.ddlGenerationTypeEvent = null;
+		this.verifyHasListeners(this.ddlGenerationTypeHolder, PropertyValueModel.VALUE);
+		DdlGenerationType newDdlGenerationType = DdlGenerationType.create_tables;
+		// Modify the persistenceUnit directly
+		this.subject.setProperty(
+			SchemaGeneration.ECLIPSELINK_DDL_GENERATION_TYPE,
+			this.getPropertyStringValueOf(newDdlGenerationType),
+			false);
+		this.verifyDdlGenerationTypeAAValue(newDdlGenerationType);
+		assertNotNull(this.ddlGenerationTypeEvent);
+		
+		/** ****** OutputMode ******* */
+		this.outputModeEvent = null;
+		this.verifyHasListeners(this.outputModeHolder, PropertyValueModel.VALUE);
+		OutputMode newOutputMode = OutputMode.database;
+		// Modify the property holder
+		this.outputModeHolder.setValue(newOutputMode);
+		this.verifyOutputModeAAValue(newOutputMode);
+		assertNotNull(this.outputModeEvent);
+	}
+
+	public void testSetNullValue() {
+		/** ****** DdlGenerationType ******* */
+		this.ddlGenerationTypeEvent = null;
+		// Setting the persistenceUnit directly
+		this.subject.setProperty(SchemaGeneration.ECLIPSELINK_DDL_GENERATION_TYPE, null, false);
+		this.ddlGenerationTypeHolder.setValue(null);
+		// testing Holder
+		this.verifyDdlGenerationTypeAAValue(null);
+		assertNotNull(this.ddlGenerationTypeEvent);
+		// testing PU properties
+		PersistenceUnit.Property property = this.getPersistenceUnit().getProperty(SchemaGeneration.ECLIPSELINK_DDL_GENERATION_TYPE);
+		assertNull(property);
+		
+		/** ****** OutputMode ******* */
+		this.outputModeEvent = null;
+		// Setting the property holder
+		this.outputModeHolder.setValue(null);
+		// testing Holder
+		this.verifyOutputModeAAValue(null);
+		assertNotNull(this.outputModeEvent);
+		// testing PU properties
+		property = this.getPersistenceUnit().getProperty(SchemaGeneration.ECLIPSELINK_DDL_GENERATION_OUTPUT_MODE);
+		assertNull(property);
+	}
+
+	/** ****** convenience methods ******* */
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifyDdlGenerationTypeAAValue(DdlGenerationType testValue) {
+		this.verifyAAValue(
+			testValue,
+			this.schemaGen.getDdlGenerationType(),
+			this.ddlGenerationTypeHolder,
+			SchemaGeneration.ECLIPSELINK_DDL_GENERATION_TYPE);
+	}
+
+	/**
+	 * Performs three value tests:<br>
+	 * 1. subject value<br>
+	 * 2. aspect adapter value<br>
+	 * 3. persistenceUnit property value<br>
+	 */
+	protected void verifyOutputModeAAValue(OutputMode testValue) {
+		this.verifyAAValue(
+			testValue,
+			this.schemaGen.getOutputMode(),
+			this.outputModeHolder,
+			SchemaGeneration.ECLIPSELINK_DDL_GENERATION_OUTPUT_MODE);
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/JptJpaEclipselinkCoreResourceModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/JptJpaEclipselinkCoreResourceModelTests.java
new file mode 100644
index 0000000..dea557c
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/JptJpaEclipselinkCoreResourceModelTests.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ *  Copyright (c) 2007, 2010 Oracle. 
+ *  All rights reserved.  This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.JptJpaEclipseLinkCoreTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java.JptEclipseLinkCoreJavaResourceModelTests;
+
+/**
+ * Required Java system property:
+ *    -Dorg.eclipse.jpt.jpa.jar=<jpa.jar path>
+ *    -Dorg.eclipse.jpt.eclipselink.jar=<eclipselink.jar path>
+ */
+public class JptJpaEclipselinkCoreResourceModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptJpaEclipselinkCoreResourceModelTests.class.getName());
+		if(JptJpaEclipseLinkCoreTests.requiredJarsExists()) {
+			suite.addTest(JptEclipseLinkCoreJavaResourceModelTests.suite());
+		}
+		else {
+			suite.addTest(TestSuite.warning(JptJpaEclipseLinkCoreTests.buildMissingJarErrorMessage()));
+		}
+		return suite;
+	}
+
+	private JptJpaEclipselinkCoreResourceModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/CacheTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/CacheTests.java
new file mode 100644
index 0000000..ebea9fe
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/CacheTests.java
@@ -0,0 +1,448 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheCoordinationType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.CacheType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkCacheAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkTimeOfDayAnnotation;
+
+@SuppressWarnings("nls")
+public class CacheTests extends EclipseLinkJavaResourceModelTestCase {
+
+	public CacheTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestCache() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE, EclipseLink.CACHE_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestCacheWithCacheType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE, EclipseLink.CACHE_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(type = CacheType.SOFT)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestCacheWithSize() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(size = 50)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestCacheWithExpiry() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(expiry = 50)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestCacheWithExpiryTimeOfDay() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE, EclipseLink.TIME_OF_DAY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(expiryTimeOfDay = @TimeOfDay)");
+			}
+		});
+	}
+
+	private ICompilationUnit createTestCacheWithShared() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(shared=true)");
+			}
+		});
+	}
+
+	private ICompilationUnit createTestCacheWithAlwaysRefresh() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(alwaysRefresh=true)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestCacheWithRefreshOnlyIfNewer() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(refreshOnlyIfNewer=true)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestCacheWithDisableHits() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(disableHits=true)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestExistenceCheckingWithCoordinationType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE, EclipseLink.CACHE_COORDINATION_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(coordinationType = CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS)");
+			}
+		});
+	}
+	
+	public void testCache() throws Exception {
+		ICompilationUnit cu = this.createTestCache();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertNotNull(cache);
+	}
+
+	public void testGetType() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithCacheType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(CacheType.SOFT, cache.getType());
+	}
+
+	public void testSetType() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithCacheType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(CacheType.SOFT, cache.getType());
+		
+		cache.setType(CacheType.WEAK);
+		assertEquals(CacheType.WEAK, cache.getType());
+		
+		assertSourceContains("@Cache(type = WEAK)", cu);
+		
+		cache.setType(null);
+		assertNull(cache.getType());
+		
+		assertSourceDoesNotContain("(type = WEAK)", cu);
+		assertSourceDoesNotContain("@Cache(", cu);
+	}
+	
+	public void testGetSize() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithSize();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Integer.valueOf(50), cache.getSize());
+	}
+
+	public void testSetSize() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithSize();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Integer.valueOf(50), cache.getSize());
+		
+		cache.setSize(Integer.valueOf(80));
+		assertEquals(Integer.valueOf(80), cache.getSize());
+		
+		assertSourceContains("@Cache(size = 80)", cu);
+		
+		cache.setSize(null);
+		assertNull(cache.getSize());
+		
+		assertSourceDoesNotContain("(size = 80)", cu);
+		assertSourceDoesNotContain("@Cache(", cu);
+	}
+	
+	public void testGetShared() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithShared();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getShared());
+	}
+
+	public void testSetShared() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithShared();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getShared());
+		
+		cache.setShared(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, cache.getShared());
+		
+		assertSourceContains("@Cache(shared=false)", cu);
+	}
+	
+	public void testSetSharedNull() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithShared();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getShared());
+		
+		cache.setShared(null);
+	
+		assertSourceDoesNotContain("@Cache(", cu);
+	}
+	
+	public void testGetExpiry() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithExpiry();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Integer.valueOf(50), cache.getExpiry());
+	}
+
+	public void testSetExpiry() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithExpiry();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Integer.valueOf(50), cache.getExpiry());
+		
+		cache.setExpiry(Integer.valueOf(80));
+		assertEquals(Integer.valueOf(80), cache.getExpiry());
+		
+		assertSourceContains("@Cache(expiry = 80)", cu);
+		
+		cache.setExpiry(null);
+		assertNull(cache.getExpiry());
+		
+		assertSourceDoesNotContain("(expiry = 80)", cu);
+		assertSourceDoesNotContain("@Cache(", cu);
+	}
+	
+	public void testGetExpiryTimeOfDay() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithExpiryTimeOfDay();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		assertNotNull(timeOfDay);
+	}
+
+	public void testAddExpiryTimeOfDay() throws Exception {
+		ICompilationUnit cu = this.createTestCache();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		cache.addExpiryTimeOfDay();
+		
+		assertNotNull(cache.getExpiryTimeOfDay());
+		
+		assertSourceContains("@Cache(expiryTimeOfDay = @TimeOfDay)", cu);
+	}
+	
+	public void testRemoveExpiryTimeOfDay() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithExpiryTimeOfDay();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		assertNotNull(cache.getExpiryTimeOfDay());
+
+		cache.removeExpiryTimeOfDay();
+		assertNull(cache.getExpiryTimeOfDay());
+		assertSourceDoesNotContain("@Cache(expiryTimeOfDay = @TimeOfDay)", cu);
+	}
+	
+	public void testGetAlwaysRefresh() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithAlwaysRefresh();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getAlwaysRefresh());
+	}
+	
+	public void testSetAlwaysRefresh() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithAlwaysRefresh();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getAlwaysRefresh());
+		
+		cache.setAlwaysRefresh(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, cache.getAlwaysRefresh());
+		
+		assertSourceContains("@Cache(alwaysRefresh=false)", cu);		
+	}
+	
+	public void testSetAlwaysRefreshNull() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithAlwaysRefresh();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getAlwaysRefresh());
+		
+		cache.setAlwaysRefresh(null);
+		cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertNull(cache.getAlwaysRefresh());
+		
+		assertSourceContains("@Cache", cu);
+		assertSourceDoesNotContain("@Cache(", cu);
+	}
+
+	public void testGetRefreshOnlyIfNewer() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithRefreshOnlyIfNewer();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getRefreshOnlyIfNewer());		
+	}
+	
+	public void testSetRefreshOnlyIfNewer() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithRefreshOnlyIfNewer();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getRefreshOnlyIfNewer());
+		
+		cache.setRefreshOnlyIfNewer(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, cache.getRefreshOnlyIfNewer());
+		
+		assertSourceContains("@Cache(refreshOnlyIfNewer=false)", cu);			
+	}
+	
+	public void testSetRefreshOnlyIfNewerNull() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithRefreshOnlyIfNewer();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getRefreshOnlyIfNewer());
+		
+		cache.setRefreshOnlyIfNewer(null);
+		cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertNull(cache.getRefreshOnlyIfNewer());
+		assertSourceContains("@Cache", cu);
+		assertSourceDoesNotContain("@Cache(", cu);
+	}
+
+	public void testGetDisableHits() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithDisableHits();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getDisableHits());				
+	}
+	
+	public void testSetDisableHits() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithDisableHits();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getDisableHits());
+		
+		cache.setDisableHits(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, cache.getDisableHits());
+		
+		assertSourceContains("@Cache(disableHits=false)", cu);			
+	}
+	
+	public void testSetDisableHitsNull() throws Exception {
+		ICompilationUnit cu = this.createTestCacheWithDisableHits();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(Boolean.TRUE, cache.getDisableHits());
+		
+		cache.setDisableHits(null);
+		cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertNull(cache.getDisableHits());
+		assertSourceContains("@Cache", cu);
+		assertSourceDoesNotContain("@Cache(", cu);
+	}
+
+	
+	public void testGetCoordinationType() throws Exception {
+		ICompilationUnit cu = this.createTestExistenceCheckingWithCoordinationType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, cache.getCoordinationType());
+	}
+
+	public void testSetCoordinationType() throws Exception {
+		ICompilationUnit cu = this.createTestExistenceCheckingWithCoordinationType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		assertEquals(CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, cache.getCoordinationType());
+		
+		cache.setCoordinationType(CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES);
+		assertEquals(CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, cache.getCoordinationType());
+		
+		assertSourceContains("@Cache(coordinationType = SEND_NEW_OBJECTS_WITH_CHANGES)", cu);
+		
+		cache.setCoordinationType(null);
+		assertNull(cache.getCoordinationType());
+		
+		assertSourceDoesNotContain("(coordinationType = SEND_NEW_OBJECTS_WITH_CHANGES)", cu);
+		assertSourceDoesNotContain("@Cache(", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ChangeTrackingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ChangeTrackingTests.java
new file mode 100644
index 0000000..6a82941
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ChangeTrackingTests.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkChangeTrackingAnnotation;
+
+@SuppressWarnings("nls")
+public class ChangeTrackingTests extends EclipseLinkJavaResourceModelTestCase {
+
+	public ChangeTrackingTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestChangeTracking() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CHANGE_TRACKING, EclipseLink.CHANGE_TRACKING_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@ChangeTracking");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestChangeTrackingWithValue() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CHANGE_TRACKING, EclipseLink.CHANGE_TRACKING_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@ChangeTracking(ChangeTrackingType.DEFERRED)");
+			}
+		});
+	}
+
+	public void testChangeTracking() throws Exception {
+		ICompilationUnit cu = this.createTestChangeTracking();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		
+		EclipseLinkChangeTrackingAnnotation existenceChecking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLink.CHANGE_TRACKING);
+		assertNotNull(existenceChecking);
+	}
+
+	public void testGetValue() throws Exception {
+		ICompilationUnit cu = this.createTestChangeTrackingWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkChangeTrackingAnnotation existenceChecking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLink.CHANGE_TRACKING);
+		assertEquals(ChangeTrackingType.DEFERRED, existenceChecking.getValue());
+	}
+
+	public void testSetValue() throws Exception {
+		ICompilationUnit cu = this.createTestChangeTrackingWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkChangeTrackingAnnotation existenceChecking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLink.CHANGE_TRACKING);
+		assertEquals(ChangeTrackingType.DEFERRED, existenceChecking.getValue());
+		
+		existenceChecking.setValue(ChangeTrackingType.ATTRIBUTE);
+		assertEquals(ChangeTrackingType.ATTRIBUTE, existenceChecking.getValue());
+		
+		assertSourceContains("@ChangeTracking(ATTRIBUTE)", cu);
+		
+		existenceChecking.setValue(null);
+		assertNull(existenceChecking.getValue());
+		
+		assertSourceDoesNotContain("(ATTRIBUTE)", cu);
+		assertSourceContains("@ChangeTracking", cu);
+		assertSourceDoesNotContain("@ChangeTracking(", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ConversionValueAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ConversionValueAnnotationTests.java
new file mode 100644
index 0000000..fd34a0d
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ConversionValueAnnotationTests.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkObjectTypeConverterAnnotation;
+
+@SuppressWarnings("nls")
+public class ConversionValueAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public ConversionValueAnnotationTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestObjectTypeConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.OBJECT_TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ObjectTypeConverter");
+			}
+		});
+	}	
+	
+	private ICompilationUnit createTestObjectTypeConverterWithConversionValues() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.OBJECT_TYPE_CONVERTER, EclipseLink.CONVERSION_VALUE);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ObjectTypeConverter(conversionValues = {@ConversionValue(dataValue = \"F\", objectValue = \"Female\"), @ConversionValue(dataValue = \"M\", objectValue = \"Male\")})");
+			}
+		});
+	}
+
+
+	public void testGetDataValue() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithConversionValues();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("F", converter.conversionValueAt(0).getDataValue());
+	}
+
+	public void testSetDataValue() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithConversionValues();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("F", converter.conversionValueAt(0).getDataValue());
+		
+		converter.conversionValueAt(0).setDataValue("FOO");
+		assertEquals("FOO", converter.conversionValueAt(0).getDataValue());
+		
+		assertSourceContains("@ObjectTypeConverter(conversionValues = {@ConversionValue(dataValue = \"FOO\", objectValue = \"Female\"), @ConversionValue(dataValue = \"M\", objectValue = \"Male\")})", cu);
+	}
+	
+	public void testSetDataValueNull() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverter();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals(0, converter.conversionValuesSize());
+		
+		converter.addConversionValue(0).setDataValue("FOO");
+		assertSourceContains("@ObjectTypeConverter(conversionValues = @ConversionValue(dataValue = \"FOO\"))", cu);
+		
+		converter.conversionValueAt(0).setDataValue(null);
+		assertSourceContains("@ObjectTypeConverter(conversionValues = @ConversionValue)", cu);
+		assertEquals(1, converter.conversionValuesSize());
+	}
+	
+	public void testGetObjectValue() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithConversionValues();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("Female", converter.conversionValueAt(0).getObjectValue());
+	}
+
+	public void testSetObjectValue() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithConversionValues();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("Female", converter.conversionValueAt(0).getObjectValue());
+		
+		converter.conversionValueAt(0).setObjectValue("FOO");
+		assertEquals("FOO", converter.conversionValueAt(0).getObjectValue());
+		
+		assertSourceContains("@ObjectTypeConverter(conversionValues = {@ConversionValue(dataValue = \"F\", objectValue = \"FOO\"), @ConversionValue(dataValue = \"M\", objectValue = \"Male\")})", cu);
+	}
+	
+	public void testSetObjectValueNull() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverter();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals(0, converter.conversionValuesSize());
+		
+		converter.addConversionValue(0).setObjectValue("FOO");
+		assertSourceContains("@ObjectTypeConverter(conversionValues = @ConversionValue(objectValue = \"FOO\"))", cu);
+		
+		converter.conversionValueAt(0).setObjectValue(null);
+		assertSourceContains("@ObjectTypeConverter(conversionValues = @ConversionValue)", cu);
+		assertEquals(1, converter.conversionValuesSize());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ConvertAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ConvertAnnotationTests.java
new file mode 100644
index 0000000..4cdc3e7
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ConvertAnnotationTests.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkConvertAnnotation;
+
+@SuppressWarnings("nls")
+public class ConvertAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public ConvertAnnotationTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestConvert() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CONVERT);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestConverterWithValue() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CONVERT);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Convert(value=\"myConverter\")");
+			}
+		});
+	}
+
+	public void testConvertAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestConvert();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.CONVERT));
+		
+		attributeResource.removeAnnotation(EclipseLink.CONVERT);
+		assertNull(attributeResource.getAnnotation(EclipseLink.CONVERT));
+		
+		attributeResource.addAnnotation(EclipseLink.CONVERT);
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.CONVERT));
+	}
+
+	public void testGetValue() throws Exception {
+		ICompilationUnit cu = this.createTestConverterWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkConvertAnnotation convert = (EclipseLinkConvertAnnotation) attributeResource.getAnnotation(EclipseLink.CONVERT);
+		assertEquals("myConverter", convert.getValue());
+	}
+
+	public void testSetValue() throws Exception {
+		ICompilationUnit cu = this.createTestConverterWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkConvertAnnotation convert = (EclipseLinkConvertAnnotation) attributeResource.getAnnotation(EclipseLink.CONVERT);
+		assertEquals("myConverter", convert.getValue());
+		
+		convert.setValue("Bar");
+		assertEquals("Bar", convert.getValue());
+		
+		assertSourceContains("@Convert(value=\"Bar\")", cu);
+	}
+	
+	public void testSetValueNull() throws Exception {
+		ICompilationUnit cu = this.createTestConverterWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkConvertAnnotation convert = (EclipseLinkConvertAnnotation) attributeResource.getAnnotation(EclipseLink.CONVERT);
+		assertEquals("myConverter", convert.getValue());
+		
+		convert.setValue(null);
+		assertNull(convert.getValue());
+		
+		assertSourceContains("@Convert", cu);
+		assertSourceDoesNotContain("value", cu);
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ConverterAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ConverterAnnotationTests.java
new file mode 100644
index 0000000..20b5a84
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ConverterAnnotationTests.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkConverterAnnotation;
+
+@SuppressWarnings("nls")
+public class ConverterAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public ConverterAnnotationTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Converter");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestConverterWithConverterClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Converter(converterClass=Foo.class)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestConverterWithName() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Converter(name=\"bar\")");
+			}
+		});
+	}
+
+	public void testConverterAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestConverter();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.CONVERTER));
+		
+		attributeResource.removeAnnotation(EclipseLink.CONVERTER);
+		assertNull(attributeResource.getAnnotation(EclipseLink.CONVERTER));
+		
+		attributeResource.addAnnotation(EclipseLink.CONVERTER);
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.CONVERTER));
+	}
+
+	public void testGetConverterClass() throws Exception {
+		ICompilationUnit cu = this.createTestConverterWithConverterClass();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkConverterAnnotation converter = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLink.CONVERTER);
+		assertEquals("Foo", converter.getConverterClass());
+	}
+
+	public void testSetConverterClass() throws Exception {
+		ICompilationUnit cu = this.createTestConverterWithConverterClass();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkConverterAnnotation converter = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLink.CONVERTER);
+		assertEquals("Foo", converter.getConverterClass());
+		
+		converter.setConverterClass("Bar");
+		assertEquals("Bar", converter.getConverterClass());
+		
+		assertSourceContains("@Converter(converterClass=Bar.class)", cu);
+	}
+	
+	public void testSetConverterClassNull() throws Exception {
+		ICompilationUnit cu = this.createTestConverterWithConverterClass();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkConverterAnnotation converter = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLink.CONVERTER);
+		assertEquals("Foo", converter.getConverterClass());
+		
+		converter.setConverterClass(null);
+		assertNull(converter.getConverterClass());
+		
+		assertSourceContains("@Converter", cu);
+		assertSourceDoesNotContain("converterClass", cu);
+	}
+	
+	public void testGetName() throws Exception {
+		ICompilationUnit cu = this.createTestConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkConverterAnnotation converter = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLink.CONVERTER);
+		assertEquals("bar", converter.getName());
+	}
+
+	public void testSetName() throws Exception {
+		ICompilationUnit cu = this.createTestConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkConverterAnnotation converter = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLink.CONVERTER);
+		assertEquals("bar", converter.getName());
+		
+		converter.setName("foo");
+		assertEquals("foo", converter.getName());
+		
+		assertSourceContains("@Converter(name=\"foo\")", cu);
+	}
+	
+	public void testSetNameNull() throws Exception {
+		ICompilationUnit cu = this.createTestConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkConverterAnnotation converter = (EclipseLinkConverterAnnotation) attributeResource.getAnnotation(EclipseLink.CONVERTER);
+		assertEquals("bar", converter.getName());
+		
+		converter.setName(null);
+		assertNull(converter.getName());
+		
+		assertSourceContains("@Converter", cu);
+		assertSourceDoesNotContain("name=", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/CustomizerAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/CustomizerAnnotationTests.java
new file mode 100644
index 0000000..00fe7cd
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/CustomizerAnnotationTests.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkCustomizerAnnotation;
+
+@SuppressWarnings("nls")
+public class CustomizerAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public CustomizerAnnotationTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestCustomizer() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CUSTOMIZER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Customizer");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestCustomizerWithValue() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CUSTOMIZER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Customizer(Foo.class)");
+			}
+		});
+	}
+
+	public void testCustomizerAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestCustomizer();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		
+		assertNotNull(typeResource.getAnnotation(EclipseLink.CUSTOMIZER));
+		
+		typeResource.removeAnnotation(EclipseLink.CUSTOMIZER);
+		assertNull(typeResource.getAnnotation(EclipseLink.CUSTOMIZER));
+		
+		typeResource.addAnnotation(EclipseLink.CUSTOMIZER);
+		assertNotNull(typeResource.getAnnotation(EclipseLink.CUSTOMIZER));
+	}
+
+	public void testGetConverterClass() throws Exception {
+		ICompilationUnit cu = this.createTestCustomizerWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCustomizerAnnotation converter = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLink.CUSTOMIZER);
+		assertEquals("Foo", converter.getValue());
+	}
+
+	public void testSetConverterClass() throws Exception {
+		ICompilationUnit cu = this.createTestCustomizerWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCustomizerAnnotation converter = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLink.CUSTOMIZER);
+		assertEquals("Foo", converter.getValue());
+		
+		converter.setValue("Bar");
+		assertEquals("Bar", converter.getValue());
+		
+		assertSourceContains("@Customizer(Bar.class)", cu);
+	}
+	
+	public void testSetConverterClassNull() throws Exception {
+		ICompilationUnit cu = this.createTestCustomizerWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCustomizerAnnotation converter = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLink.CUSTOMIZER);
+		assertEquals("Foo", converter.getValue());
+		
+		converter.setValue(null);
+		assertNull(converter.getValue());
+		
+		assertSourceContains("@Customizer", cu);
+		assertSourceDoesNotContain("Foo.class", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/EclipseLinkJavaResourceModelTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/EclipseLinkJavaResourceModelTestCase.java
new file mode 100644
index 0000000..3eaee19
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/EclipseLinkJavaResourceModelTestCase.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import org.eclipse.jpt.jpa.core.JpaAnnotationProvider;
+import org.eclipse.jpt.jpa.core.internal.GenericJpaAnnotationDefinitionProvider;
+import org.eclipse.jpt.jpa.core.internal.GenericJpaAnnotationProvider;
+import org.eclipse.jpt.jpa.core.tests.internal.resource.java.JpaJavaResourceModelTestCase;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.EclipseLinkJpaAnnotationDefinitionProvider;
+
+public class EclipseLinkJavaResourceModelTestCase extends JpaJavaResourceModelTestCase
+{	
+
+	public static final String ECLIPSELINK_ANNOTATIONS_PACKAGE_NAME = "org.eclipse.persistence.annotations"; //$NON-NLS-1$
+	
+	public EclipseLinkJavaResourceModelTestCase(String name) {
+		super(name);
+	}
+
+	@Override
+	protected JpaAnnotationProvider buildAnnotationProvider() {
+		return new GenericJpaAnnotationProvider(
+			GenericJpaAnnotationDefinitionProvider.instance(),
+			EclipseLinkJpaAnnotationDefinitionProvider.instance());
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/EclipseLinkPrimaryKeyAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/EclipseLinkPrimaryKeyAnnotationTests.java
new file mode 100644
index 0000000..23b26e2
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/EclipseLinkPrimaryKeyAnnotationTests.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ *  Copyright (c) 2010  Oracle. 
+ *  All rights reserved.  This program and the accompanying materials are 
+ *  made available under the terms of the Eclipse Public License v1.0 which 
+ *  accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+
+public class EclipseLinkPrimaryKeyAnnotationTests
+	extends EclipseLinkJavaResourceModelTestCase
+{
+	public EclipseLinkPrimaryKeyAnnotationTests(String name) {
+		super(name);
+	}
+	
+	
+	private ICompilationUnit createTestTypeWithPrimaryKeyAnnotation() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.PRIMARY_KEY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@PrimaryKey");
+			}
+		});
+	}
+	
+	
+	public void testAddRemoveAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestTypeWithPrimaryKeyAnnotation();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		
+		assertNotNull(typeResource.getAnnotation(EclipseLink.PRIMARY_KEY));
+		
+		typeResource.removeAnnotation(EclipseLink.PRIMARY_KEY);
+		assertNull(typeResource.getAnnotation(EclipseLink.PRIMARY_KEY));
+		
+		typeResource.addAnnotation(EclipseLink.PRIMARY_KEY);
+		assertNotNull(typeResource.getAnnotation(EclipseLink.PRIMARY_KEY));
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ExistenceCheckingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ExistenceCheckingTests.java
new file mode 100644
index 0000000..8bd2753
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ExistenceCheckingTests.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkExistenceCheckingAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.ExistenceType;
+
+@SuppressWarnings("nls")
+public class ExistenceCheckingTests extends EclipseLinkJavaResourceModelTestCase {
+
+	public ExistenceCheckingTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestExistenceChecking() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.EXISTENCE_CHECKING, EclipseLink.EXISTENCE_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@ExistenceChecking");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestExistenceCheckingWithValue() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.EXISTENCE_CHECKING, EclipseLink.EXISTENCE_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@ExistenceChecking(ExistenceType.ASSUME_EXISTENCE)");
+			}
+		});
+	}
+
+	public void testExistenceChecking() throws Exception {
+		ICompilationUnit cu = this.createTestExistenceChecking();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		
+		EclipseLinkExistenceCheckingAnnotation existenceChecking = (EclipseLinkExistenceCheckingAnnotation) typeResource.getAnnotation(EclipseLink.EXISTENCE_CHECKING);
+		assertNotNull(existenceChecking);
+	}
+
+	public void testGetValue() throws Exception {
+		ICompilationUnit cu = this.createTestExistenceCheckingWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkExistenceCheckingAnnotation existenceChecking = (EclipseLinkExistenceCheckingAnnotation) typeResource.getAnnotation(EclipseLink.EXISTENCE_CHECKING);
+		assertEquals(ExistenceType.ASSUME_EXISTENCE, existenceChecking.getValue());
+	}
+
+	public void testSetValue() throws Exception {
+		ICompilationUnit cu = this.createTestExistenceCheckingWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkExistenceCheckingAnnotation existenceChecking = (EclipseLinkExistenceCheckingAnnotation) typeResource.getAnnotation(EclipseLink.EXISTENCE_CHECKING);
+		assertEquals(ExistenceType.ASSUME_EXISTENCE, existenceChecking.getValue());
+		
+		existenceChecking.setValue(ExistenceType.ASSUME_NON_EXISTENCE);
+		assertEquals(ExistenceType.ASSUME_NON_EXISTENCE, existenceChecking.getValue());
+		
+		assertSourceContains("@ExistenceChecking(ASSUME_NON_EXISTENCE)", cu);
+		
+		existenceChecking.setValue(null);
+		assertNull(existenceChecking.getValue());
+		
+		assertSourceDoesNotContain("(ASSUME_NON_EXISTENCE)", cu);
+		assertSourceContains("@ExistenceChecking", cu);
+		assertSourceDoesNotContain("@ExistenceChecking(", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/JoinFetchTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/JoinFetchTests.java
new file mode 100644
index 0000000..87d0587
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/JoinFetchTests.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkJoinFetchAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType;
+
+@SuppressWarnings("nls")
+public class JoinFetchTests extends EclipseLinkJavaResourceModelTestCase {
+
+	public JoinFetchTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestJoinFetch() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@JoinFetch");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestJoinFetchWithValue() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@JoinFetch(JoinFetchType.OUTER)");
+			}
+		});
+	}
+
+	public void testJoinFetch() throws Exception {
+		ICompilationUnit cu = this.createTestJoinFetch();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+
+		EclipseLinkJoinFetchAnnotation joinFetch = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLink.JOIN_FETCH);
+		assertNotNull(joinFetch);
+	}
+
+	public void testGetValue() throws Exception {
+		ICompilationUnit cu = this.createTestJoinFetchWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkJoinFetchAnnotation joinFetch = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLink.JOIN_FETCH);
+		assertEquals(JoinFetchType.OUTER, joinFetch.getValue());
+	}
+
+	public void testSetValue() throws Exception {
+		ICompilationUnit cu = this.createTestJoinFetchWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkJoinFetchAnnotation joinFetch = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLink.JOIN_FETCH);
+		assertEquals(JoinFetchType.OUTER, joinFetch.getValue());
+		
+		joinFetch.setValue(JoinFetchType.INNER);
+		assertEquals(JoinFetchType.INNER, joinFetch.getValue());
+		
+		assertSourceContains("@JoinFetch(INNER)", cu);
+		
+		joinFetch.setValue(null);
+		assertNull(joinFetch.getValue());
+		
+		assertSourceDoesNotContain("(INNER)", cu);
+		assertSourceContains("@JoinFetch", cu);
+		assertSourceDoesNotContain("@JoinFetch(", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/JptEclipseLinkCoreJavaResourceModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/JptEclipseLinkCoreJavaResourceModelTests.java
new file mode 100644
index 0000000..31ddef3
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/JptEclipseLinkCoreJavaResourceModelTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class JptEclipseLinkCoreJavaResourceModelTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLinkCoreJavaResourceModelTests.class.getName());
+		suite.addTestSuite(CacheTests.class);
+		suite.addTestSuite(ChangeTrackingTests.class);
+		suite.addTestSuite(ConversionValueAnnotationTests.class);
+		suite.addTestSuite(ConvertAnnotationTests.class);
+		suite.addTestSuite(ConverterAnnotationTests.class);
+		suite.addTestSuite(CustomizerAnnotationTests.class);
+		suite.addTestSuite(ExistenceCheckingTests.class);
+		suite.addTestSuite(JoinFetchTests.class);
+		suite.addTestSuite(MutableAnnotationTests.class);
+		suite.addTestSuite(ObjectTypeConverterAnnotationTests.class);
+		suite.addTestSuite(EclipseLinkPrimaryKeyAnnotationTests.class);
+		suite.addTestSuite(PrivateOwnedTests.class);
+		suite.addTestSuite(ReadOnlyTests.class);
+		suite.addTestSuite(ReadTransformerAnnotationTests.class);
+		suite.addTestSuite(StructConverterAnnotationTests.class);
+		suite.addTestSuite(TimeOfDayTests.class);
+		suite.addTestSuite(TransformationAnnotationTests.class);
+		suite.addTestSuite(TypeConverterAnnotationTests.class);
+		suite.addTestSuite(WriteTransformerAnnotationTests.class);
+		
+		return suite;
+	}
+
+	private JptEclipseLinkCoreJavaResourceModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/MutableAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/MutableAnnotationTests.java
new file mode 100644
index 0000000..27f1bf0
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/MutableAnnotationTests.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkMutableAnnotation;
+
+@SuppressWarnings("nls")
+public class MutableAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public MutableAnnotationTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestMutable() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.MUTABLE);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Mutable");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMutableWithValue() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.MUTABLE);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Mutable(value=true)");
+			}
+		});
+	}
+	
+
+	
+	public void testMutableAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestMutable();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.MUTABLE));
+		
+		attributeResource.removeAnnotation(EclipseLink.MUTABLE);		
+		assertNull(attributeResource.getAnnotation(EclipseLink.MUTABLE));
+		
+		attributeResource.addAnnotation(EclipseLink.MUTABLE);
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.MUTABLE));
+	}
+
+	public void testGetValue() throws Exception {
+		ICompilationUnit cu = this.createTestMutableWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkMutableAnnotation mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLink.MUTABLE);
+		assertEquals(Boolean.TRUE, mutableAnnotation.getValue());
+	}
+
+	public void testSetValue() throws Exception {
+		ICompilationUnit cu = this.createTestMutableWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkMutableAnnotation mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLink.MUTABLE);
+		assertEquals(Boolean.TRUE, mutableAnnotation.getValue());
+		
+		mutableAnnotation.setValue(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, mutableAnnotation.getValue());
+		
+		assertSourceContains("@Mutable(value=false)", cu);
+		
+		mutableAnnotation.setValue(null);
+		mutableAnnotation.setValue(Boolean.FALSE);
+		assertSourceContains("@Mutable(false)", cu);
+	}
+	
+	public void testSetValueNull() throws Exception {
+		ICompilationUnit cu = this.createTestMutableWithValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkMutableAnnotation mutableAnnotation = (EclipseLinkMutableAnnotation) attributeResource.getAnnotation(EclipseLink.MUTABLE);
+		assertEquals(Boolean.TRUE, mutableAnnotation.getValue());
+		
+		mutableAnnotation.setValue(null);
+		assertNull(mutableAnnotation.getValue());
+		
+		assertSourceContains("@Mutable", cu);
+		assertSourceDoesNotContain("value", cu);
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ObjectTypeConverterAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ObjectTypeConverterAnnotationTests.java
new file mode 100644
index 0000000..4ce638b
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ObjectTypeConverterAnnotationTests.java
@@ -0,0 +1,426 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkConversionValueAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkObjectTypeConverterAnnotation;
+
+@SuppressWarnings("nls")
+public class ObjectTypeConverterAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public ObjectTypeConverterAnnotationTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestObjectTypeConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.OBJECT_TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ObjectTypeConverter");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestObjectTypeConverterWithDataType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.OBJECT_TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ObjectTypeConverter(dataType=Foo.class)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestObjectTypeConverterWithObjectType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.OBJECT_TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ObjectTypeConverter(objectType=Foo.class)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestObjectTypeConverterWithName() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.OBJECT_TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ObjectTypeConverter(name = \"bar\")");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestObjectTypeConverterWithDefaultObjectValue() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.OBJECT_TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ObjectTypeConverter(defaultObjectValue = \"f\")");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestObjectTypeConverterWithConversionValues() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.OBJECT_TYPE_CONVERTER, EclipseLink.CONVERSION_VALUE);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ObjectTypeConverter(conversionValues = {@ConversionValue(dataValue = \"F\", objectValue = \"Female\"), @ConversionValue(dataValue = \"M\", objectValue = \"Male\")})");
+			}
+		});
+	}
+
+	public void testObjectTypeConverterAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverter();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER));
+		
+		attributeResource.removeAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertNull(attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER));
+		
+		attributeResource.addAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER));
+	}
+
+	public void testGetDataType() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithDataType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("Foo", converter.getDataType());
+	}
+
+	public void testSetDataType() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithDataType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("Foo", converter.getDataType());
+		
+		converter.setDataType("Bar");
+		assertEquals("Bar", converter.getDataType());
+		
+		assertSourceContains("@ObjectTypeConverter(dataType=Bar.class)", cu);
+		
+		converter.setDataType("int");
+		assertEquals("int", converter.getDataType());
+		assertSourceContains("@ObjectTypeConverter(dataType=int.class)", cu);
+	}
+	
+	public void testSetDataTypeNull() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithDataType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("Foo", converter.getDataType());
+		
+		converter.setDataType(null);
+		assertNull(converter.getDataType());
+		
+		assertSourceContains("@ObjectTypeConverter", cu);
+		assertSourceDoesNotContain("dataType", cu);
+	}
+
+	public void testGetObjectType() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithObjectType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("Foo", converter.getObjectType());
+	}
+
+	public void testSetObjectType() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithObjectType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("Foo", converter.getObjectType());
+		
+		converter.setObjectType("Bar");
+		assertEquals("Bar", converter.getObjectType());
+		
+		assertSourceContains("@ObjectTypeConverter(objectType=Bar.class)", cu);
+		
+		converter.setObjectType("int");
+		assertEquals("int", converter.getObjectType());
+		assertSourceContains("@ObjectTypeConverter(objectType=int.class)", cu);
+	}
+	
+	public void testSetObjectTypeNull() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithObjectType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("Foo", converter.getObjectType());
+		
+		converter.setObjectType(null);
+		assertNull(converter.getObjectType());
+		
+		assertSourceContains("@ObjectTypeConverter", cu);
+		assertSourceDoesNotContain("objectType", cu);
+	}
+
+	public void testGetName() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("bar", converter.getName());
+	}
+
+	public void testSetName() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("bar", converter.getName());
+		
+		converter.setName("foo");
+		assertEquals("foo", converter.getName());
+		
+		assertSourceContains("@ObjectTypeConverter(name = \"foo\")", cu);
+	}
+	
+	public void testSetNameNull() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("bar", converter.getName());
+		
+		converter.setName(null);
+		assertNull(converter.getName());
+		
+		assertSourceContains("@ObjectTypeConverter", cu);
+		assertSourceDoesNotContain("name=", cu);
+	}
+	
+
+	public void testGetDefaultObjectValue() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithDefaultObjectValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("f", converter.getDefaultObjectValue());
+	}
+
+	public void testSetDefaultObjectValue() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithDefaultObjectValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("f", converter.getDefaultObjectValue());
+		
+		converter.setDefaultObjectValue("foo");
+		assertEquals("foo", converter.getDefaultObjectValue());
+		
+		assertSourceContains("@ObjectTypeConverter(defaultObjectValue = \"foo\")", cu);
+	}
+	
+	public void testSetDefaultObjectValueNull() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithDefaultObjectValue();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		assertEquals("f", converter.getDefaultObjectValue());
+		
+		converter.setDefaultObjectValue(null);
+		assertNull(converter.getDefaultObjectValue());
+		
+		assertSourceContains("@ObjectTypeConverter", cu);
+		assertSourceDoesNotContain("defaultObjectValue", cu);
+	}
+	
+	public void testConversionValues() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		
+		assertEquals(0, converter.conversionValuesSize());
+		assertFalse(converter.conversionValues().hasNext());
+	}
+	
+	public void testConversionValues2() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+
+		
+		converter.addConversionValue(0);
+		converter.addConversionValue(1);
+				
+		assertEquals(2, converter.conversionValuesSize());
+		ListIterator<EclipseLinkConversionValueAnnotation> conversionValues = converter.conversionValues();
+		assertTrue(conversionValues.hasNext());
+		assertNotNull(conversionValues.next());
+		assertNotNull(conversionValues.next());
+		assertFalse(conversionValues.hasNext());
+	}
+	
+	public void testConversionValues3() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithConversionValues();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+				
+		assertEquals(2, converter.conversionValuesSize());
+		ListIterator<EclipseLinkConversionValueAnnotation> conversionValues = converter.conversionValues();
+		EclipseLinkConversionValueAnnotation conversionValue = conversionValues.next();
+		assertEquals("F", conversionValue.getDataValue());
+		assertEquals("Female", conversionValue.getObjectValue());
+		conversionValue = conversionValues.next();
+		assertEquals("M", conversionValue.getDataValue());
+		assertEquals("Male", conversionValue.getObjectValue());
+		assertFalse(conversionValues.hasNext());
+	}
+	
+	public void testAddConversionValue() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		
+		converter.addConversionValue(0).setObjectValue("FOO");
+		converter.addConversionValue(1);
+		converter.addConversionValue(0).setDataValue("BAR");
+
+		assertEquals("BAR", converter.conversionValueAt(0).getDataValue());
+		assertNull(converter.conversionValueAt(0).getObjectValue());
+		assertEquals("FOO", converter.conversionValueAt(1).getObjectValue());
+		assertNull(converter.conversionValueAt(1).getDataValue());
+		assertNull(converter.conversionValueAt(2).getDataValue());
+		assertNull(converter.conversionValueAt(2).getObjectValue());
+
+		assertSourceContains("@ObjectTypeConverter(name = \"bar\", conversionValues = {@ConversionValue(dataValue = \"BAR\"),@ConversionValue(objectValue = \"FOO\"), @ConversionValue})", cu);
+	}
+	
+	public void testRemoveConversionValue() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithConversionValues();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		converter.addConversionValue(0).setObjectValue("FOO");
+		
+		Iterator<EclipseLinkConversionValueAnnotation> conversionValues = converter.conversionValues();
+		assertEquals("FOO", conversionValues.next().getObjectValue());
+		assertEquals("Female", conversionValues.next().getObjectValue());
+		assertEquals("Male", conversionValues.next().getObjectValue());
+		assertFalse(conversionValues.hasNext());
+		assertSourceContains("@ObjectTypeConverter(conversionValues = {@ConversionValue(objectValue = \"FOO\"), @ConversionValue(dataValue = \"F\", objectValue = \"Female\"), @ConversionValue(dataValue = \"M\", objectValue = \"Male\")})", cu);
+		
+		converter.removeConversionValue(1);
+		conversionValues = converter.conversionValues();
+		assertEquals("FOO", conversionValues.next().getObjectValue());
+		assertEquals("Male", conversionValues.next().getObjectValue());
+		assertFalse(conversionValues.hasNext());
+		assertSourceContains("@ObjectTypeConverter(conversionValues = {@ConversionValue(objectValue = \"FOO\"), @ConversionValue(dataValue = \"M\", objectValue = \"Male\")})", cu);
+
+		converter.removeConversionValue(0);
+		conversionValues = converter.conversionValues();
+		assertEquals("Male", conversionValues.next().getObjectValue());
+		assertFalse(conversionValues.hasNext());
+		assertSourceContains("@ObjectTypeConverter(conversionValues = @ConversionValue(dataValue = \"M\", objectValue = \"Male\"))", cu);
+
+		
+		converter.removeConversionValue(0);
+		assertSourceDoesNotContain("@conversionValues", cu);
+		assertSourceContains("@ObjectTypeConverter", cu);
+	}
+	
+	public void testMoveConversionValue() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithConversionValues();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		converter.addConversionValue(0).setObjectValue("FOO");
+		
+		assertSourceContains("@ObjectTypeConverter(conversionValues = {@ConversionValue(objectValue = \"FOO\"), @ConversionValue(dataValue = \"F\", objectValue = \"Female\"), @ConversionValue(dataValue = \"M\", objectValue = \"Male\")})", cu);
+
+		converter.moveConversionValue(2, 0);
+		assertEquals("Female", converter.conversionValueAt(0).getObjectValue());
+		assertEquals("F", converter.conversionValueAt(0).getDataValue());
+		assertEquals("Male", converter.conversionValueAt(1).getObjectValue());
+		assertEquals("M", converter.conversionValueAt(1).getDataValue());
+		assertEquals("FOO", converter.conversionValueAt(2).getObjectValue());
+		assertEquals(null, converter.conversionValueAt(2).getDataValue());
+		assertEquals(3, converter.conversionValuesSize());
+		assertSourceContains("@ObjectTypeConverter(conversionValues = {@ConversionValue(dataValue = \"F\", objectValue = \"Female\"), @ConversionValue(dataValue = \"M\", objectValue = \"Male\"), @ConversionValue(objectValue = \"FOO\")})", cu);
+	}
+	
+	public void testMoveConversionValue2() throws Exception {
+		ICompilationUnit cu = this.createTestObjectTypeConverterWithConversionValues();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkObjectTypeConverterAnnotation converter = (EclipseLinkObjectTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.OBJECT_TYPE_CONVERTER);
+		converter.addConversionValue(0).setObjectValue("FOO");
+		
+		assertSourceContains("@ObjectTypeConverter(conversionValues = {@ConversionValue(objectValue = \"FOO\"), @ConversionValue(dataValue = \"F\", objectValue = \"Female\"), @ConversionValue(dataValue = \"M\", objectValue = \"Male\")})", cu);
+
+		converter.moveConversionValue(0, 2);
+		assertEquals("Male", converter.conversionValueAt(0).getObjectValue());
+		assertEquals("M", converter.conversionValueAt(0).getDataValue());
+		assertEquals("FOO", converter.conversionValueAt(1).getObjectValue());
+		assertEquals(null, converter.conversionValueAt(1).getDataValue());
+		assertEquals("Female", converter.conversionValueAt(2).getObjectValue());
+		assertEquals("F", converter.conversionValueAt(2).getDataValue());
+		assertEquals(3, converter.conversionValuesSize());
+		assertSourceContains("@ObjectTypeConverter(conversionValues = {@ConversionValue(dataValue = \"M\", objectValue = \"Male\"), @ConversionValue(objectValue = \"FOO\"), @ConversionValue(dataValue = \"F\", objectValue = \"Female\")})", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/PrivateOwnedTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/PrivateOwnedTests.java
new file mode 100644
index 0000000..7a6d404
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/PrivateOwnedTests.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkPrivateOwnedAnnotation;
+
+@SuppressWarnings("nls")
+public class PrivateOwnedTests extends EclipseLinkJavaResourceModelTestCase {
+
+	public PrivateOwnedTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestPrivateOwned() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.PRIVATE_OWNED);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@PrivateOwned");
+			}
+		});
+	}
+	
+	public void testPrivateOwned() throws Exception {
+		ICompilationUnit cu = this.createTestPrivateOwned();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkPrivateOwnedAnnotation privateOwned = (EclipseLinkPrivateOwnedAnnotation) attributeResource.getAnnotation(EclipseLink.PRIVATE_OWNED);
+		assertNotNull(privateOwned);
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ReadOnlyTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ReadOnlyTests.java
new file mode 100644
index 0000000..2590d52
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ReadOnlyTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkReadOnlyAnnotation;
+
+@SuppressWarnings("nls")
+public class ReadOnlyTests extends EclipseLinkJavaResourceModelTestCase {
+
+	public ReadOnlyTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestReadOnly() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.READ_ONLY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@ReadOnly");
+			}
+		});
+	}
+	
+	public void testReadOnly() throws Exception {
+		ICompilationUnit cu = this.createTestReadOnly();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		
+		EclipseLinkReadOnlyAnnotation readOnly = (EclipseLinkReadOnlyAnnotation) typeResource.getAnnotation(EclipseLink.READ_ONLY);
+		assertNotNull(readOnly);
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ReadTransformerAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ReadTransformerAnnotationTests.java
new file mode 100644
index 0000000..9a6c204
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/ReadTransformerAnnotationTests.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkReadTransformerAnnotation;
+
+@SuppressWarnings("nls")
+public class ReadTransformerAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public ReadTransformerAnnotationTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestReadTransformer() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.READ_TRANSFORMER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ReadTransformer");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestReadTransformerWithTransformerClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.READ_TRANSFORMER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ReadTransformer(transformerClass=Foo.class)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestReadTransformerWithMethod() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.READ_TRANSFORMER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ReadTransformer(method=\"transformerMethod\")");
+			}
+		});
+	}
+
+	public void testReadTransformerAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestReadTransformer();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.READ_TRANSFORMER));
+		
+		attributeResource.removeAnnotation(EclipseLink.READ_TRANSFORMER)	;
+		assertNull(attributeResource.getAnnotation(EclipseLink.READ_TRANSFORMER));
+		
+		attributeResource.addAnnotation(EclipseLink.READ_TRANSFORMER);
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.READ_TRANSFORMER));
+	}
+
+	public void testGetTransformerClass() throws Exception {
+		ICompilationUnit cu = this.createTestReadTransformerWithTransformerClass();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkReadTransformerAnnotation readTransformer = (EclipseLinkReadTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.READ_TRANSFORMER);
+		assertEquals("Foo", readTransformer.getTransformerClass());
+	}
+
+	public void testSetTransformerClass() throws Exception {
+		ICompilationUnit cu = this.createTestReadTransformerWithTransformerClass();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkReadTransformerAnnotation readTransformer = (EclipseLinkReadTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.READ_TRANSFORMER);
+		assertEquals("Foo", readTransformer.getTransformerClass());
+		
+		readTransformer.setTransformerClass("Bar");
+		assertEquals("Bar", readTransformer.getTransformerClass());
+		
+		assertSourceContains("@ReadTransformer(transformerClass=Bar.class)", cu);
+	}
+	
+	public void testSetTransformerClassNull() throws Exception {
+		ICompilationUnit cu = this.createTestReadTransformerWithTransformerClass();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkReadTransformerAnnotation readTransformer = (EclipseLinkReadTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.READ_TRANSFORMER);
+		assertEquals("Foo", readTransformer.getTransformerClass());
+		
+		readTransformer.setTransformerClass(null);
+		assertNull(readTransformer.getTransformerClass());
+		
+		assertSourceContains("@ReadTransformer", cu);
+		assertSourceDoesNotContain("transformerClass", cu);
+	}
+	
+	public void testGetMethod() throws Exception {
+		ICompilationUnit cu = this.createTestReadTransformerWithMethod();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkReadTransformerAnnotation readTransformer = (EclipseLinkReadTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.READ_TRANSFORMER);
+		assertEquals("transformerMethod", readTransformer.getMethod());
+	}
+
+	public void testSetMethod() throws Exception {
+		ICompilationUnit cu = this.createTestReadTransformerWithMethod();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkReadTransformerAnnotation readTransformer = (EclipseLinkReadTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.READ_TRANSFORMER);
+		assertEquals("transformerMethod", readTransformer.getMethod());
+		
+		readTransformer.setMethod("foo");
+		assertEquals("foo", readTransformer.getMethod());
+		
+		assertSourceContains("@ReadTransformer(method=\"foo\")", cu);
+	}
+	
+	public void testSetMethodNull() throws Exception {
+		ICompilationUnit cu = this.createTestReadTransformerWithMethod();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkReadTransformerAnnotation readTransformer = (EclipseLinkReadTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.READ_TRANSFORMER);
+		assertEquals("transformerMethod", readTransformer.getMethod());
+		
+		readTransformer.setMethod(null);
+		assertNull(readTransformer.getMethod());
+		
+		assertSourceContains("@ReadTransformer", cu);
+		assertSourceDoesNotContain("method", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/StructConverterAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/StructConverterAnnotationTests.java
new file mode 100644
index 0000000..b8985fe
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/StructConverterAnnotationTests.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkStructConverterAnnotation;
+
+@SuppressWarnings("nls")
+public class StructConverterAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public StructConverterAnnotationTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestStructConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.STRUCT_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@StructConverter");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestStructConverterWithConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.STRUCT_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@StructConverter(converter=\"Foo\")");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestStructConverterWithName() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.STRUCT_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@StructConverter(name=\"bar\")");
+			}
+		});
+	}
+
+	public void testStructConverterAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestStructConverter();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.STRUCT_CONVERTER));
+		
+		attributeResource.removeAnnotation(EclipseLink.STRUCT_CONVERTER);
+		assertNull(attributeResource.getAnnotation(EclipseLink.STRUCT_CONVERTER));
+		
+		attributeResource.addAnnotation(EclipseLink.STRUCT_CONVERTER);
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.STRUCT_CONVERTER));
+	}
+
+	public void testGetConverter() throws Exception {
+		ICompilationUnit cu = this.createTestStructConverterWithConverter();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkStructConverterAnnotation converter = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLink.STRUCT_CONVERTER);
+		assertEquals("Foo", converter.getConverter());
+	}
+
+	public void testSetConverter() throws Exception {
+		ICompilationUnit cu = this.createTestStructConverterWithConverter();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkStructConverterAnnotation converter = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLink.STRUCT_CONVERTER);
+		assertEquals("Foo", converter.getConverter());
+		
+		converter.setConverter("Bar");
+		assertEquals("Bar", converter.getConverter());
+		
+		assertSourceContains("@StructConverter(converter=\"Bar\")", cu);
+	}
+	
+	public void testSetConverterNull() throws Exception {
+		ICompilationUnit cu = this.createTestStructConverterWithConverter();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkStructConverterAnnotation converter = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLink.STRUCT_CONVERTER);
+		assertEquals("Foo", converter.getConverter());
+		
+		converter.setConverter(null);
+		assertNull(converter.getConverter());
+		
+		assertSourceContains("@StructConverter", cu);
+		assertSourceDoesNotContain("converter", cu);
+	}
+	
+	public void testGetName() throws Exception {
+		ICompilationUnit cu = this.createTestStructConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkStructConverterAnnotation converter = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLink.STRUCT_CONVERTER);
+		assertEquals("bar", converter.getName());
+	}
+
+	public void testSetName() throws Exception {
+		ICompilationUnit cu = this.createTestStructConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkStructConverterAnnotation converter = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLink.STRUCT_CONVERTER);
+		assertEquals("bar", converter.getName());
+		
+		converter.setName("foo");
+		assertEquals("foo", converter.getName());
+		
+		assertSourceContains("@StructConverter(name=\"foo\")", cu);
+	}
+	
+	public void testSetNameNull() throws Exception {
+		ICompilationUnit cu = this.createTestStructConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkStructConverterAnnotation converter = (EclipseLinkStructConverterAnnotation) attributeResource.getAnnotation(EclipseLink.STRUCT_CONVERTER);
+		assertEquals("bar", converter.getName());
+		
+		converter.setName(null);
+		assertNull(converter.getName());
+		
+		assertSourceContains("@StructConverter", cu);
+		assertSourceDoesNotContain("name=", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/TimeOfDayTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/TimeOfDayTests.java
new file mode 100644
index 0000000..93d0daf
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/TimeOfDayTests.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkCacheAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkTimeOfDayAnnotation;
+
+@SuppressWarnings("nls")
+public class TimeOfDayTests extends EclipseLinkJavaResourceModelTestCase {
+
+	public TimeOfDayTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestTimeOfDay() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE, EclipseLink.TIME_OF_DAY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(expiryTimeOfDay = @TimeOfDay)");
+			}
+		});
+	}
+
+	private ICompilationUnit createTestTimeOfDayWithHour() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE, EclipseLink.TIME_OF_DAY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(expiryTimeOfDay = @TimeOfDay(hour=5))");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestTimeOfDayWithMinute() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE, EclipseLink.TIME_OF_DAY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(expiryTimeOfDay = @TimeOfDay(minute=5))");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestTimeOfDayWithSecond() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE, EclipseLink.TIME_OF_DAY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(expiryTimeOfDay = @TimeOfDay(second=5))");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestTimeOfDayWithMillisecond() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.CACHE, EclipseLink.TIME_OF_DAY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Cache(expiryTimeOfDay = @TimeOfDay(millisecond=5))");
+			}
+		});
+	}
+	
+	public void testExpiryTimeOfDay() throws Exception {
+		ICompilationUnit cu = this.createTestTimeOfDay();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		
+		assertNotNull(timeOfDay);
+	}
+	
+	public void testGetHour() throws Exception {
+		ICompilationUnit cu = this.createTestTimeOfDayWithHour();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		assertEquals(Integer.valueOf(5), timeOfDay.getHour());
+	}
+
+	public void testSetHour() throws Exception {
+		ICompilationUnit cu = this.createTestTimeOfDayWithHour();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		assertEquals(Integer.valueOf(5), timeOfDay.getHour());
+		
+		timeOfDay.setHour(Integer.valueOf(80));
+		assertEquals(Integer.valueOf(80), timeOfDay.getHour());
+		
+		assertSourceContains("@TimeOfDay(hour=80)", cu);
+		
+		timeOfDay.setHour(null);
+		assertNull(timeOfDay.getHour());
+		
+		assertSourceDoesNotContain("(hour=80)", cu);
+		assertSourceContains("@TimeOfDay", cu);
+	}
+	
+	public void testGetMinute() throws Exception {
+		ICompilationUnit cu = this.createTestTimeOfDayWithMinute();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		assertEquals(Integer.valueOf(5), timeOfDay.getMinute());
+	}
+
+	public void testSetMinute() throws Exception {
+		ICompilationUnit cu = this.createTestTimeOfDayWithMinute();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		assertEquals(Integer.valueOf(5), timeOfDay.getMinute());
+		
+		timeOfDay.setMinute(Integer.valueOf(80));
+		assertEquals(Integer.valueOf(80), timeOfDay.getMinute());
+		
+		assertSourceContains("@TimeOfDay(minute=80)", cu);
+		
+		timeOfDay.setMinute(null);
+		assertNull(timeOfDay.getMinute());
+		
+		assertSourceDoesNotContain("(minute=80)", cu);
+		assertSourceContains("@TimeOfDay", cu);
+	}
+
+	public void testGetSecond() throws Exception {
+		ICompilationUnit cu = this.createTestTimeOfDayWithSecond();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		assertEquals(Integer.valueOf(5), timeOfDay.getSecond());
+	}
+
+	public void testSetSecond() throws Exception {
+		ICompilationUnit cu = this.createTestTimeOfDayWithSecond();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		assertEquals(Integer.valueOf(5), timeOfDay.getSecond());
+		
+		timeOfDay.setSecond(Integer.valueOf(80));
+		assertEquals(Integer.valueOf(80), timeOfDay.getSecond());
+		
+		assertSourceContains("@TimeOfDay(second=80)", cu);
+		
+		timeOfDay.setSecond(null);
+		assertNull(timeOfDay.getSecond());
+		
+		assertSourceDoesNotContain("(second=80)", cu);
+		assertSourceContains("@TimeOfDay", cu);
+	}
+	
+	public void testGetMillisecond() throws Exception {
+		ICompilationUnit cu = this.createTestTimeOfDayWithMillisecond();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		assertEquals(Integer.valueOf(5), timeOfDay.getMillisecond());
+	}
+
+	public void testSetMillisecond() throws Exception {
+		ICompilationUnit cu = this.createTestTimeOfDayWithMillisecond();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		
+		EclipseLinkCacheAnnotation cache = (EclipseLinkCacheAnnotation) typeResource.getAnnotation(EclipseLink.CACHE);
+		EclipseLinkTimeOfDayAnnotation timeOfDay = cache.getExpiryTimeOfDay();
+		assertEquals(Integer.valueOf(5), timeOfDay.getMillisecond());
+		
+		timeOfDay.setMillisecond(Integer.valueOf(80));
+		assertEquals(Integer.valueOf(80), timeOfDay.getMillisecond());
+		
+		assertSourceContains("@TimeOfDay(millisecond=80)", cu);
+		
+		timeOfDay.setMillisecond(null);
+		assertNull(timeOfDay.getMillisecond());
+		
+		assertSourceDoesNotContain("(millisecond=80)", cu);
+		assertSourceContains("@TimeOfDay", cu);
+	}
+
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/TransformationAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/TransformationAnnotationTests.java
new file mode 100644
index 0000000..ccc4093
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/TransformationAnnotationTests.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.FetchType;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkTransformationAnnotation;
+
+@SuppressWarnings("nls")
+public class TransformationAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public TransformationAnnotationTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestTransformation() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.TRANSFORMATION);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Transformation");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestTransformationWithOptional() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.TRANSFORMATION);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Transformation(optional = true)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestTransformationWithFetch() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.TRANSFORMATION, JPA.FETCH_TYPE);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Transformation(fetch = FetchType.EAGER)");
+			}
+		});
+	}
+
+	public void testTransformationAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestTransformation();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.TRANSFORMATION));
+		
+		attributeResource.setPrimaryAnnotation(null, EmptyIterable.<String>instance());
+		assertNull(attributeResource.getAnnotation(EclipseLink.TRANSFORMATION));
+		
+		attributeResource.setPrimaryAnnotation(EclipseLink.TRANSFORMATION, EmptyIterable.<String>instance());
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.TRANSFORMATION));
+	}
+
+	public void testGetOptional() throws Exception {
+		ICompilationUnit cu = this.createTestTransformationWithOptional();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTransformationAnnotation transformation = (EclipseLinkTransformationAnnotation) attributeResource.getAnnotation(EclipseLink.TRANSFORMATION);
+		assertEquals(Boolean.TRUE, transformation.getOptional());
+	}
+
+	public void testSetOptional() throws Exception {
+		ICompilationUnit cu = this.createTestTransformationWithOptional();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTransformationAnnotation transformation = (EclipseLinkTransformationAnnotation) attributeResource.getAnnotation(EclipseLink.TRANSFORMATION);
+		assertEquals(Boolean.TRUE, transformation.getOptional());
+		
+		transformation.setOptional(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, transformation.getOptional());
+		
+		assertSourceContains("@Transformation(optional = false)", cu);
+	}
+	
+	public void testSetOptionalNull() throws Exception {
+		ICompilationUnit cu = this.createTestTransformationWithOptional();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTransformationAnnotation transformation = (EclipseLinkTransformationAnnotation) attributeResource.getAnnotation(EclipseLink.TRANSFORMATION);
+		assertEquals(Boolean.TRUE, transformation.getOptional());
+		
+		transformation.setOptional(null);
+		assertNull(transformation.getOptional());
+		
+		assertSourceContains("@Transformation", cu);
+		assertSourceDoesNotContain("optional", cu);
+	}
+	
+	public void testGetFetch() throws Exception {
+		ICompilationUnit cu = this.createTestTransformationWithFetch();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTransformationAnnotation transformation = (EclipseLinkTransformationAnnotation) attributeResource.getAnnotation(EclipseLink.TRANSFORMATION);
+		assertEquals(FetchType.EAGER, transformation.getFetch());
+	}
+
+	public void testSetFetch() throws Exception {
+		ICompilationUnit cu = this.createTestTransformationWithFetch();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTransformationAnnotation transformation = (EclipseLinkTransformationAnnotation) attributeResource.getAnnotation(EclipseLink.TRANSFORMATION);
+		assertEquals(FetchType.EAGER, transformation.getFetch());
+		
+		transformation.setFetch(FetchType.LAZY);
+		assertEquals(FetchType.LAZY, transformation.getFetch());
+		
+		assertSourceContains("@Transformation(fetch = LAZY)", cu);
+	}
+	
+	public void testSetFetchNull() throws Exception {
+		ICompilationUnit cu = this.createTestTransformationWithFetch();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTransformationAnnotation transformation = (EclipseLinkTransformationAnnotation) attributeResource.getAnnotation(EclipseLink.TRANSFORMATION);
+		assertEquals(FetchType.EAGER, transformation.getFetch());
+		
+		transformation.setFetch(null);
+		assertNull(transformation.getFetch());
+		
+		assertSourceContains("@Transformation", cu);
+		assertSourceDoesNotContain("fetch", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/TypeConverterAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/TypeConverterAnnotationTests.java
new file mode 100644
index 0000000..49d4ac7
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/TypeConverterAnnotationTests.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkTypeConverterAnnotation;
+
+@SuppressWarnings("nls")
+public class TypeConverterAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public TypeConverterAnnotationTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestTypeConverter() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@TypeConverter");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestTypeConverterWithDataType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@TypeConverter(dataType = Foo.class)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestTypeConverterWithObjectType() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@TypeConverter(objectType = Foo.class)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestTypeConverterWithName() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.TYPE_CONVERTER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@TypeConverter(name = \"bar\")");
+			}
+		});
+	}
+
+	public void testTypeConverterAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverter();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER));
+		
+		attributeResource.removeAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertNull(attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER));
+		
+		attributeResource.addAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER));
+	}
+
+	public void testGetTypeDataType() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverterWithDataType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTypeConverterAnnotation converter = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertEquals("Foo", converter.getDataType());
+	}
+
+	public void testSetDataType() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverterWithDataType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTypeConverterAnnotation converter = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertEquals("Foo", converter.getDataType());
+		
+		converter.setDataType("Bar");
+		assertEquals("Bar", converter.getDataType());
+		
+		assertSourceContains("@TypeConverter(dataType = Bar.class)", cu);
+		
+		converter.setDataType("int");
+		assertEquals("int", converter.getDataType());
+		assertSourceContains("@TypeConverter(dataType = int.class)", cu);
+	}
+	
+	public void testSetDataTypeNull() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverterWithDataType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTypeConverterAnnotation converter = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertEquals("Foo", converter.getDataType());
+		
+		converter.setDataType(null);
+		assertNull(converter.getDataType());
+		
+		assertSourceContains("@TypeConverter", cu);
+		assertSourceDoesNotContain("dataType", cu);
+	}
+
+	public void testGetTypeObjectType() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverterWithObjectType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTypeConverterAnnotation converter = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertEquals("Foo", converter.getObjectType());
+	}
+
+	public void testSetObjectType() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverterWithObjectType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTypeConverterAnnotation converter = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertEquals("Foo", converter.getObjectType());
+		
+		converter.setObjectType("Bar");
+		assertEquals("Bar", converter.getObjectType());
+		
+		assertSourceContains("@TypeConverter(objectType = Bar.class)", cu);
+		
+		converter.setObjectType("int");
+		assertEquals("int", converter.getObjectType());
+		assertSourceContains("@TypeConverter(objectType = int.class)", cu);
+	}
+	
+	public void testSetObjectTypeNull() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverterWithObjectType();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTypeConverterAnnotation converter = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertEquals("Foo", converter.getObjectType());
+		
+		converter.setObjectType(null);
+		assertNull(converter.getObjectType());
+		
+		assertSourceContains("@TypeConverter", cu);
+		assertSourceDoesNotContain("objectType", cu);
+	}
+
+	public void testGetName() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTypeConverterAnnotation converter = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertEquals("bar", converter.getName());
+	}
+
+	public void testSetName() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTypeConverterAnnotation converter = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertEquals("bar", converter.getName());
+		
+		converter.setName("foo");
+		assertEquals("foo", converter.getName());
+		
+		assertSourceContains("@TypeConverter(name = \"foo\")", cu);
+	}
+	
+	public void testSetNameNull() throws Exception {
+		ICompilationUnit cu = this.createTestTypeConverterWithName();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkTypeConverterAnnotation converter = (EclipseLinkTypeConverterAnnotation) attributeResource.getAnnotation(EclipseLink.TYPE_CONVERTER);
+		assertEquals("bar", converter.getName());
+		
+		converter.setName(null);
+		assertNull(converter.getName());
+		
+		assertSourceContains("@TypeConverter", cu);
+		assertSourceDoesNotContain("name=", cu);
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/WriteTransformerAnnotationTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/WriteTransformerAnnotationTests.java
new file mode 100644
index 0000000..442bbe8
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/resource/java/WriteTransformerAnnotationTests.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.resource.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkWriteTransformerAnnotation;
+
+@SuppressWarnings("nls")
+public class WriteTransformerAnnotationTests extends EclipseLinkJavaResourceModelTestCase {
+	
+	public WriteTransformerAnnotationTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestWriteTransformer() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.WRITE_TRANSFORMER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@WriteTransformer");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestWriteTransformerWithTransformerClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.WRITE_TRANSFORMER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@WriteTransformer(transformerClass = Foo.class)");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestWriteTransformerWithMethod() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.WRITE_TRANSFORMER);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@WriteTransformer(method = \"transformerMethod\")");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestWriteTransformerWithColumn() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(EclipseLink.WRITE_TRANSFORMER, JPA.COLUMN);
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@WriteTransformer(column = @Column(name = \"FOO\"))");
+			}
+		});
+	}
+
+
+	public void testWriteTransformerAnnotation() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformer();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu); 
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER));
+		
+		attributeResource.removeAnnotation(EclipseLink.WRITE_TRANSFORMER)	;
+		assertNull(attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER));
+		
+		attributeResource.addAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertNotNull(attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER));
+	}
+
+	public void testGetTransformerClass() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformerWithTransformerClass();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkWriteTransformerAnnotation writeTransformer = (EclipseLinkWriteTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertEquals("Foo", writeTransformer.getTransformerClass());
+	}
+
+	public void testSetTransformerClass() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformerWithTransformerClass();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkWriteTransformerAnnotation writeTransformer = (EclipseLinkWriteTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertEquals("Foo", writeTransformer.getTransformerClass());
+		
+		writeTransformer.setTransformerClass("Bar");
+		assertEquals("Bar", writeTransformer.getTransformerClass());
+		
+		assertSourceContains("@WriteTransformer(transformerClass = Bar.class)", cu);
+	}
+	
+	public void testSetTransformerClassNull() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformerWithTransformerClass();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkWriteTransformerAnnotation writeTransformer = (EclipseLinkWriteTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertEquals("Foo", writeTransformer.getTransformerClass());
+		
+		writeTransformer.setTransformerClass(null);
+		assertNull(writeTransformer.getTransformerClass());
+		
+		assertSourceContains("@WriteTransformer", cu);
+		assertSourceDoesNotContain("transformerClass", cu);
+	}
+	
+	public void testGetMethod() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformerWithMethod();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkWriteTransformerAnnotation writeTransformer = (EclipseLinkWriteTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertEquals("transformerMethod", writeTransformer.getMethod());
+	}
+
+	public void testSetMethod() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformerWithMethod();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkWriteTransformerAnnotation writeTransformer = (EclipseLinkWriteTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertEquals("transformerMethod", writeTransformer.getMethod());
+		
+		writeTransformer.setMethod("foo");
+		assertEquals("foo", writeTransformer.getMethod());
+		
+		assertSourceContains("@WriteTransformer(method = \"foo\")", cu);
+	}
+	
+	public void testSetMethodNull() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformerWithMethod();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkWriteTransformerAnnotation writeTransformer = (EclipseLinkWriteTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertEquals("transformerMethod", writeTransformer.getMethod());
+		
+		writeTransformer.setMethod(null);
+		assertNull(writeTransformer.getMethod());
+		
+		assertSourceContains("@WriteTransformer", cu);
+		assertSourceDoesNotContain("method", cu);
+	}
+	
+	
+	public void testGetColumn() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformerWithColumn();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkWriteTransformerAnnotation writeTransformer = (EclipseLinkWriteTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertNotNull(writeTransformer.getColumn());
+		assertEquals("FOO", writeTransformer.getColumn().getName());
+	}
+
+	public void testAddColumn() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformerWithMethod();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkWriteTransformerAnnotation writeTransformer = (EclipseLinkWriteTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertNull(writeTransformer.getColumn());
+		
+		writeTransformer.addColumn();
+		
+		assertNotNull(writeTransformer.getColumn());		
+		assertSourceContains("@WriteTransformer(method = \"transformerMethod\", column = @Column)", cu);
+		
+		writeTransformer.getColumn().setName("BAR");
+		assertSourceContains("@WriteTransformer(method = \"transformerMethod\", column = @Column(name = \"BAR\"))", cu);
+		
+	}
+	
+	public void testRemoveColumn() throws Exception {
+		ICompilationUnit cu = this.createTestWriteTransformerWithColumn();
+		JavaResourcePersistentType typeResource = buildJavaTypeResource(cu);
+		JavaResourcePersistentAttribute attributeResource = typeResource.fields().next();
+		
+		EclipseLinkWriteTransformerAnnotation writeTransformer = (EclipseLinkWriteTransformerAnnotation) attributeResource.getAnnotation(EclipseLink.WRITE_TRANSFORMER);
+		assertNotNull(writeTransformer.getColumn());
+		assertEquals("FOO", writeTransformer.getColumn().getName());
+		
+		writeTransformer.removeColumn();
+		assertNull(writeTransformer.getColumn());
+		
+		assertSourceContains("@WriteTransformer", cu);
+		assertSourceDoesNotContain("column", cu);
+	}
+	
+	public void getNonNullColumn() throws Exception {
+
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/EclipseLink1_1ContextModelTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/EclipseLink1_1ContextModelTestCase.java
new file mode 100644
index 0000000..dda1601
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/EclipseLink1_1ContextModelTestCase.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ *  Copyright (c) 2009, 2010  Oracle. 
+ *  All rights reserved.  This program and the accompanying materials are 
+ *  made available under the terms of the Eclipse Public License v1.0 which 
+ *  accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context;
+
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.platform.EclipseLinkPlatform;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public abstract class EclipseLink1_1ContextModelTestCase extends EclipseLinkContextModelTestCase
+{
+	public static final String JPA_ANNOTATIONS_PACKAGE_NAME = "javax.persistence"; //$NON-NLS-1$
+
+	protected EclipseLink1_1ContextModelTestCase(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.PLATFORM, EclipseLinkPlatform.VERSION_1_1);
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.CREATE_ORM_XML, Boolean.TRUE);
+		return dataModel;
+	}	
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/EclipseLink1_1JpaProjectTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/EclipseLink1_1JpaProjectTests.java
new file mode 100644
index 0000000..d01ac71
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/EclipseLink1_1JpaProjectTests.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.internal.operations.JpaFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.eclipselink.core.JptJpaEclipseLinkCorePlugin;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v1_1.EclipseLink1_1;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("nls")
+public class EclipseLink1_1JpaProjectTests extends EclipseLink1_1ContextModelTestCase
+{
+	
+	public EclipseLink1_1JpaProjectTests(String name) {
+		super(name);
+	}
+	
+	public void testGetDefaultOrmXmlResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaCorePlugin.ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());	
+		
+		//delete the orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNull(resource);
+		
+		//add the orm.xml file with eclipselink 1.1 orm content type
+		createDefaultOrmXmlFileWithEclipseLink1_1ContentType();
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_1_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		
+		//delete the orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNull(resource);
+		
+		
+		//add the orm.xml file with eclipselink orm content type
+		createDefaultOrmXmlFileWithEclipseLinkContentType();
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		
+		//delete the orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNull(resource);
+		
+		
+		//add the orm.xml file this time with orm content type
+		createDefaultOrmXmlFile();
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaCorePlugin.ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());
+	}
+	
+	public void testGetDefaultEclipseLinkOrmXmlResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+		assertNull(resource);
+		
+		//add the eclipselink-orm.xml 1.1 file
+		createDefaultEclipseLink1_1OrmXmlFile();
+		resource = this.getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_1_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/eclipselink-orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		
+		//delete the eclipselink-orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+		assertNull(resource);
+	}
+	
+	private void createDefaultOrmXmlFile() throws Exception {
+		IDataModel config =
+			DataModelFactory.createDataModel(new OrmFileCreationDataModelProvider());
+		config.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				getJpaProject().getProject().getFolder("src/META-INF").getFullPath());
+		config.getDefaultOperation().execute(null, null);
+	}
+	
+	private void createDefaultOrmXmlFileWithEclipseLinkContentType() throws Exception {
+		IDataModel config =
+			DataModelFactory.createDataModel(new EclipseLinkOrmFileCreationDataModelProvider());
+		config.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				getJpaProject().getProject().getFolder("src/META-INF").getFullPath());
+		config.setProperty(JptFileCreationDataModelProperties.FILE_NAME, 
+				JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.lastSegment());
+		config.getDefaultOperation().execute(null, null);
+	}
+	
+	private void createDefaultOrmXmlFileWithEclipseLink1_1ContentType() throws Exception {
+		createEclipseLink1_1OrmXmlFile(JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.lastSegment());
+	}
+	
+	private void createDefaultEclipseLink1_1OrmXmlFile() throws Exception {
+		createEclipseLink1_1OrmXmlFile(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH.lastSegment());
+	}
+	
+	private void createEclipseLink1_1OrmXmlFile(String fileName) throws Exception {
+		IDataModel config =
+			DataModelFactory.createDataModel(new EclipseLinkOrmFileCreationDataModelProvider());
+		config.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				getJpaProject().getProject().getFolder("src/META-INF").getFullPath());
+		config.setProperty(JptFileCreationDataModelProperties.FILE_NAME, fileName);
+		config.setProperty(JpaFileCreationDataModelProperties.VERSION, EclipseLink1_1.SCHEMA_VERSION);
+		config.getDefaultOperation().execute(null, null);
+	}
+
+	public void testGetMappingFileResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getMappingFileXmlResource(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH);
+		assertNull(resource);
+		
+		//add the eclipselink-orm.xml 1.1 file
+		createDefaultEclipseLink1_1OrmXmlFile();
+		resource = this.getJpaProject().getMappingFileXmlResource(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH);
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_1_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/eclipselink-orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		//delete the eclipselink-orm.xml file and verify it is not returned from getMappingFileResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getMappingFileXmlResource(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH);
+		assertNull(resource);
+	}
+	
+	public void testGetDifferentlyNamedMappingFileResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNull(resource);
+
+		//create the orm2.xml file
+		createEclipseLink1_1OrmXmlFile("orm2.xml");
+		resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_1_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/orm2.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		//delete the orm2.xml file and verify it is not returned from getMappingFileResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNull(resource);
+		
+		//add the orm2.xml file back
+		createEclipseLink1_1OrmXmlFile("orm2.xml");
+		resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_1_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/orm2.xml", resource.getFile().getProjectRelativePath().toString());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/JptEclipseLink1_1CoreContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/JptEclipseLink1_1CoreContextModelTests.java
new file mode 100644
index 0000000..58f761b
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/JptEclipseLink1_1CoreContextModelTests.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ *  Copyright (c) 2007, 2009 Oracle. 
+ *  All rights reserved.  This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context.orm.JptEclipseLink1_1CoreOrmContextModelTests;
+
+public class JptEclipseLink1_1CoreContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLink1_1CoreContextModelTests.class.getName());
+		suite.addTestSuite(EclipseLink1_1JpaProjectTests.class);
+		suite.addTest(JptEclipseLink1_1CoreOrmContextModelTests.suite());
+		return suite;
+	}
+
+	private JptEclipseLink1_1CoreContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmContextModelTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmContextModelTestCase.java
new file mode 100644
index 0000000..6d57e68
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmContextModelTestCase.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context.orm;
+
+import org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.JpaFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.core.tests.internal.projects.TestJpaProject;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkEntityMappings;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationOperation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntityMappings;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v1_1.EclipseLink1_1;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context.EclipseLink1_1ContextModelTestCase;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("nls")
+public abstract class EclipseLink1_1OrmContextModelTestCase
+	extends EclipseLink1_1ContextModelTestCase
+{
+	protected JpaXmlResource eclipseLink1_1OrmXmlResource;
+	
+	
+	protected EclipseLink1_1OrmContextModelTestCase(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.eclipseLink1_1OrmXmlResource = getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+	}
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		// don't create default orm.xml - instead build eclipselink-orm.xml
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.CREATE_ORM_XML, Boolean.FALSE);
+		return dataModel;
+	}
+	
+	@Override
+	protected TestJpaProject buildJpaProject(String projectName, boolean autoBuild, IDataModel jpaConfig) throws Exception {
+		TestJpaProject testJpaProject = super.buildJpaProject(projectName, autoBuild, jpaConfig);
+		
+		EclipseLinkOrmFileCreationOperation operation = 
+			new EclipseLinkOrmFileCreationOperation(buildEclipseLinkOrmConfig(testJpaProject));
+		operation.execute(null, null);
+		
+		return testJpaProject;
+	}
+	
+	protected IDataModel buildEclipseLinkOrmConfig(TestJpaProject testJpaProject) {
+		IDataModel dataModel = 
+			DataModelFactory.createDataModel(new EclipseLinkOrmFileCreationDataModelProvider());		
+		dataModel.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				testJpaProject.getProject().getFolder("src/META-INF").getFullPath());
+		dataModel.setProperty(JpaFileCreationDataModelProperties.VERSION, EclipseLink1_1.SCHEMA_VERSION);
+		dataModel.setProperty(OrmFileCreationDataModelProperties.ADD_TO_PERSISTENCE_UNIT, Boolean.TRUE);
+		return dataModel;
+	}
+	
+	@Override
+	protected void tearDown() throws Exception {
+		this.eclipseLink1_1OrmXmlResource = null;
+		super.tearDown();
+	}
+	
+	@Override
+	protected JpaXmlResource getOrmXmlResource() {
+		return this.eclipseLink1_1OrmXmlResource;
+	}
+	
+	@Override
+	protected XmlEntityMappings getXmlEntityMappings() {
+		return (XmlEntityMappings) super.getXmlEntityMappings();
+	}
+	
+	@Override
+	protected EclipseLinkEntityMappings getEntityMappings() {
+		return (EclipseLinkEntityMappings) super.getEntityMappings();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmPersistentAttributeTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmPersistentAttributeTests.java
new file mode 100644
index 0000000..a4dd7b7
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmPersistentAttributeTests.java
@@ -0,0 +1,430 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AccessType;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkIdMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkOneToOneMapping;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("nls")
+public class EclipseLink1_1OrmPersistentAttributeTests 
+	extends EclipseLink1_1OrmContextModelTestCase
+{
+	public EclipseLink1_1OrmPersistentAttributeTests(String name) {
+		super(name);
+	}
+	
+	
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		// create both orm.xml and eclipselink-orm.xml
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.CREATE_ORM_XML, Boolean.TRUE);
+		return dataModel;
+	}	
+	
+	private ICompilationUnit createTestTypeNullAttributeMapping() throws Exception {
+	
+		return this.createTestType(new DefaultAnnotationWriter() {			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);			
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityIdMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, JPA.COLUMN);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Id");
+				sb.append("@Column(name=\"FOO\")");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityIdMappingPropertyAccess() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, JPA.COLUMN);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			@Override
+			public void appendGetIdMethodAnnotationTo(StringBuilder sb) {
+				sb.append("@Id");
+				sb.append("@Column(name=\"FOO\")");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityOneToOneMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToOne");
+				sb.append("    private Address address;");
+			}
+		});
+	}
+	
+	public void testMakeSpecified() throws Exception {
+		createTestType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		assertEquals("id", ormPersistentAttribute.getName());
+		assertTrue(ormPersistentAttribute.isVirtual());
+		ormPersistentAttribute.convertToSpecified();
+		
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		OrmPersistentAttribute specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		assertEquals("id", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		
+		ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ormPersistentAttribute.convertToSpecified();
+		
+		assertEquals(0, ormPersistentType.virtualAttributesSize());
+		assertEquals(2, ormPersistentType.specifiedAttributesSize());
+		Iterator<OrmPersistentAttribute> specifiedAttributes = ormPersistentType.specifiedAttributes();
+		specifiedOrmPersistentAttribute = specifiedAttributes.next();
+		assertEquals("id", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		
+		specifiedOrmPersistentAttribute = specifiedAttributes.next();
+		assertEquals("name", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+	}
+
+	public void testMakeSpecifiedMappingKey() throws Exception {
+		createTestTypeNullAttributeMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		assertEquals(3, ormPersistentType.virtualAttributesSize());
+		
+		//take a virtual mapping with a mapping type and make it specified
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		assertEquals("address", ormPersistentAttribute.getName());
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertNull(ormPersistentAttribute.getMapping().getKey());
+		ormPersistentAttribute.convertToSpecified(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		OrmPersistentAttribute specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		assertEquals("address", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		assertTrue(specifiedOrmPersistentAttribute.getMapping() instanceof OrmEclipseLinkOneToOneMapping);
+		
+		
+		ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ormPersistentAttribute.convertToSpecified(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY);
+		
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(2, ormPersistentType.specifiedAttributesSize());
+		Iterator<OrmPersistentAttribute> specifiedAttributes = ormPersistentType.specifiedAttributes();
+		
+		specifiedOrmPersistentAttribute = specifiedAttributes.next();
+		assertEquals("id", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		assertTrue(specifiedOrmPersistentAttribute.getMapping() instanceof OrmEclipseLinkIdMapping);
+		
+		specifiedOrmPersistentAttribute = specifiedAttributes.next();
+		assertEquals("address", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+	}
+	
+	public void testMakeVirtual() throws Exception {
+		createTestType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		
+		ormPersistentType.virtualAttributes().next().convertToSpecified();
+		ormPersistentType.virtualAttributes().next().convertToSpecified();
+
+		assertEquals(0, ormPersistentType.virtualAttributesSize());
+		assertEquals(2, ormPersistentType.specifiedAttributesSize());
+		OrmPersistentAttribute specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		assertEquals("id", specifiedOrmPersistentAttribute.getName());
+		assertFalse(specifiedOrmPersistentAttribute.isVirtual());
+		
+		specifiedOrmPersistentAttribute.convertToVirtual();
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		
+		specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		specifiedOrmPersistentAttribute.convertToVirtual();
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		assertEquals(0, ormPersistentType.specifiedAttributesSize());
+		
+		Iterator<OrmReadOnlyPersistentAttribute> virtualAttributes = ormPersistentType.virtualAttributes();
+		OrmReadOnlyPersistentAttribute virtualAttribute = virtualAttributes.next();		
+		assertEquals("id", virtualAttribute.getName());
+		virtualAttribute = virtualAttributes.next();		
+		assertEquals("name", virtualAttribute.getName());
+	}
+	
+	public void testMakeVirtualNoUnderlyingJavaAttribute() throws Exception {
+		createTestType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		
+		ormPersistentType.virtualAttributes().next().convertToSpecified();
+		ormPersistentType.virtualAttributes().next().convertToSpecified();
+
+		
+		ormPersistentType.specifiedAttributes().next().getMapping().setName("noJavaAttribute");
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(2, ormPersistentType.specifiedAttributesSize());
+		
+		
+		OrmPersistentAttribute specifiedOrmPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		specifiedOrmPersistentAttribute.convertToVirtual();
+		assertEquals(1, ormPersistentType.virtualAttributesSize());
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		
+		assertEquals("id", ormPersistentType.virtualAttributes().next().getName());
+		assertEquals("name", ormPersistentType.specifiedAttributes().next().getName());
+	}
+	
+	public void testVirtualMappingTypeWhenMetadataComplete()  throws Exception {
+		createTestEntityIdMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		assertEquals("id", ormPersistentAttribute.getName());
+		assertEquals(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+		assertEquals("FOO", ((IdMapping) ormPersistentAttribute.getMapping()).getColumn().getName());
+		
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertEquals("id", ormPersistentAttribute.getName());
+		assertEquals(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+		assertEquals("id", ((BasicMapping) ormPersistentAttribute.getMapping()).getColumn().getName());
+	}
+	
+	public void testVirtualMappingTypeWhenMetadataComplete2()  throws Exception {
+		createTestEntityOneToOneMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		assertEquals("address", ormPersistentAttribute.getName());
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+		
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+		assertEquals("address", ormPersistentAttribute.getName());
+		assertEquals(MappingKeys.NULL_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+	}
+	
+	public void testGetJavaPersistentAttribute() throws Exception {
+		createTestEntityIdMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaPersistentType javaPersistentType = ormPersistentType.getJavaPersistentType();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		JavaPersistentAttribute javaPersistentAttribute = javaPersistentType.getAttributeNamed("id");
+			
+		//virtual orm attribute, access type matches java : FIELD, name matches java
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertNotSame(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+		JavaResourcePersistentAttribute javaResourcePersistentAttribute = ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute();
+		assertTrue(javaResourcePersistentAttribute.isField());
+		assertEquals("id", javaResourcePersistentAttribute.getName());
+		assertEquals(javaPersistentType.getResourcePersistentType().persistableFields().next(), javaResourcePersistentAttribute);
+		
+		
+		//specified orm attribute, access type matches java : FIELD, name matches java
+		//javaPersistentAttribute should be == to java context model object
+		ormPersistentAttribute.convertToSpecified();
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertFalse(ormPersistentAttribute.isVirtual());
+		assertEquals(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+	
+		
+		//virtual orm attribute, java access type FIELD, orm access type PROPERTY, name matches java
+		//verify the property java resource persistent attribute is used in orm.
+		((OrmPersistentAttribute) ormPersistentAttribute).convertToVirtual();
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");		
+		ormPersistentType.setSpecifiedAccess(AccessType.PROPERTY);
+		assertNotSame(ormPersistentAttribute, ormPersistentType.getAttributeNamed("id"));
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertNotSame(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+		javaResourcePersistentAttribute = ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute();
+		assertTrue(javaResourcePersistentAttribute.isProperty());
+		assertEquals("id", javaResourcePersistentAttribute.getName());
+		assertEquals(javaPersistentType.getResourcePersistentType().persistableProperties().next(), javaResourcePersistentAttribute);
+		
+		
+		ormPersistentType.setSpecifiedAccess(null);//default access will be field
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");		
+		OrmPersistentAttribute ormPersistentAttribute2 = ormPersistentAttribute.convertToSpecified();
+		ormPersistentAttribute2.getMapping().setName("id2");
+		assertEquals(null, ormPersistentAttribute2.getJavaPersistentAttribute());
+		
+		ormPersistentAttribute2.getMapping().setName(null);
+		assertEquals(null, ormPersistentAttribute2.getJavaPersistentAttribute());
+
+		ormPersistentAttribute2.getMapping().setName("id");
+		assertEquals(javaPersistentAttribute, ormPersistentAttribute2.getJavaPersistentAttribute());
+
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(javaPersistentAttribute, ormPersistentAttribute2.getJavaPersistentAttribute());
+	}
+	
+	public void testGetJavaPersistentAttributeMixedAccess() throws Exception {
+		createTestEntityIdMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		ormPersistentType.setSpecifiedAccess(AccessType.PROPERTY);
+		JavaPersistentType javaPersistentType = ormPersistentType.getJavaPersistentType();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		JavaPersistentAttribute javaPersistentAttribute = javaPersistentType.getAttributeNamed("id");
+		
+		assertEquals(AccessType.PROPERTY, ormPersistentAttribute.getAccess());
+		assertEquals(AccessType.FIELD, javaPersistentAttribute.getOwningPersistentType().getAccess());
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertNotSame(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+		assertEquals(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+		assertEquals(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY, javaPersistentAttribute.getMappingKey());
+		
+		
+		ormPersistentAttribute.convertToSpecified();
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertFalse(ormPersistentAttribute.isVirtual());
+		assertEquals(AccessType.PROPERTY, ormPersistentAttribute.getAccess());
+		assertNotSame(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+		assertTrue(ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute().isProperty());
+		assertTrue(javaPersistentAttribute.getResourcePersistentAttribute().isField());
+		
+		((OrmPersistentAttribute) ormPersistentAttribute).setSpecifiedAccess(AccessType.FIELD);
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertFalse(ormPersistentAttribute.isVirtual());
+		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+		assertEquals(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+		assertTrue(ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute().isField());
+		assertTrue(javaPersistentAttribute.getResourcePersistentAttribute().isField());
+	}
+	
+	public void testGetAccess() throws Exception {
+		createTestEntityIdMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaPersistentType javaPersistentType = ormPersistentType.getJavaPersistentType();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		JavaPersistentAttribute javaPersistentAttribute = javaPersistentType.getAttributeNamed("id");
+		
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+		assertTrue(ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute().isField());
+		assertEquals(AccessType.FIELD, javaPersistentAttribute.getAccess());
+		assertTrue(javaPersistentAttribute.getResourcePersistentAttribute().isField());
+		
+		
+		ormPersistentAttribute.convertToSpecified();
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertFalse(ormPersistentAttribute.isVirtual());
+		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+		assertTrue(ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute().isField());
+		assertEquals(AccessType.FIELD, javaPersistentAttribute.getAccess());
+		assertTrue(javaPersistentAttribute.getResourcePersistentAttribute().isField());
+		
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertFalse(ormPersistentAttribute.isVirtual());
+		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+		assertEquals(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+		assertEquals(AccessType.FIELD, ormPersistentAttribute.getJavaPersistentAttribute().getAccess());
+		assertEquals(AccessType.FIELD, javaPersistentAttribute.getAccess());
+		assertTrue(javaPersistentAttribute.getResourcePersistentAttribute().isField());
+	}
+	
+	public void testGetAccessPropertyInJava() throws Exception {
+		createTestEntityIdMappingPropertyAccess();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaPersistentType javaPersistentType = ormPersistentType.getJavaPersistentType();
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		JavaPersistentAttribute javaPersistentAttribute = javaPersistentType.getAttributeNamed("id");
+		
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertEquals(AccessType.PROPERTY, ormPersistentAttribute.getAccess());
+		assertTrue(ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute().isProperty());
+		assertEquals(AccessType.PROPERTY, javaPersistentAttribute.getAccess());
+		assertTrue(javaPersistentAttribute.getResourcePersistentAttribute().isProperty());
+		
+		
+		ormPersistentAttribute.convertToSpecified();
+		ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertFalse(ormPersistentAttribute.isVirtual());
+		assertEquals(AccessType.PROPERTY, ormPersistentAttribute.getAccess());
+		assertTrue(ormPersistentAttribute.getJavaPersistentAttribute().getResourcePersistentAttribute().isProperty());
+		assertEquals(AccessType.PROPERTY, javaPersistentAttribute.getAccess());
+		assertTrue(javaPersistentAttribute.getResourcePersistentAttribute().isProperty());
+		
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertFalse(ormPersistentAttribute.isVirtual());
+		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+		assertNotSame(javaPersistentAttribute, ormPersistentAttribute.getJavaPersistentAttribute());
+		assertEquals(AccessType.FIELD, ormPersistentAttribute.getJavaPersistentAttribute().getAccess());
+		assertEquals(AccessType.PROPERTY, javaPersistentAttribute.getAccess());
+		assertTrue(javaPersistentAttribute.getResourcePersistentAttribute().isProperty());
+	}
+
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmPersistentTypeTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmPersistentTypeTests.java
new file mode 100644
index 0000000..77a1f17
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmPersistentTypeTests.java
@@ -0,0 +1,302 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AccessType;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("nls")
+public class EclipseLink1_1OrmPersistentTypeTests extends EclipseLink1_1OrmContextModelTestCase
+{
+	public EclipseLink1_1OrmPersistentTypeTests(String name) {
+		super(name);
+	}
+	
+	
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		// create both orm.xml and eclipselink-orm.xml
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.CREATE_ORM_XML, Boolean.TRUE);
+		return dataModel;
+	}
+	
+	private ICompilationUnit createTestEntityIdMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, JPA.COLUMN);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Id");
+				sb.append("@Column(name=\"FOO\")");
+			}
+		});
+	}
+//	
+//	private void createAccessTypeEnum() throws Exception {
+//		this.createEnumAndMembers(JPA_ANNOTATIONS_PACKAGE_NAME, "AccessType", "FIELD, PROPERTY;");	
+//	}
+//	
+//	private void createAccessAnnotation() throws Exception {
+//		this.createAnnotationAndMembers(JPA_ANNOTATIONS_PACKAGE_NAME, "Access", "AccessType value();");
+//		createAccessTypeEnum();
+//	}
+//	
+//	private ICompilationUnit createTestEntityAnnotatedFieldPropertySpecified() throws Exception {
+//		createAccessAnnotation();
+//		return this.createTestType(new DefaultAnnotationWriter() {
+//			@Override
+//			public Iterator<String> imports() {
+//				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC, JPA.ID, JPA.ACCESS, JPA.ACCESS_TYPE);
+//			}
+//			@Override
+//			public void appendTypeAnnotationTo(StringBuilder sb) {
+//				sb.append("@Entity");
+//				sb.append("@Access(AccessType.PROPERTY)");
+//			}
+//	
+//			@Override
+//			public void appendNameFieldAnnotationTo(StringBuilder sb) {
+//				sb.append("@Basic");
+//				sb.append("@Access(AccessType.FIELD)");
+//			}
+//			
+//			@Override
+//			public void appendGetIdMethodAnnotationTo(StringBuilder sb) {
+//				sb.append("@Id");
+//			}
+//		});
+//	}
+//	
+//	private ICompilationUnit createTestEntityFieldSpecifiedPropertyAnnotated() throws Exception {
+//		createAccessAnnotation();
+//		return this.createTestType(new DefaultAnnotationWriter() {
+//			@Override
+//			public Iterator<String> imports() {
+//				return new ArrayIterator<String>(JPA.ENTITY, JPA.BASIC, JPA.ID, JPA.ACCESS, JPA.ACCESS_TYPE);
+//			}
+//			@Override
+//			public void appendTypeAnnotationTo(StringBuilder sb) {
+//				sb.append("@Entity");
+//				sb.append("@Access(AccessType.FIELD)");
+//			}
+//			
+//			@Override
+//			public void appendGetIdMethodAnnotationTo(StringBuilder sb) {
+//				sb.append("@Id");
+//				sb.append("@Access(AccessType.PROPERTY)");
+//			}
+//		});
+//	}
+//
+//	private ICompilationUnit createTestEntityPropertySpecified() throws Exception {
+//		createAccessAnnotation();
+//		return this.createTestType(new DefaultAnnotationWriter() {
+//			@Override
+//			public Iterator<String> imports() {
+//				return new ArrayIterator<String>(JPA.ENTITY, JPA.ACCESS, JPA.ACCESS_TYPE);
+//			}
+//			@Override
+//			public void appendTypeAnnotationTo(StringBuilder sb) {
+//				sb.append("@Entity");
+//				sb.append("@Access(AccessType.PROPERTY)");
+//			}
+//		});
+//	}
+
+	public void testGetAccessWithJavaAnnotations() throws Exception {
+		createTestEntityIdMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaPersistentType javaPersistentType = ormPersistentType.getJavaPersistentType();
+		
+		assertEquals(AccessType.FIELD, ormPersistentType.getAccess());
+		assertEquals(AccessType.FIELD, javaPersistentType.getAccess());
+		assertEquals(null, javaPersistentType.getSpecifiedAccess());
+		
+		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+		ormPersistentAttribute.convertToSpecified();
+		assertEquals(AccessType.FIELD, ormPersistentType.getAccess());
+		assertEquals(AccessType.FIELD, javaPersistentType.getAccess());
+		assertEquals(null, javaPersistentType.getSpecifiedAccess());
+		
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(AccessType.FIELD, ormPersistentType.getAccess());
+		assertEquals(AccessType.FIELD, javaPersistentType.getAccess());
+	}
+
+//TODO Access annotation test	
+//	public void testGetAccessWithJavaAnnotationsProperty() throws Exception {
+//		createTestEntityAnnotatedFieldPropertySpecified();
+//		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+//		JavaPersistentType javaPersistentType = ormPersistentType.getJavaPersistentType();
+//		
+//		assertEquals(AccessType.PROPERTY, ormPersistentType.getAccess());
+//		assertEquals(AccessType.PROPERTY, javaPersistentType.getAccess());
+//		assertEquals(AccessType.PROPERTY, javaPersistentType.getSpecifiedAccess());
+//		
+//		
+//		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("id");
+//		ormPersistentAttribute.makeSpecified();
+//		assertEquals(AccessType.PROPERTY, ormPersistentType.getAccess());
+//		assertEquals(AccessType.PROPERTY, javaPersistentType.getAccess());
+//		assertEquals(AccessType.PROPERTY, javaPersistentType.getSpecifiedAccess());
+//		
+//		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+//		assertEquals(AccessType.FIELD, ormPersistentType.getAccess());
+//		assertEquals(AccessType.PROPERTY, javaPersistentType.getAccess());
+//	}
+//	
+//	public void testVirtualAttributes() throws Exception {
+//		createTestEntityAnnotatedFieldPropertySpecified();
+//		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+//		
+//		ListIterator<OrmPersistentAttribute> virtualAttributes = ormPersistentType.virtualAttributes();
+//		OrmPersistentAttribute ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("id", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.PROPERTY, ormPersistentAttribute.getAccess());
+//		
+//		
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("name", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//		
+//		assertFalse(virtualAttributes.hasNext());
+//		
+//		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+//		virtualAttributes = ormPersistentType.virtualAttributes();
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("id", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//		
+//		
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("name", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//		
+//		assertFalse(virtualAttributes.hasNext());
+//	}
+//	
+//	public void testVirtualAttributes2() throws Exception {
+//		createTestEntityPropertySpecified();
+//		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+//		
+//		ListIterator<OrmPersistentAttribute> virtualAttributes = ormPersistentType.virtualAttributes();
+//		OrmPersistentAttribute ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("id", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.PROPERTY, ormPersistentAttribute.getAccess());
+//		
+//		assertFalse(virtualAttributes.hasNext());
+//		
+//		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+//		virtualAttributes = ormPersistentType.virtualAttributes();
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("id", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//		
+//		
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("name", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//		
+//		assertFalse(virtualAttributes.hasNext());
+//		
+//		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.FALSE);
+//		virtualAttributes = ormPersistentType.virtualAttributes();
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("id", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.PROPERTY, ormPersistentAttribute.getAccess());
+//		
+//		assertFalse(virtualAttributes.hasNext());
+//	}
+//	
+//	public void testVirtualAttributes3() throws Exception {
+//		createTestEntityFieldSpecifiedPropertyAnnotated();
+//		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+//		
+//		ListIterator<OrmPersistentAttribute> virtualAttributes = ormPersistentType.virtualAttributes();
+//		OrmPersistentAttribute ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("id", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//		
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("name", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("id", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.PROPERTY, ormPersistentAttribute.getAccess());
+//
+//		assertFalse(virtualAttributes.hasNext());
+//		
+//		
+//		ormPersistentAttribute.makeSpecified();
+//		
+//		virtualAttributes = ormPersistentType.virtualAttributes();
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("id", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//		
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("name", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//
+//		assertFalse(virtualAttributes.hasNext());
+//		
+//		
+//		OrmPersistentAttribute specifiedPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+//		assertEquals("id", specifiedPersistentAttribute.getName());
+//		assertEquals(AccessType.PROPERTY, specifiedPersistentAttribute.getSpecifiedAccess());
+//		
+//		
+//		ormPersistentType.virtualAttributes().next().makeSpecified();
+//		virtualAttributes = ormPersistentType.virtualAttributes();
+//		ormPersistentAttribute = virtualAttributes.next();
+//		assertEquals("name", ormPersistentAttribute.getName());
+//		assertEquals(AccessType.FIELD, ormPersistentAttribute.getAccess());
+//
+//		assertFalse(virtualAttributes.hasNext());
+//	}
+//
+//	public void testGetDefaultAccess() throws Exception {
+//		createTestEntityPropertySpecified();
+//		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+//		JavaPersistentType javaPersistentType = ormPersistentType.getJavaPersistentType();
+//		
+//		assertEquals(AccessType.PROPERTY, ormPersistentType.getDefaultAccess());
+//		
+//		javaPersistentType.setSpecifiedAccess(AccessType.FIELD);
+//		assertEquals(AccessType.FIELD, ormPersistentType.getDefaultAccess());
+//		
+//		javaPersistentType.setSpecifiedAccess(AccessType.PROPERTY);
+//		assertEquals(AccessType.PROPERTY, ormPersistentType.getDefaultAccess());
+//
+//		
+//		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+//		assertEquals(AccessType.FIELD, ormPersistentType.getDefaultAccess());
+//	}
+
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmTransientMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmTransientMappingTests.java
new file mode 100644
index 0000000..23d2822
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/EclipseLink1_1OrmTransientMappingTests.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+
+@SuppressWarnings("nls")
+public class EclipseLink1_1OrmTransientMappingTests
+	extends EclipseLink1_1OrmContextModelTestCase
+{
+	public EclipseLink1_1OrmTransientMappingTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestEntityWithTransientMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.TRANSIENT);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@Transient").append(CR);
+			}
+		});
+	}
+	
+	public void testCreateTransientMapping() throws Exception {
+		createTestEntityWithTransientMapping();
+		OrmPersistentType ormPersistentType = 
+			getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		OrmReadOnlyPersistentAttribute persistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertTrue(persistentAttribute.isVirtual());
+		assertEquals(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getMappingKey());
+		
+		ormPersistentType.addSpecifiedAttribute(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY, "id");
+
+		persistentAttribute = ormPersistentType.getAttributeNamed("id");
+		assertFalse(persistentAttribute.isVirtual());
+		assertEquals(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getMappingKey());
+		assertEquals(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY, persistentAttribute.getMapping().getKey());
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/JptEclipseLink1_1CoreOrmContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/JptEclipseLink1_1CoreOrmContextModelTests.java
new file mode 100644
index 0000000..896c426
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_1/context/orm/JptEclipseLink1_1CoreOrmContextModelTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ *  Copyright (c) 2007, 2009 Oracle. 
+ *  All rights reserved.  This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_1.context.orm;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class JptEclipseLink1_1CoreOrmContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLink1_1CoreOrmContextModelTests.class.getName());
+		
+		suite.addTestSuite(EclipseLink1_1OrmPersistentAttributeTests.class);		
+		suite.addTestSuite(EclipseLink1_1OrmPersistentTypeTests.class);	
+		suite.addTestSuite(EclipseLink1_1OrmTransientMappingTests.class);	
+		
+		return suite;
+	}
+	
+	
+	private JptEclipseLink1_1CoreOrmContextModelTests() {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_2/context/EclipseLink1_2ContextModelTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_2/context/EclipseLink1_2ContextModelTestCase.java
new file mode 100644
index 0000000..9aee708
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_2/context/EclipseLink1_2ContextModelTestCase.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ *  Copyright (c) 2009, 2010  Oracle. 
+ *  All rights reserved.  This program and the accompanying materials are 
+ *  made available under the terms of the Eclipse Public License v1.0 which 
+ *  accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_2.context;
+
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.platform.EclipseLinkPlatform;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public abstract class EclipseLink1_2ContextModelTestCase extends EclipseLinkContextModelTestCase
+{
+	public static final String JPA_ANNOTATIONS_PACKAGE_NAME = "javax.persistence"; //$NON-NLS-1$
+
+	protected EclipseLink1_2ContextModelTestCase(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		dataModel.setProperty(JpaFacetDataModelProperties.PLATFORM, EclipseLinkPlatform.VERSION_1_2);
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.CREATE_ORM_XML, Boolean.TRUE);
+		return dataModel;
+	}	
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_2/context/EclipseLink1_2JpaProjectTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_2/context/EclipseLink1_2JpaProjectTests.java
new file mode 100644
index 0000000..9529627
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_2/context/EclipseLink1_2JpaProjectTests.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_2.context;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.internal.operations.JpaFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.eclipselink.core.JptJpaEclipseLinkCorePlugin;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v1_2.EclipseLink1_2;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("nls")
+public class EclipseLink1_2JpaProjectTests extends EclipseLink1_2ContextModelTestCase
+{
+	
+	public EclipseLink1_2JpaProjectTests(String name) {
+		super(name);
+	}
+	
+	public void testGetDefaultOrmXmlResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaCorePlugin.ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());	
+		
+		//delete the orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNull(resource);
+		
+		//add the orm.xml file with eclipselink 1.2 orm content type
+		createDefaultOrmXmlFileWithEclipseLink1_2ContentType();
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_2_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		
+		//delete the orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNull(resource);
+		
+		
+		//add the orm.xml file with eclipselink orm content type
+		createDefaultOrmXmlFileWithEclipseLinkContentType();
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		
+		//delete the orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNull(resource);
+		
+		
+		//add the orm.xml file this time with orm content type
+		createDefaultOrmXmlFile();
+		resource = this.getJpaProject().getDefaultOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaCorePlugin.ORM_XML_CONTENT_TYPE, resource.getContentType());
+		assertEquals("src/META-INF/orm.xml", resource.getFile().getProjectRelativePath().toString());
+	}
+	
+	public void testGetDefaultEclipseLinkOrmXmlResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+		assertNull(resource);
+		
+		//add the eclipselink-orm.xml 1.2 file
+		createDefaultEclipseLink1_2OrmXmlFile();
+		resource = this.getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_2_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/eclipselink-orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		
+		//delete the eclipselink-orm.xml file and verify it is not returned from getDefaultOrmXmlResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+		assertNull(resource);
+	}
+	
+	private void createDefaultOrmXmlFile() throws Exception {
+		IDataModel config =
+			DataModelFactory.createDataModel(new OrmFileCreationDataModelProvider());
+		config.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				getJpaProject().getProject().getFolder("src/META-INF").getFullPath());
+		config.getDefaultOperation().execute(null, null);
+	}
+	
+	private void createDefaultOrmXmlFileWithEclipseLinkContentType() throws Exception {
+		IDataModel config =
+			DataModelFactory.createDataModel(new EclipseLinkOrmFileCreationDataModelProvider());
+		config.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				getJpaProject().getProject().getFolder("src/META-INF").getFullPath());
+		config.setProperty(JptFileCreationDataModelProperties.FILE_NAME, 
+				JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.lastSegment());
+		config.getDefaultOperation().execute(null, null);
+	}
+	
+	private void createDefaultOrmXmlFileWithEclipseLink1_2ContentType() throws Exception {
+		createEclipseLink1_2OrmXmlFile(JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.lastSegment());
+	}
+	
+	private void createDefaultEclipseLink1_2OrmXmlFile() throws Exception {
+		createEclipseLink1_2OrmXmlFile(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH.lastSegment());
+	}
+	
+	private void createEclipseLink1_2OrmXmlFile(String fileName) throws Exception {
+		IDataModel config =
+			DataModelFactory.createDataModel(new EclipseLinkOrmFileCreationDataModelProvider());
+		config.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				getJpaProject().getProject().getFolder("src/META-INF").getFullPath());
+		config.setProperty(JptFileCreationDataModelProperties.FILE_NAME, fileName);
+		config.setProperty(JpaFileCreationDataModelProperties.VERSION, EclipseLink1_2.SCHEMA_VERSION);
+		config.getDefaultOperation().execute(null, null);
+	}
+
+	public void testGetMappingFileResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getMappingFileXmlResource(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH);
+		assertNull(resource);
+		
+		//add the eclipselink-orm.xml 1.2 file
+		createDefaultEclipseLink1_2OrmXmlFile();
+		resource = this.getJpaProject().getMappingFileXmlResource(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH);
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_2_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/eclipselink-orm.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		//delete the eclipselink-orm.xml file and verify it is not returned from getMappingFileResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getMappingFileXmlResource(JptJpaEclipseLinkCorePlugin.DEFAULT_ECLIPSELINK_ORM_XML_RUNTIME_PATH);
+		assertNull(resource);
+	}
+	
+	public void testGetDifferentlyNamedMappingFileResource() throws Exception {
+		JpaXmlResource resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNull(resource);
+
+		//create the orm2.xml file
+		createEclipseLink1_2OrmXmlFile("orm2.xml");
+		resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_2_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/orm2.xml", resource.getFile().getProjectRelativePath().toString());
+		
+		//delete the orm2.xml file and verify it is not returned from getMappingFileResource()
+		resource.delete(null);
+		resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNull(resource);
+		
+		//add the orm2.xml file back
+		createEclipseLink1_2OrmXmlFile("orm2.xml");
+		resource = this.getJpaProject().getMappingFileXmlResource(new Path("META-INF/orm2.xml"));
+		assertNotNull(resource);
+		assertEquals(JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_1_2_RESOURCE_TYPE, resource.getResourceType());
+		assertEquals("src/META-INF/orm2.xml", resource.getFile().getProjectRelativePath().toString());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_2/context/JptEclipseLink1_2CoreContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_2/context/JptEclipseLink1_2CoreContextModelTests.java
new file mode 100644
index 0000000..3adee58
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v1_2/context/JptEclipseLink1_2CoreContextModelTests.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ *  Copyright (c) 2007, 2009 Oracle. 
+ *  All rights reserved.  This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v1_2.context;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class JptEclipseLink1_2CoreContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLink1_2CoreContextModelTests.class.getName());
+		suite.addTestSuite(EclipseLink1_2JpaProjectTests.class);
+	//	suite.addTest(JptEclipseLink1_2CoreOrmContextModelTests.suite());
+		return suite;
+	}
+
+	private JptEclipseLink1_2CoreContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/EclipseLink2_0ContextModelTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/EclipseLink2_0ContextModelTestCase.java
new file mode 100644
index 0000000..81e169f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/EclipseLink2_0ContextModelTestCase.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ *  Copyright (c) 2009, 2010  Oracle. 
+ *  All rights reserved.  This program and the accompanying materials are 
+ *  made available under the terms of the Eclipse Public License v1.0 which 
+ *  accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context;
+
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.platform.EclipseLinkPlatform;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLinkContextModelTestCase;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public abstract class EclipseLink2_0ContextModelTestCase extends EclipseLinkContextModelTestCase
+{
+	protected EclipseLink2_0ContextModelTestCase(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		dataModel.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, JpaFacet.VERSION_2_0.getVersionString());
+		dataModel.setProperty(JpaFacetDataModelProperties.PLATFORM, EclipseLinkPlatform.VERSION_2_0);
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.CREATE_ORM_XML, Boolean.TRUE);
+		return dataModel;
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/JptEclipseLink2_0CoreContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/JptEclipseLink2_0CoreContextModelTests.java
new file mode 100644
index 0000000..8221ce7
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/JptEclipseLink2_0CoreContextModelTests.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+* Copyright (c) 2009 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java.JptEclipseLink2_0JavaContextModelTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm.JptEclipseLink2_0OrmContextModelTests;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.persistence.JptEclipseLink2_0CorePersistenceContextModelTests;
+
+/**
+ *  JptEclipseLink2_0CoreContextModelTests
+ */
+public class JptEclipseLink2_0CoreContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLink2_0CoreContextModelTests.class.getName());
+
+		suite.addTest(JptEclipseLink2_0CorePersistenceContextModelTests.suite());
+		suite.addTest(JptEclipseLink2_0JavaContextModelTests.suite());
+		suite.addTest(JptEclipseLink2_0OrmContextModelTests.suite());
+
+		return suite;
+	}
+
+	private JptEclipseLink2_0CoreContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}	
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaCollectionTableTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaCollectionTableTests.java
new file mode 100644
index 0000000..e70de2a
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaCollectionTableTests.java
@@ -0,0 +1,724 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.java.JavaJoinColumn;
+import org.eclipse.jpt.jpa.core.context.java.JavaUniqueConstraint;
+import org.eclipse.jpt.jpa.core.jpa2.context.CollectionTable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaCollectionTable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.CollectionTable2_0Annotation;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.UniqueConstraintAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.EclipseLink2_0ContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0JavaCollectionTableTests extends EclipseLink2_0ContextModelTestCase
+{
+	public EclipseLink2_0JavaCollectionTableTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestEntityWithElementCollection() throws Exception {		
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ElementCollection").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithValidElementCollection() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, "java.util.Collection");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ElementCollection").append(CR);
+				sb.append("    private Collection<String> projects;").append(CR);
+			}
+		});
+	}
+
+	
+	public void testUpdateSpecifiedName() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+	
+		CollectionTable2_0Annotation resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(collectionTable.getSpecifiedName());
+		assertNull(resourceCollectionTable);
+		
+		
+		//set name in the resource model, verify context model updated
+		attributeResource.addAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		resourceCollectionTable.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", collectionTable.getSpecifiedName());
+		assertEquals("FOO", resourceCollectionTable.getName());
+	
+		//set name to null in the resource model
+		resourceCollectionTable.setName(null);
+		getJpaProject().synchronizeContextModel();
+		assertNull(collectionTable.getSpecifiedName());
+		assertNull(resourceCollectionTable.getName());
+		
+		resourceCollectionTable.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", collectionTable.getSpecifiedName());
+		assertEquals("FOO", resourceCollectionTable.getName());
+
+		attributeResource.removeAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertNull(collectionTable.getSpecifiedName());
+		assertNull(attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME));
+	}
+	
+	public void testModifySpecifiedName() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+	
+		CollectionTable2_0Annotation resourceCollectionTable3 = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(collectionTable.getSpecifiedName());
+		assertNull(resourceCollectionTable3);
+	
+		//set name in the context model, verify resource model modified
+		collectionTable.setSpecifiedName("foo");
+		resourceCollectionTable3 = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		assertEquals("foo", collectionTable.getSpecifiedName());
+		assertEquals("foo", resourceCollectionTable3.getName());
+		
+		//set name to null in the context model
+		collectionTable.setSpecifiedName(null);
+		assertNull(collectionTable.getSpecifiedName());
+		assertNull(attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME));
+	}
+	
+	public void testDefaultName() throws Exception {
+		createTestEntityWithValidElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		assertEquals(TYPE_NAME + "_projects", collectionTable.getDefaultName());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME));
+
+		//add the collection table annotation, verify default collection table name is the same
+		attributeResource.addAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		assertEquals(TYPE_NAME + "_projects", collectionTable.getDefaultName());
+		assertNotNull(attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME));
+		
+		//set the entity name, verify default collection table name updates
+		getJavaEntity().setSpecifiedName("Foo");
+		assertEquals("Foo_projects", collectionTable.getDefaultName());
+	}
+
+	public void testUpdateSpecifiedSchema() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+	
+		CollectionTable2_0Annotation resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(collectionTable.getSpecifiedSchema());
+		assertNull(resourceCollectionTable);
+		
+		
+		//set schema in the resource model, verify context model updated
+		attributeResource.addAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		resourceCollectionTable.setSchema("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", collectionTable.getSpecifiedSchema());
+		assertEquals("FOO", resourceCollectionTable.getSchema());
+	
+		//set schema to null in the resource model
+		resourceCollectionTable.setSchema(null);
+		getJpaProject().synchronizeContextModel();
+		assertNull(collectionTable.getSpecifiedSchema());
+		assertNull(resourceCollectionTable.getSchema());
+		
+		resourceCollectionTable.setSchema("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", collectionTable.getSpecifiedSchema());
+		assertEquals("FOO", resourceCollectionTable.getSchema());
+
+		attributeResource.removeAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertNull(collectionTable.getSpecifiedSchema());
+		assertNull(attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME));
+	}
+	
+	public void testModifySpecifiedSchema() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+	
+		CollectionTable2_0Annotation resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(collectionTable.getSpecifiedSchema());
+		assertNull(resourceCollectionTable);
+	
+		//set schema in the context model, verify resource model modified
+		collectionTable.setSpecifiedSchema("foo");
+		resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		assertEquals("foo", collectionTable.getSpecifiedSchema());
+		assertEquals("foo", resourceCollectionTable.getSchema());
+		
+		//set schema to null in the context model
+		collectionTable.setSpecifiedSchema(null);
+		assertNull(collectionTable.getSpecifiedSchema());
+		assertNull(attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME));
+	}
+
+	public void testUpdateSpecifiedCatalog() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+	
+		CollectionTable2_0Annotation resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(collectionTable.getSpecifiedCatalog());
+		assertNull(resourceCollectionTable);
+		
+		
+		//set catalog in the resource model, verify context model updated
+		attributeResource.addAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		resourceCollectionTable.setCatalog("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", collectionTable.getSpecifiedCatalog());
+		assertEquals("FOO", resourceCollectionTable.getCatalog());
+	
+		//set catalog to null in the resource model
+		resourceCollectionTable.setCatalog(null);
+		getJpaProject().synchronizeContextModel();
+		assertNull(collectionTable.getSpecifiedCatalog());
+		assertNull(resourceCollectionTable.getCatalog());
+		
+		resourceCollectionTable.setCatalog("FOO");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FOO", collectionTable.getSpecifiedCatalog());
+		assertEquals("FOO", resourceCollectionTable.getCatalog());
+
+		attributeResource.removeAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertNull(collectionTable.getSpecifiedCatalog());
+		assertNull(attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME));
+	}
+	
+	public void testModifySpecifiedCatalog() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+	
+		CollectionTable2_0Annotation resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(collectionTable.getSpecifiedCatalog());
+		assertNull(resourceCollectionTable);
+	
+		//set catalog in the context model, verify resource model modified
+		collectionTable.setSpecifiedCatalog("foo");
+		resourceCollectionTable = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		assertEquals("foo", collectionTable.getSpecifiedCatalog());
+		assertEquals("foo", resourceCollectionTable.getCatalog());
+		
+		//set catalog to null in the context model
+		collectionTable.setSpecifiedCatalog(null);
+		assertNull(collectionTable.getSpecifiedCatalog());
+		assertNull(attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME));
+	}
+
+	public void testAddSpecifiedJoinColumn() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		JavaCollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+	
+		
+		JoinColumn joinColumn = collectionTable.addSpecifiedJoinColumn(0);
+		joinColumn.setSpecifiedName("FOO");
+				
+		CollectionTable2_0Annotation joinTableResource = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+
+		assertEquals("FOO", joinTableResource.joinColumnAt(0).getName());
+		
+		JoinColumn joinColumn2 = collectionTable.addSpecifiedJoinColumn(0);
+		joinColumn2.setSpecifiedName("BAR");
+		
+		assertEquals("BAR", joinTableResource.joinColumnAt(0).getName());
+		assertEquals("FOO", joinTableResource.joinColumnAt(1).getName());
+		
+		JoinColumn joinColumn3 = collectionTable.addSpecifiedJoinColumn(1);
+		joinColumn3.setSpecifiedName("BAZ");
+		
+		assertEquals("BAR", joinTableResource.joinColumnAt(0).getName());
+		assertEquals("BAZ", joinTableResource.joinColumnAt(1).getName());
+		assertEquals("FOO", joinTableResource.joinColumnAt(2).getName());
+		
+		ListIterator<JavaJoinColumn> joinColumns = collectionTable.specifiedJoinColumns();
+		assertEquals(joinColumn2, joinColumns.next());
+		assertEquals(joinColumn3, joinColumns.next());
+		assertEquals(joinColumn, joinColumns.next());
+		
+		joinColumns = collectionTable.specifiedJoinColumns();
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+	}
+	
+	public void testRemoveSpecifiedJoinColumn() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		collectionTable.addSpecifiedJoinColumn(0).setSpecifiedName("FOO");
+		collectionTable.addSpecifiedJoinColumn(1).setSpecifiedName("BAR");
+		collectionTable.addSpecifiedJoinColumn(2).setSpecifiedName("BAZ");
+		
+		CollectionTable2_0Annotation joinTableResource = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		assertEquals(3, joinTableResource.joinColumnsSize());
+		
+		collectionTable.removeSpecifiedJoinColumn(0);
+		assertEquals(2, joinTableResource.joinColumnsSize());
+		assertEquals("BAR", joinTableResource.joinColumnAt(0).getName());
+		assertEquals("BAZ", joinTableResource.joinColumnAt(1).getName());
+
+		collectionTable.removeSpecifiedJoinColumn(0);
+		assertEquals(1, joinTableResource.joinColumnsSize());
+		assertEquals("BAZ", joinTableResource.joinColumnAt(0).getName());
+		
+		collectionTable.removeSpecifiedJoinColumn(0);
+		assertEquals(0, joinTableResource.joinColumnsSize());
+	}
+	
+	public void testMoveSpecifiedJoinColumn() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		JavaCollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		collectionTable.addSpecifiedJoinColumn(0).setSpecifiedName("FOO");
+		collectionTable.addSpecifiedJoinColumn(1).setSpecifiedName("BAR");
+		collectionTable.addSpecifiedJoinColumn(2).setSpecifiedName("BAZ");
+		
+		CollectionTable2_0Annotation joinTableResource = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		assertEquals(3, joinTableResource.joinColumnsSize());
+		
+		
+		collectionTable.moveSpecifiedJoinColumn(2, 0);
+		ListIterator<JavaJoinColumn> joinColumns = collectionTable.specifiedJoinColumns();
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+
+		assertEquals("BAR", joinTableResource.joinColumnAt(0).getName());
+		assertEquals("BAZ", joinTableResource.joinColumnAt(1).getName());
+		assertEquals("FOO", joinTableResource.joinColumnAt(2).getName());
+
+
+		collectionTable.moveSpecifiedJoinColumn(0, 1);
+		joinColumns = collectionTable.specifiedJoinColumns();
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+
+		assertEquals("BAZ", joinTableResource.joinColumnAt(0).getName());
+		assertEquals("BAR", joinTableResource.joinColumnAt(1).getName());
+		assertEquals("FOO", joinTableResource.joinColumnAt(2).getName());
+	}
+	
+	public void testUpdateJoinColumns() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		JavaCollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+	
+		CollectionTable2_0Annotation joinTableResource = (CollectionTable2_0Annotation) attributeResource.addAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+	
+		joinTableResource.addJoinColumn(0);
+		joinTableResource.addJoinColumn(1);
+		joinTableResource.addJoinColumn(2);
+		
+		joinTableResource.joinColumnAt(0).setName("FOO");
+		joinTableResource.joinColumnAt(1).setName("BAR");
+		joinTableResource.joinColumnAt(2).setName("BAZ");
+		getJpaProject().synchronizeContextModel();
+	
+		ListIterator<JavaJoinColumn> joinColumns = collectionTable.specifiedJoinColumns();
+		assertEquals("FOO", joinColumns.next().getName());
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+		
+		joinTableResource.moveJoinColumn(2, 0);
+		getJpaProject().synchronizeContextModel();
+		joinColumns = collectionTable.specifiedJoinColumns();
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+	
+		joinTableResource.moveJoinColumn(0, 1);
+		getJpaProject().synchronizeContextModel();
+		joinColumns = collectionTable.specifiedJoinColumns();
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+	
+		joinTableResource.removeJoinColumn(1);
+		getJpaProject().synchronizeContextModel();
+		joinColumns = collectionTable.specifiedJoinColumns();
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+	
+		joinTableResource.removeJoinColumn(1);
+		getJpaProject().synchronizeContextModel();
+		joinColumns = collectionTable.specifiedJoinColumns();
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+		
+		joinTableResource.removeJoinColumn(0);
+		getJpaProject().synchronizeContextModel();
+		assertFalse(collectionTable.specifiedJoinColumns().hasNext());
+	}
+	
+	public void testGetDefaultJoinColumn() {
+		//TODO
+	}
+	
+	public void testSpecifiedJoinColumnsSize() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		assertEquals(0, collectionTable.specifiedJoinColumnsSize());
+		
+		collectionTable.addSpecifiedJoinColumn(0);
+		assertEquals(1, collectionTable.specifiedJoinColumnsSize());
+		
+		collectionTable.removeSpecifiedJoinColumn(0);
+		assertEquals(0, collectionTable.specifiedJoinColumnsSize());
+	}
+
+	public void testUniqueConstraints() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		JavaCollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		ListIterator<JavaUniqueConstraint> uniqueConstraints = collectionTable.uniqueConstraints();
+		assertFalse(uniqueConstraints.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		CollectionTable2_0Annotation joinTableAnnotation = (CollectionTable2_0Annotation) attributeResource.addAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		joinTableAnnotation.addUniqueConstraint(0).addColumnName(0, "foo");
+		joinTableAnnotation.addUniqueConstraint(0).addColumnName(0, "bar");
+		getJpaProject().synchronizeContextModel();
+		
+		uniqueConstraints = collectionTable.uniqueConstraints();
+		assertTrue(uniqueConstraints.hasNext());
+		assertEquals("bar", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("foo", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	}
+	
+	public void testUniqueConstraintsSize() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		
+		assertEquals(0,  collectionTable.uniqueConstraintsSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		CollectionTable2_0Annotation joinTableAnnotation = (CollectionTable2_0Annotation) attributeResource.addAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		joinTableAnnotation.addUniqueConstraint(0).addColumnName(0, "foo");
+		joinTableAnnotation.addUniqueConstraint(1).addColumnName(0, "bar");
+
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(2,  collectionTable.uniqueConstraintsSize());
+	}
+
+	public void testAddUniqueConstraint() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		collectionTable.addUniqueConstraint(0).addColumnName(0, "FOO");
+		collectionTable.addUniqueConstraint(0).addColumnName(0, "BAR");
+		collectionTable.addUniqueConstraint(0).addColumnName(0, "BAZ");
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		CollectionTable2_0Annotation joinTableAnnotation = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		ListIterator<UniqueConstraintAnnotation> uniqueConstraints = joinTableAnnotation.uniqueConstraints();
+		
+		assertEquals("BAZ", uniqueConstraints.next().columnNames().next());
+		assertEquals("BAR", uniqueConstraints.next().columnNames().next());
+		assertEquals("FOO", uniqueConstraints.next().columnNames().next());
+		assertFalse(uniqueConstraints.hasNext());
+	}
+	
+	public void testAddUniqueConstraint2() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		CollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		collectionTable.addUniqueConstraint(0).addColumnName(0, "FOO");
+		collectionTable.addUniqueConstraint(1).addColumnName(0, "BAR");
+		collectionTable.addUniqueConstraint(0).addColumnName(0, "BAZ");
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		CollectionTable2_0Annotation joinTableAnnotation = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		ListIterator<UniqueConstraintAnnotation> uniqueConstraints = joinTableAnnotation.uniqueConstraints();
+		
+		assertEquals("BAZ", uniqueConstraints.next().columnNames().next());
+		assertEquals("FOO", uniqueConstraints.next().columnNames().next());
+		assertEquals("BAR", uniqueConstraints.next().columnNames().next());
+		assertFalse(uniqueConstraints.hasNext());
+	}
+	
+	public void testRemoveUniqueConstraint() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		JavaCollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		collectionTable.addUniqueConstraint(0).addColumnName(0, "FOO");
+		collectionTable.addUniqueConstraint(1).addColumnName(0, "BAR");
+		collectionTable.addUniqueConstraint(2).addColumnName(0, "BAZ");
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		CollectionTable2_0Annotation joinTableAnnotation = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		
+		assertEquals(3, joinTableAnnotation.uniqueConstraintsSize());
+
+		collectionTable.removeUniqueConstraint(1);
+		
+		ListIterator<UniqueConstraintAnnotation> uniqueConstraintAnnotations = joinTableAnnotation.uniqueConstraints();
+		assertEquals("FOO", uniqueConstraintAnnotations.next().columnNames().next());		
+		assertEquals("BAZ", uniqueConstraintAnnotations.next().columnNames().next());
+		assertFalse(uniqueConstraintAnnotations.hasNext());
+		
+		Iterator<JavaUniqueConstraint> uniqueConstraints = collectionTable.uniqueConstraints();
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());		
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	
+		
+		collectionTable.removeUniqueConstraint(1);
+		uniqueConstraintAnnotations = joinTableAnnotation.uniqueConstraints();
+		assertEquals("FOO", uniqueConstraintAnnotations.next().columnNames().next());		
+		assertFalse(uniqueConstraintAnnotations.hasNext());
+
+		uniqueConstraints = collectionTable.uniqueConstraints();
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());		
+		assertFalse(uniqueConstraints.hasNext());
+
+		
+		collectionTable.removeUniqueConstraint(0);
+		uniqueConstraintAnnotations = joinTableAnnotation.uniqueConstraints();
+		assertFalse(uniqueConstraintAnnotations.hasNext());
+		uniqueConstraints = collectionTable.uniqueConstraints();
+		assertFalse(uniqueConstraints.hasNext());
+	}
+	
+	public void testMoveUniqueConstraint() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		JavaCollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		collectionTable.addUniqueConstraint(0).addColumnName(0, "FOO");
+		collectionTable.addUniqueConstraint(1).addColumnName(0, "BAR");
+		collectionTable.addUniqueConstraint(2).addColumnName(0, "BAZ");
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		CollectionTable2_0Annotation joinTableAnnotation = (CollectionTable2_0Annotation) attributeResource.getAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+		
+		assertEquals(3, joinTableAnnotation.uniqueConstraintsSize());
+		
+		
+		collectionTable.moveUniqueConstraint(2, 0);
+		ListIterator<JavaUniqueConstraint> uniqueConstraints = collectionTable.uniqueConstraints();
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+
+		ListIterator<UniqueConstraintAnnotation> uniqueConstraintAnnotations = joinTableAnnotation.uniqueConstraints();
+		assertEquals("BAR", uniqueConstraintAnnotations.next().columnNames().next());
+		assertEquals("BAZ", uniqueConstraintAnnotations.next().columnNames().next());
+		assertEquals("FOO", uniqueConstraintAnnotations.next().columnNames().next());
+
+
+		collectionTable.moveUniqueConstraint(0, 1);
+		uniqueConstraints = collectionTable.uniqueConstraints();
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+
+		uniqueConstraintAnnotations = joinTableAnnotation.uniqueConstraints();
+		assertEquals("BAZ", uniqueConstraintAnnotations.next().columnNames().next());
+		assertEquals("BAR", uniqueConstraintAnnotations.next().columnNames().next());
+		assertEquals("FOO", uniqueConstraintAnnotations.next().columnNames().next());
+	}
+	
+	public void testUpdateUniqueConstraints() throws Exception {
+		createTestEntityWithElementCollection();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().attributes().next().getMapping();
+		JavaCollectionTable2_0 collectionTable = elementCollectionMapping.getCollectionTable();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		CollectionTable2_0Annotation joinTableAnnotation = (CollectionTable2_0Annotation) attributeResource.addAnnotation(CollectionTable2_0Annotation.ANNOTATION_NAME);
+	
+		joinTableAnnotation.addUniqueConstraint(0).addColumnName("FOO");
+		joinTableAnnotation.addUniqueConstraint(1).addColumnName("BAR");
+		joinTableAnnotation.addUniqueConstraint(2).addColumnName("BAZ");
+		getJpaProject().synchronizeContextModel();
+
+		
+		ListIterator<JavaUniqueConstraint> uniqueConstraints = collectionTable.uniqueConstraints();
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+		
+		joinTableAnnotation.moveUniqueConstraint(2, 0);
+		getJpaProject().synchronizeContextModel();
+		uniqueConstraints = collectionTable.uniqueConstraints();
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	
+		joinTableAnnotation.moveUniqueConstraint(0, 1);
+		getJpaProject().synchronizeContextModel();
+		uniqueConstraints = collectionTable.uniqueConstraints();
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	
+		joinTableAnnotation.removeUniqueConstraint(1);
+		getJpaProject().synchronizeContextModel();
+		uniqueConstraints = collectionTable.uniqueConstraints();
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	
+		joinTableAnnotation.removeUniqueConstraint(1);
+		getJpaProject().synchronizeContextModel();
+		uniqueConstraints = collectionTable.uniqueConstraints();
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+		
+		joinTableAnnotation.removeUniqueConstraint(0);
+		getJpaProject().synchronizeContextModel();
+		uniqueConstraints = collectionTable.uniqueConstraints();
+		assertFalse(uniqueConstraints.hasNext());
+	}
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaElementCollectionMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaElementCollectionMappingTests.java
new file mode 100644
index 0000000..261b72f
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaElementCollectionMappingTests.java
@@ -0,0 +1,2077 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.ReflectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AttributeOverride;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.Embeddable;
+import org.eclipse.jpt.jpa.core.context.EmbeddedIdMapping;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.TransientMapping;
+import org.eclipse.jpt.jpa.core.context.TypeMapping;
+import org.eclipse.jpt.jpa.core.context.VersionMapping;
+import org.eclipse.jpt.jpa.core.context.VirtualAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaAttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+import org.eclipse.jpt.jpa.core.jpa2.context.ElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrderColumn2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.Orderable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.ElementCollection2_0Annotation;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.MapKeyClass2_0Annotation;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.MapKeyColumn2_0Annotation;
+import org.eclipse.jpt.jpa.core.resource.java.AttributeOverrideAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.AttributeOverridesAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.BasicAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.ColumnAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.EmbeddedAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.EmbeddedIdAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.IdAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.ManyToManyAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.ManyToOneAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.MapKeyAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.NestableAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.OneToManyAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.TransientAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.VersionAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.EclipseLink2_0ContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0JavaElementCollectionMappingTests
+	extends EclipseLink2_0ContextModelTestCase
+{
+	public static final String EMBEDDABLE_TYPE_NAME = "Address";
+	public static final String FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME = PACKAGE_NAME + "." + EMBEDDABLE_TYPE_NAME;
+
+	private ICompilationUnit createTestEntityWithElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ElementCollection").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithGenericEmbeddableElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Collection<Address> addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithGenericBasicElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Collection<String> addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithNonGenericElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Collection addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityWithValidGenericMapElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Map<Integer, Address> addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithValidNonGenericMapElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Map addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private void createTestTargetEmbeddableAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+	
+	private void createTestEmbeddableState() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("State").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    private String abbr;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter);
+	}
+
+	private ICompilationUnit createTestEntityWithEmbeddableKeyAndValueElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Map<Address, PropertyInfo> parcels;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private void createTestEmbeddablePropertyInfo() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("PropertyInfo").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private Integer parcelNumber;").append(CR);
+				sb.append(CR);
+				sb.append("    private Integer size;").append(CR);
+				sb.append(CR);
+				sb.append("    private java.math.BigDecimal tax;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PropertyInfo.java", sourceWriter);
+	}
+
+	private void createSelfReferentialElementCollection() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ELEMENT_COLLECTION);
+					sb.append(";");
+					sb.append(CR).append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("Foo").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);
+				sb.append("    private java.util.List<Foo> elementCollection;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Foo.java", sourceWriter);
+	}
+
+	public EclipseLink2_0JavaElementCollectionMappingTests(String name) {
+		super(name);
+	}
+	
+	public void testMorphToBasicMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping() instanceof BasicMapping);
+		assertFalse(persistentAttribute.getMapping().isDefault());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+		assertNotNull(attributeResource.getAnnotation(BasicAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMorphToDefault() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.NULL_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping().isDefault());
+	
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+	}
+	
+	public void testMorphToVersionMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping() instanceof VersionMapping);
+		assertFalse(persistentAttribute.getMapping().isDefault());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+		assertNotNull(attributeResource.getAnnotation(VersionAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMorphToIdMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping() instanceof IdMapping);
+		assertFalse(persistentAttribute.getMapping().isDefault());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+		assertNotNull(attributeResource.getAnnotation(IdAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMorphToEmbeddedMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.EMBEDDED_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping() instanceof EmbeddedMapping);
+		assertFalse(persistentAttribute.getMapping().isDefault());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+		assertNotNull(attributeResource.getAnnotation(EmbeddedAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMorphToEmbeddedIdMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping() instanceof EmbeddedIdMapping);
+		assertFalse(persistentAttribute.getMapping().isDefault());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+		assertNotNull(attributeResource.getAnnotation(EmbeddedIdAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMorphToTransientMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping() instanceof TransientMapping);
+		assertFalse(persistentAttribute.getMapping().isDefault());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+		assertNotNull(attributeResource.getAnnotation(TransientAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMorphToManyToOneMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping() instanceof ManyToOneMapping);
+		assertFalse(persistentAttribute.getMapping().isDefault());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+		assertNotNull(attributeResource.getAnnotation(ManyToOneAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMorphToOneToManyMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping() instanceof OneToManyMapping);
+		assertFalse(persistentAttribute.getMapping().isDefault());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+		assertNotNull(attributeResource.getAnnotation(OneToManyAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMorphToManyToManyMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		
+		persistentAttribute.setMappingKey(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY);
+		assertTrue(persistentAttribute.getMapping() instanceof ManyToManyMapping);
+		assertFalse(persistentAttribute.getMapping().isDefault());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertNull(attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME));
+		assertNotNull(attributeResource.getAnnotation(ManyToManyAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testUpdateSpecifiedTargetEntity() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		ElementCollection2_0Annotation elementCollectionAnnotation = (ElementCollection2_0Annotation) attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(elementCollectionMapping.getSpecifiedTargetClass());
+		assertNull(elementCollectionAnnotation.getTargetClass());
+				
+		//set target class in the resource model, verify context model updated
+		elementCollectionAnnotation.setTargetClass("newTargetClass");
+		this.getJpaProject().synchronizeContextModel();
+		assertEquals("newTargetClass", elementCollectionMapping.getSpecifiedTargetClass());
+		assertEquals("newTargetClass", elementCollectionAnnotation.getTargetClass());
+	
+		//set target class to null in the resource model
+		elementCollectionAnnotation.setTargetClass(null);
+		this.getJpaProject().synchronizeContextModel();
+		assertNull(elementCollectionMapping.getSpecifiedTargetClass());
+		assertNull(elementCollectionAnnotation.getTargetClass());
+	}
+	
+	public void testModifySpecifiedTargetClass() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		ElementCollection2_0Annotation elementCollection = (ElementCollection2_0Annotation) attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(elementCollectionMapping.getSpecifiedTargetClass());
+		assertNull(elementCollection.getTargetClass());
+				
+		//set target class in the context model, verify resource model updated
+		elementCollectionMapping.setSpecifiedTargetClass("newTargetClass");
+		assertEquals("newTargetClass", elementCollectionMapping.getSpecifiedTargetClass());
+		assertEquals("newTargetClass", elementCollection.getTargetClass());
+	
+		//set target class to null in the context model
+		elementCollectionMapping.setSpecifiedTargetClass(null);
+		assertNull(elementCollectionMapping.getSpecifiedTargetClass());
+		assertNull(elementCollection.getTargetClass());
+	}
+	
+	public void testDefaultTargetClass() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		//targetEntity not in the persistence unit, default still set, handled by validation
+		assertEquals(PACKAGE_NAME + ".Address", elementCollectionMapping.getDefaultTargetClass());
+		
+		//add targetEntity to the persistence unit
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		assertEquals(PACKAGE_NAME + ".Address", elementCollectionMapping.getDefaultTargetClass());
+
+		//test default still the same when specified target entity it set
+		elementCollectionMapping.setSpecifiedTargetClass("foo");
+		assertEquals(PACKAGE_NAME + ".Address", elementCollectionMapping.getDefaultTargetClass());
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		ClassRef addressClassRef = classRefs.next();
+		JavaPersistentType addressPersistentType = addressClassRef.getJavaPersistentType();
+
+		//test target is not an Embeddable, default target entity still exists, this case handled with validation
+		addressPersistentType.setMappingKey(MappingKeys.NULL_TYPE_MAPPING_KEY);
+		assertEquals(PACKAGE_NAME + ".Address", elementCollectionMapping.getDefaultTargetClass());
+	}
+	
+	public void testDefaultTargetClassNonGenericCollection() throws Exception {
+		createTestEntityWithNonGenericElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+	
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertNull(elementCollectionMapping.getDefaultTargetClass());
+	}
+	
+	public void testDefaultTargetClassGenericCollection() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+	
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals(PACKAGE_NAME + ".Address", elementCollectionMapping.getDefaultTargetClass());
+	}
+
+	public void testDefaultTargetClassNonGenericMap() throws Exception {
+		createTestEntityWithValidNonGenericMapElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+	
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertNull(elementCollectionMapping.getDefaultTargetClass());
+	}
+	
+	public void testDefaultTargetClassGenericMap() throws Exception {
+		createTestEntityWithValidGenericMapElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+	
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals(PACKAGE_NAME + ".Address", elementCollectionMapping.getDefaultTargetClass());
+	}
+	
+	public void testTargetClass() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals(PACKAGE_NAME + ".Address", elementCollectionMapping.getTargetClass());
+
+		elementCollectionMapping.setSpecifiedTargetClass("foo");
+		assertEquals("foo", elementCollectionMapping.getTargetClass());
+		
+		elementCollectionMapping.setSpecifiedTargetClass(null);
+		assertEquals(PACKAGE_NAME + ".Address", elementCollectionMapping.getTargetClass());
+	}
+
+	protected Embeddable getResolvedTargetEmbeddable(ElementCollectionMapping2_0 mapping) {
+		return (Embeddable) ReflectionTools.executeMethod(mapping, "getResolvedTargetEmbeddable");
+	}
+	
+	public void testResolvedTargetEmbeddable() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		//target embeddable not in the persistence unit
+		assertNull(this.getResolvedTargetEmbeddable(elementCollectionMapping));
+		
+		//add target embeddable to the persistence unit, now target embeddable should resolve
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		ClassRef addressClassRef = classRefs.next();
+		TypeMapping addressTypeMapping = addressClassRef.getJavaPersistentType().getMapping();
+		assertEquals(addressTypeMapping, this.getResolvedTargetEmbeddable(elementCollectionMapping));
+
+		//test default still the same when specified target entity it set
+		elementCollectionMapping.setSpecifiedTargetClass("foo");
+		assertNull(this.getResolvedTargetEmbeddable(elementCollectionMapping));
+		
+		
+		elementCollectionMapping.setSpecifiedTargetClass(PACKAGE_NAME + ".Address");
+		assertEquals(addressTypeMapping, this.getResolvedTargetEmbeddable(elementCollectionMapping));
+		
+
+		elementCollectionMapping.setSpecifiedTargetClass(null);
+		assertEquals(addressTypeMapping, this.getResolvedTargetEmbeddable(elementCollectionMapping));
+	}
+	
+	public void testResolvedTargetEmbeddableWithBasicType() throws Exception {
+		createTestEntityWithGenericBasicElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		//target is a basic type, so resolved target embeddable is null
+		assertNull(this.getResolvedTargetEmbeddable(elementCollectionMapping));
+	}
+
+	public void testUpdateSpecifiedFetch() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		ElementCollection2_0Annotation elementCollection = (ElementCollection2_0Annotation) attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(elementCollectionMapping.getSpecifiedFetch());
+		assertNull(elementCollection.getFetch());
+				
+		//set fetch in the resource model, verify context model updated
+		elementCollection.setFetch(org.eclipse.jpt.jpa.core.resource.java.FetchType.EAGER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(FetchType.EAGER, elementCollectionMapping.getSpecifiedFetch());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.java.FetchType.EAGER, elementCollection.getFetch());
+		
+		elementCollection.setFetch(org.eclipse.jpt.jpa.core.resource.java.FetchType.LAZY);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(FetchType.LAZY, elementCollectionMapping.getSpecifiedFetch());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.java.FetchType.LAZY, elementCollection.getFetch());
+		
+		//set fetch to null in the resource model
+		elementCollection.setFetch(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(elementCollectionMapping.getSpecifiedFetch());
+		assertNull(elementCollection.getFetch());
+	}
+	
+	public void testModifySpecifiedFetch() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		ElementCollection2_0Annotation elementCollection = (ElementCollection2_0Annotation) attributeResource.getAnnotation(ElementCollection2_0Annotation.ANNOTATION_NAME);
+		
+		assertNull(elementCollectionMapping.getSpecifiedFetch());
+		assertNull(elementCollection.getFetch());
+				
+		//set fetch in the context model, verify resource model updated
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertEquals(FetchType.EAGER, elementCollectionMapping.getSpecifiedFetch());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.java.FetchType.EAGER, elementCollection.getFetch());
+	
+		elementCollectionMapping.setSpecifiedFetch(FetchType.LAZY);
+		assertEquals(FetchType.LAZY, elementCollectionMapping.getSpecifiedFetch());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.java.FetchType.LAZY, elementCollection.getFetch());
+		
+		//set fetch to null in the context model
+		elementCollectionMapping.setSpecifiedFetch(null);
+		assertNull(elementCollectionMapping.getSpecifiedFetch());
+		assertNull(elementCollection.getFetch());
+	}
+	
+	public void testGetValueTypeEmbeddable() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals(ElementCollectionMapping2_0.Type.EMBEDDABLE_TYPE, elementCollectionMapping.getValueType());
+	}
+	
+	public void testGetValueTypeNone() throws Exception {
+		createTestEntityWithNonGenericElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals(ElementCollectionMapping2_0.Type.NO_TYPE, elementCollectionMapping.getValueType());
+		
+		elementCollectionMapping.setSpecifiedTargetClass("Address");
+		assertEquals(ElementCollectionMapping2_0.Type.EMBEDDABLE_TYPE, elementCollectionMapping.getValueType());
+	}
+	
+	public void testGetValueTypeBasic() throws Exception {
+		createTestEntityWithGenericBasicElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals(ElementCollectionMapping2_0.Type.BASIC_TYPE, elementCollectionMapping.getValueType());
+	}
+	
+	public void testUpdateMapKey() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(elementCollectionMapping.getSpecifiedMapKey());
+		assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME));
+		
+		//set mapKey in the resource model, verify context model does not change
+		attributeResource.addAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(elementCollectionMapping.getSpecifiedMapKey());
+		MapKeyAnnotation mapKey = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNotNull(mapKey);
+				
+		//set mapKey name in the resource model, verify context model updated
+		mapKey.setName("myMapKey");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals("myMapKey", elementCollectionMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", mapKey.getName());
+		
+		//set mapKey name to null in the resource model
+		mapKey.setName(null);
+		getJpaProject().synchronizeContextModel();
+		assertNull(elementCollectionMapping.getSpecifiedMapKey());
+		assertNull(mapKey.getName());
+		
+		mapKey.setName("myMapKey");
+		attributeResource.removeAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNull(elementCollectionMapping.getSpecifiedMapKey());
+		assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testModifyMapKey() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(elementCollectionMapping.getSpecifiedMapKey());
+		assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME));
+					
+		//set mapKey  in the context model, verify resource model updated
+		elementCollectionMapping.setSpecifiedMapKey("myMapKey");
+		MapKeyAnnotation mapKeyAnnotation = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertEquals("myMapKey", elementCollectionMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", mapKeyAnnotation.getName());
+	
+		//set mapKey to null in the context model
+		elementCollectionMapping.setSpecifiedMapKey(null);
+		assertNull(elementCollectionMapping.getSpecifiedMapKey());
+		mapKeyAnnotation = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNull(mapKeyAnnotation.getName());
+	}
+	
+	public void testCandidateMapKeyNames() throws Exception {
+		createTestEntityWithValidGenericMapElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping2_0 = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		Iterator<String> mapKeyNames = 
+			elementCollectionMapping2_0.candidateMapKeyNames();
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.name", mapKeyNames.next());
+		assertEquals("state.abbr", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+	}
+	
+	public void testCandidateMapKeyNames2() throws Exception {
+		createTestEntityWithValidNonGenericMapElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping2_0 = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		Iterator<String> mapKeyNames = elementCollectionMapping2_0.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		elementCollectionMapping2_0.setSpecifiedTargetClass("Address");
+		mapKeyNames = elementCollectionMapping2_0.candidateMapKeyNames();
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.name", mapKeyNames.next());
+		assertEquals("state.abbr", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		elementCollectionMapping2_0.setSpecifiedTargetClass("String");
+		mapKeyNames = elementCollectionMapping2_0.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+	}
+	
+	public void testUpdateMapKeyClass() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(elementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+		
+		//set mapKey in the resource model, verify context model does not change
+		attributeResource.addAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		assertNull(elementCollectionMapping.getSpecifiedMapKeyClass());
+		MapKeyClass2_0Annotation mapKeyClassAnnotation = (MapKeyClass2_0Annotation) attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		assertNotNull(mapKeyClassAnnotation);
+				
+		//set mapKey name in the resource model, verify context model updated
+		mapKeyClassAnnotation.setValue("myMapKeyClass");
+		this.getJpaProject().synchronizeContextModel();
+		assertEquals("myMapKeyClass", elementCollectionMapping.getSpecifiedMapKeyClass());
+		assertEquals("myMapKeyClass", mapKeyClassAnnotation.getValue());
+		
+		//set mapKey name to null in the resource model
+		mapKeyClassAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(elementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(mapKeyClassAnnotation.getValue());
+		
+		mapKeyClassAnnotation.setValue("myMapKeyClass");
+		attributeResource.removeAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(elementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+	}
+	
+	public void testModifyMapKeyClass() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(elementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+					
+		//set mapKey  in the context model, verify resource model updated
+		elementCollectionMapping.setSpecifiedMapKeyClass("String");
+		MapKeyClass2_0Annotation mapKeyClass = (MapKeyClass2_0Annotation) attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		assertEquals("String", elementCollectionMapping.getSpecifiedMapKeyClass());
+		assertEquals("String", mapKeyClass.getValue());
+	
+		//set mapKey to null in the context model
+		elementCollectionMapping.setSpecifiedMapKeyClass(null);
+		assertNull(elementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+	}
+
+	public void testDefaultMapKeyClass() throws Exception {
+		createTestEntityWithValidGenericMapElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals("java.lang.Integer", elementCollectionMapping.getDefaultMapKeyClass());
+
+		//test default still the same when specified target entity it set
+		elementCollectionMapping.setSpecifiedMapKeyClass("foo");
+		assertEquals("java.lang.Integer", elementCollectionMapping.getDefaultMapKeyClass());
+	}
+	
+	public void testDefaultMapKeyClassCollectionType() throws Exception {
+		createTestEntityWithGenericBasicElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertNull(elementCollectionMapping.getDefaultMapKeyClass());
+	}
+	
+	public void testMapKeyClass() throws Exception {
+		createTestEntityWithValidGenericMapElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals("java.lang.Integer", elementCollectionMapping.getMapKeyClass());
+
+		elementCollectionMapping.setSpecifiedMapKeyClass("foo");
+		assertEquals("foo", elementCollectionMapping.getMapKeyClass());
+		
+		elementCollectionMapping.setSpecifiedMapKeyClass(null);
+		assertEquals("java.lang.Integer", elementCollectionMapping.getMapKeyClass());
+	}
+
+	public void testOrderColumnDefaults() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		Orderable2_0 orderable = ((Orderable2_0) elementCollectionMapping.getOrderable());
+		assertEquals(false, orderable.isOrderColumnOrdering());
+		assertEquals(true, orderable.isNoOrdering());
+		
+		orderable.setOrderColumnOrdering(true);
+		OrderColumn2_0 orderColumn = orderable.getOrderColumn();
+		assertEquals(true, orderable.isOrderColumnOrdering());
+		assertEquals(null, orderColumn.getSpecifiedName());
+		assertEquals("addresses_ORDER", orderColumn.getDefaultName());
+		assertEquals(TYPE_NAME + "_addresses", orderColumn.getTable());
+		
+		orderColumn.setSpecifiedName("FOO");
+		assertEquals("FOO", orderColumn.getSpecifiedName());
+		assertEquals("addresses_ORDER", orderColumn.getDefaultName());
+		assertEquals(TYPE_NAME + "_addresses", orderColumn.getTable());
+	}
+	
+	public void testGetValueColumn() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+		
+		assertNull(elementCollectionMapping.getValueColumn().getSpecifiedName());
+		assertEquals("id", elementCollectionMapping.getValueColumn().getName());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		ColumnAnnotation column = (ColumnAnnotation) attributeResource.addAnnotation(JPA.COLUMN);
+		column.setName("foo");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals("foo", elementCollectionMapping.getValueColumn().getSpecifiedName());
+		assertEquals("foo", elementCollectionMapping.getValueColumn().getName());
+		assertEquals("id", elementCollectionMapping.getValueColumn().getDefaultName());
+	}
+	
+	public void testSpecifiedAttributeOverrides() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		JavaAttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		
+		ListIterator<JavaAttributeOverride> specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();
+		
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("BAR");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("BAZ");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+	
+		//move an annotation to the resource model and verify the context model is updated
+		attributeResource.moveAnnotation(1, 0, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAZ", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+	
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertFalse(specifiedAttributeOverrides.hasNext());
+	}
+
+	public void testVirtualAttributeOverrides() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertEquals("addresses", attributeResource.getName());
+		assertNull(attributeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+		
+		assertEquals(4, attributeOverrideContainer.virtualOverridesSize());
+		ReadOnlyAttributeOverride defaultAttributeOverride = attributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("city", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_addresses", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		Embeddable embeddable = (Embeddable) classRefs.next().getJavaPersistentType().getMapping();
+		
+		BasicMapping cityMapping = (BasicMapping) embeddable.getPersistentType().getAttributeNamed("city").getMapping();
+		cityMapping.getColumn().setSpecifiedName("FOO");
+		cityMapping.getColumn().setSpecifiedTable("BAR");
+		cityMapping.getColumn().setColumnDefinition("COLUMN_DEF");
+		cityMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		cityMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		cityMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		cityMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+		
+		assertEquals("addresses", attributeResource.getName());
+		assertNull(attributeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+
+		assertEquals(4, attributeOverrideContainer.virtualOverridesSize());
+		defaultAttributeOverride = attributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("FOO", defaultAttributeOverride.getColumn().getName());
+		assertEquals("BAR", defaultAttributeOverride.getColumn().getTable());
+		assertEquals("COLUMN_DEF", defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(false, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(5, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(6, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, defaultAttributeOverride.getColumn().getScale());
+
+		cityMapping.getColumn().setSpecifiedName(null);
+		cityMapping.getColumn().setSpecifiedTable(null);
+		cityMapping.getColumn().setColumnDefinition(null);
+		cityMapping.getColumn().setSpecifiedInsertable(null);
+		cityMapping.getColumn().setSpecifiedUpdatable(null);
+		cityMapping.getColumn().setSpecifiedUnique(null);
+		cityMapping.getColumn().setSpecifiedNullable(null);
+		cityMapping.getColumn().setSpecifiedLength(null);
+		cityMapping.getColumn().setSpecifiedPrecision(null);
+		cityMapping.getColumn().setSpecifiedScale(null);
+		defaultAttributeOverride = attributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("city", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_addresses", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		AttributeOverrideAnnotation annotation = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		annotation.setName("city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(3, attributeOverrideContainer.virtualOverridesSize());
+	}
+	
+	public void testSpecifiedAttributeOverridesSize() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		assertEquals(0, attributeOverrideContainer.specifiedOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("BAR");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(2, attributeOverrideContainer.specifiedOverridesSize());
+	}
+	
+	public void testAttributeOverridesSize() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		assertEquals(4, attributeOverrideContainer.overridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("BAR");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(6, attributeOverrideContainer.overridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(6, attributeOverrideContainer.overridesSize());	
+	}
+	
+	public void testVirtualAttributeOverridesSize() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		assertEquals(4, attributeOverrideContainer.virtualOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(4, attributeOverrideContainer.virtualOverridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(3, attributeOverrideContainer.virtualOverridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("state.name");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(2, attributeOverrideContainer.virtualOverridesSize());
+	}
+
+	public void testAttributeOverrideSetVirtual() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".State");
+				
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		attributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		attributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		Iterator<NestableAnnotation> attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("state.name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		attributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("state.name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		assertEquals("city", attributeOverrideContainer.virtualOverrides().next().getName());
+		assertEquals(3, attributeOverrideContainer.virtualOverridesSize());
+		
+		attributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertFalse(attributeOverrides.hasNext());
+		
+		Iterator<VirtualAttributeOverride> virtualAttributeOverrides = (Iterator<VirtualAttributeOverride>) attributeOverrideContainer.virtualOverrides();
+		assertEquals("city", virtualAttributeOverrides.next().getName());
+		assertEquals("state.name", virtualAttributeOverrides.next().getName());
+		assertEquals("state.abbr", virtualAttributeOverrides.next().getName());
+		assertEquals("zip", virtualAttributeOverrides.next().getName());
+		assertEquals(4, attributeOverrideContainer.virtualOverridesSize());
+	}
+	
+	public void testAttributeOverrideSetVirtual2() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		ListIterator<VirtualAttributeOverride> virtualAttributeOverrides = (ListIterator<VirtualAttributeOverride>) attributeOverrideContainer.virtualOverrides();
+		virtualAttributeOverrides.next();	
+		virtualAttributeOverrides.next().convertToSpecified();
+		attributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		Iterator<NestableAnnotation> attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("state.name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+	}
+	
+	public void testMoveSpecifiedAttributeOverride() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		attributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		attributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		attributeResource.moveAnnotation(1, 0, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		
+		Iterator<NestableAnnotation> attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+
+		assertEquals("state.name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+	}
+	
+	public void testNestedVirtualAttributeOverrides() throws Exception {
+		createTestEntityWithGenericEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".State");
+
+		ListIterator<ClassRef> specifiedClassRefs = getPersistenceUnit().specifiedClassRefs();
+		PersistentType persistentType = specifiedClassRefs.next().getJavaPersistentType();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentType.getAttributeNamed("addresses").getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		
+		assertEquals(4, attributeOverrideContainer.virtualOverridesSize());
+		ListIterator<VirtualAttributeOverride> virtualAttributeOverrides = (ListIterator<VirtualAttributeOverride>) attributeOverrideContainer.virtualOverrides();
+		ReadOnlyAttributeOverride virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("city", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("state.name", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("state.abbr", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("zip", virtualAttributeOverride.getName());
+		assertEquals(false, virtualAttributeOverrides.hasNext());
+
+		
+		PersistentType addressPersistentType = specifiedClassRefs.next().getJavaPersistentType();
+		EmbeddedMapping nestedEmbeddedMapping = (EmbeddedMapping) addressPersistentType.getAttributeNamed("state").getMapping();
+		AttributeOverrideContainer nestedAttributeOverrideContainer = nestedEmbeddedMapping.getAttributeOverrideContainer();
+		assertEquals(2, nestedAttributeOverrideContainer.virtualOverridesSize());
+		virtualAttributeOverrides = (ListIterator<VirtualAttributeOverride>) nestedAttributeOverrideContainer.virtualOverrides();
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("name", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("abbr", virtualAttributeOverride.getName());
+		
+		PersistentType statePersistentType = specifiedClassRefs.next().getJavaPersistentType();
+		BasicMapping abbrMapping = (BasicMapping) statePersistentType.getAttributeNamed("abbr").getMapping();
+		abbrMapping.getColumn().setSpecifiedName("BLAH");
+		abbrMapping.getColumn().setSpecifiedTable("BLAH_TABLE");
+		abbrMapping.getColumn().setColumnDefinition("COLUMN_DEFINITION");
+		abbrMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		abbrMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		abbrMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		abbrMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		abbrMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		abbrMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		abbrMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+
+		//check the nested embedded (Address.state) attribute override to verify it is getting settings from the specified column on State.abbr
+		virtualAttributeOverride = ((EmbeddedMapping) addressPersistentType.getAttributeNamed("state").getMapping()).getAttributeOverrideContainer().getOverrideNamed("abbr");
+		assertEquals("abbr", virtualAttributeOverride.getName());
+		assertEquals("BLAH", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BLAH_TABLE", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals("COLUMN_DEFINITION", virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(false, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(5, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(6, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, virtualAttributeOverride.getColumn().getScale());
+	}
+
+	public void testGetMapKeyColumn() throws Exception {
+		createTestEntityWithValidGenericMapElementCollectionMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) persistentAttribute.getMapping();
+
+		assertNull(elementCollectionMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("addresses_KEY", elementCollectionMapping.getMapKeyColumn().getName());
+		assertEquals(TYPE_NAME + "_addresses", elementCollectionMapping.getMapKeyColumn().getTable());//collection table name
+
+		elementCollectionMapping.getCollectionTable().setSpecifiedName("MY_COLLECTION_TABLE");
+		assertEquals("MY_COLLECTION_TABLE", elementCollectionMapping.getMapKeyColumn().getTable());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		MapKeyColumn2_0Annotation column = (MapKeyColumn2_0Annotation) attributeResource.addAnnotation(JPA2_0.MAP_KEY_COLUMN);
+		column.setName("foo");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals("foo", elementCollectionMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("foo", elementCollectionMapping.getMapKeyColumn().getName());
+		assertEquals("addresses_KEY", elementCollectionMapping.getMapKeyColumn().getDefaultName());
+	}
+
+	public void testMapKeyValueSpecifiedAttributeOverrides() throws Exception {
+		createTestEntityWithEmbeddableKeyAndValueElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddablePropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = elementCollectionMapping.getMapKeyAttributeOverrideContainer();
+		
+		ListIterator<JavaAttributeOverride> specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();
+		
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.BAR");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAZ");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+		ListIterator<JavaAttributeOverride> specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+	
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BLAH");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("BAZ", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		//move an annotation to the resource model and verify the context model is updated
+		attributeResource.moveAnnotation(1, 0, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+	
+		attributeResource.removeAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = attributeOverrideContainer.specifiedOverrides();		
+		assertFalse(specifiedAttributeOverrides.hasNext());
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+	}
+
+	public void testMapKeyValueVirtualAttributeOverrides() throws Exception {
+		createTestEntityWithEmbeddableKeyAndValueElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEmbeddablePropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		AttributeOverrideContainer mapKeyAttributeOverrideContainer = elementCollectionMapping.getMapKeyAttributeOverrideContainer();
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertEquals("parcels", attributeResource.getName());
+		assertNull(attributeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+		
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		ReadOnlyAttributeOverride defaultAttributeOverride = mapKeyAttributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("city", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_parcels", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		Embeddable addressEmbeddable = (Embeddable) classRefs.next().getJavaPersistentType().getMapping();
+		
+		BasicMapping cityMapping = (BasicMapping) addressEmbeddable.getPersistentType().getAttributeNamed("city").getMapping();
+		cityMapping.getColumn().setSpecifiedName("FOO");
+		cityMapping.getColumn().setSpecifiedTable("BAR");
+		cityMapping.getColumn().setColumnDefinition("COLUMN_DEF");
+		cityMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		cityMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		cityMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		cityMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+		
+		assertEquals("parcels", attributeResource.getName());
+		assertNull(attributeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		defaultAttributeOverride = mapKeyAttributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("FOO", defaultAttributeOverride.getColumn().getName());
+		assertEquals("BAR", defaultAttributeOverride.getColumn().getTable());
+		assertEquals("COLUMN_DEF", defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(false, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(5, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(6, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, defaultAttributeOverride.getColumn().getScale());
+
+		cityMapping.getColumn().setSpecifiedName(null);
+		cityMapping.getColumn().setSpecifiedTable(null);
+		cityMapping.getColumn().setColumnDefinition(null);
+		cityMapping.getColumn().setSpecifiedInsertable(null);
+		cityMapping.getColumn().setSpecifiedUpdatable(null);
+		cityMapping.getColumn().setSpecifiedUnique(null);
+		cityMapping.getColumn().setSpecifiedNullable(null);
+		cityMapping.getColumn().setSpecifiedLength(null);
+		cityMapping.getColumn().setSpecifiedPrecision(null);
+		cityMapping.getColumn().setSpecifiedScale(null);
+		defaultAttributeOverride = mapKeyAttributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("city", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_parcels", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		AttributeOverrideAnnotation annotation = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		annotation.setName("key.city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(3, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+	
+		
+		
+		assertEquals(3, attributeOverrideContainer.virtualOverridesSize());
+		defaultAttributeOverride = attributeOverrideContainer.virtualOverrides().next();
+		assertEquals("parcelNumber", defaultAttributeOverride.getName());
+		assertEquals("parcelNumber", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_parcels", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		
+		classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		classRefs.next();
+		Embeddable propertyInfoEmbeddable = (Embeddable) classRefs.next().getJavaPersistentType().getMapping();
+		
+		BasicMapping parcelNumberMapping = (BasicMapping) propertyInfoEmbeddable.getPersistentType().getAttributeNamed("parcelNumber").getMapping();
+		parcelNumberMapping.getColumn().setSpecifiedName("FOO1");
+		parcelNumberMapping.getColumn().setSpecifiedTable("BAR1");
+		parcelNumberMapping.getColumn().setColumnDefinition("COLUMN_DEF1");
+		parcelNumberMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		parcelNumberMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		parcelNumberMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		parcelNumberMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		parcelNumberMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		parcelNumberMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		parcelNumberMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+		
+		assertEquals("parcels", attributeResource.getName());
+
+		assertEquals(3, attributeOverrideContainer.virtualOverridesSize());
+		defaultAttributeOverride = attributeOverrideContainer.virtualOverrides().next();
+		assertEquals("parcelNumber", defaultAttributeOverride.getName());
+		assertEquals("FOO1", defaultAttributeOverride.getColumn().getName());
+		assertEquals("BAR1", defaultAttributeOverride.getColumn().getTable());
+		assertEquals("COLUMN_DEF1", defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(false, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(5, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(6, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, defaultAttributeOverride.getColumn().getScale());
+
+		parcelNumberMapping.getColumn().setSpecifiedName(null);
+		parcelNumberMapping.getColumn().setSpecifiedTable(null);
+		parcelNumberMapping.getColumn().setColumnDefinition(null);
+		parcelNumberMapping.getColumn().setSpecifiedInsertable(null);
+		parcelNumberMapping.getColumn().setSpecifiedUpdatable(null);
+		parcelNumberMapping.getColumn().setSpecifiedUnique(null);
+		parcelNumberMapping.getColumn().setSpecifiedNullable(null);
+		parcelNumberMapping.getColumn().setSpecifiedLength(null);
+		parcelNumberMapping.getColumn().setSpecifiedPrecision(null);
+		parcelNumberMapping.getColumn().setSpecifiedScale(null);
+		defaultAttributeOverride = attributeOverrideContainer.virtualOverrides().next();
+		assertEquals("parcelNumber", defaultAttributeOverride.getName());
+		assertEquals("parcelNumber", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_parcels", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		annotation = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		annotation.setName("value.parcelNumber");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(2, attributeOverrideContainer.virtualOverridesSize());
+	}
+	
+	public void testMapKeyValueSpecifiedAttributeOverridesSize() throws Exception {
+		createTestEntityWithEmbeddableKeyAndValueElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEmbeddablePropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		AttributeOverrideContainer valueAttributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		AttributeOverrideContainer mapKeyAttributeOverrideContainer = elementCollectionMapping.getMapKeyAttributeOverrideContainer();
+		assertEquals(0, valueAttributeOverrideContainer.specifiedOverridesSize());
+		assertEquals(0, mapKeyAttributeOverrideContainer.specifiedOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAR");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.FOO2");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(2, valueAttributeOverrideContainer.specifiedOverridesSize());
+		assertEquals(1, mapKeyAttributeOverrideContainer.specifiedOverridesSize());
+	}
+	
+	public void testMapKeyValueAttributeOverridesSize() throws Exception {
+		createTestEntityWithEmbeddableKeyAndValueElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEmbeddablePropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		AttributeOverrideContainer valueAttributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		AttributeOverrideContainer mapKeyAttributeOverrideContainer = elementCollectionMapping.getMapKeyAttributeOverrideContainer();
+		assertEquals(4, mapKeyAttributeOverrideContainer.overridesSize());
+		assertEquals(3, valueAttributeOverrideContainer.overridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAR");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.FOO2");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(5, mapKeyAttributeOverrideContainer.overridesSize());
+		assertEquals(5, valueAttributeOverrideContainer.overridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(5, mapKeyAttributeOverrideContainer.overridesSize());
+		assertEquals(6, valueAttributeOverrideContainer.overridesSize());
+	}
+	
+	public void testMapKeyValueVirtualAttributeOverridesSize() throws Exception {
+		createTestEntityWithEmbeddableKeyAndValueElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEmbeddablePropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		AttributeOverrideContainer valueAttributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		AttributeOverrideContainer mapKeyAttributeOverrideContainer = elementCollectionMapping.getMapKeyAttributeOverrideContainer();
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		assertEquals(3, valueAttributeOverrideContainer.virtualOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAR");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		assertEquals(3, valueAttributeOverrideContainer.virtualOverridesSize());
+
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.city");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.parcelNumber");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(3, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		assertEquals(2, valueAttributeOverrideContainer.virtualOverridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.state.name");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("size");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(2, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		assertEquals(1, valueAttributeOverrideContainer.virtualOverridesSize());
+	}
+
+	public void testMapKeyValueAttributeOverrideSetVirtual() throws Exception {
+		createTestEntityWithEmbeddableKeyAndValueElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEmbeddablePropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+				
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		AttributeOverrideContainer valueAttributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		AttributeOverrideContainer mapKeyAttributeOverrideContainer = elementCollectionMapping.getMapKeyAttributeOverrideContainer();
+		valueAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		valueAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		Iterator<NestableAnnotation> attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("value.parcelNumber", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("value.size", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.state.name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		valueAttributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		mapKeyAttributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("value.size", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.state.name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		assertEquals("parcelNumber", valueAttributeOverrideContainer.virtualOverrides().next().getName());
+		assertEquals(2, valueAttributeOverrideContainer.virtualOverridesSize());
+		assertEquals("city", mapKeyAttributeOverrideContainer.virtualOverrides().next().getName());
+		assertEquals(3, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		
+		valueAttributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		mapKeyAttributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertFalse(attributeOverrides.hasNext());
+		
+		Iterator<VirtualAttributeOverride> virtualAttributeOverrides = (ListIterator<VirtualAttributeOverride>) valueAttributeOverrideContainer.virtualOverrides();
+		assertEquals("parcelNumber", virtualAttributeOverrides.next().getName());
+		assertEquals("size", virtualAttributeOverrides.next().getName());
+		assertEquals("tax", virtualAttributeOverrides.next().getName());
+		assertEquals(3, valueAttributeOverrideContainer.virtualOverridesSize());
+		
+		virtualAttributeOverrides = (ListIterator<VirtualAttributeOverride>) mapKeyAttributeOverrideContainer.virtualOverrides();
+		assertEquals("city", virtualAttributeOverrides.next().getName());
+		assertEquals("state.name", virtualAttributeOverrides.next().getName());
+		assertEquals("state.abbr", virtualAttributeOverrides.next().getName());
+		assertEquals("zip", virtualAttributeOverrides.next().getName());
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+	}
+	
+	
+	public void testMapKeyValueMoveSpecifiedAttributeOverride() throws Exception {
+		createTestEntityWithEmbeddableKeyAndValueElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEmbeddablePropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_EMBEDDABLE_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		AttributeOverrideContainer valueAttributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		AttributeOverrideContainer mapKeyAttributeOverrideContainer = elementCollectionMapping.getMapKeyAttributeOverrideContainer();
+		valueAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		valueAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		ListIterator<AttributeOverride> specifiedOverrides = (ListIterator<AttributeOverride>) valueAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("parcelNumber", specifiedOverrides.next().getName());
+		assertEquals("size", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+		
+		specifiedOverrides = (ListIterator<AttributeOverride>) mapKeyAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("city", specifiedOverrides.next().getName());
+		assertEquals("state.name", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		attributeResource.moveAnnotation(1, 0, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+
+		Iterator<NestableAnnotation> attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+
+		assertEquals("value.size", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("value.parcelNumber", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.state.name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		specifiedOverrides = (ListIterator<AttributeOverride>) valueAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("size", specifiedOverrides.next().getName());
+		assertEquals("parcelNumber", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+		
+		specifiedOverrides = (ListIterator<AttributeOverride>) mapKeyAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("city", specifiedOverrides.next().getName());
+		assertEquals("state.name", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+		
+		
+		attributeResource.moveAnnotation(3, 2, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+
+		assertEquals("value.size", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("value.parcelNumber", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.state.name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		specifiedOverrides = (ListIterator<AttributeOverride>) valueAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("size", specifiedOverrides.next().getName());
+		assertEquals("parcelNumber", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+		
+		specifiedOverrides = (ListIterator<AttributeOverride>) mapKeyAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("state.name", specifiedOverrides.next().getName());
+		assertEquals("city", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+	}
+	
+	public void testSelfReferentialElementCollection() throws Exception {
+		createSelfReferentialElementCollection();
+		addXmlClassRef(PACKAGE_NAME + ".Foo");
+		
+		//If there is a StackOverflowError you will not be able to get the mapping
+		JavaElementCollectionMapping2_0 elementCollectionMapping = (JavaElementCollectionMapping2_0) getJavaPersistentType().getAttributeNamed("elementCollection").getMapping();
+		assertFalse(elementCollectionMapping.allOverridableAttributeMappingNames().hasNext());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaEntityTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaEntityTests.java
new file mode 100644
index 0000000..5325595
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaEntityTests.java
@@ -0,0 +1,1813 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AssociationOverride;
+import org.eclipse.jpt.jpa.core.context.AssociationOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.AttributeOverride;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.InheritanceType;
+import org.eclipse.jpt.jpa.core.context.MappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.VirtualAssociationOverride;
+import org.eclipse.jpt.jpa.core.context.VirtualAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaAssociationOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.context.java.JavaVirtualAssociationOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaVirtualAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+import org.eclipse.jpt.jpa.core.jpa2.MappingKeys2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cacheable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.CacheableHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.PersistenceUnit2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.SharedCacheMode;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.Cacheable2_0Annotation;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.resource.java.AssociationOverrideAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.AssociationOverridesAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.AttributeOverrideAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.AttributeOverridesAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.NestableAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.EclipseLinkMappingKeys;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.EclipseLink2_0ContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0JavaEntityTests extends EclipseLink2_0ContextModelTestCase
+{
+	protected static final String SUB_TYPE_NAME = "AnnotationTestTypeChild";
+	protected static final String FULLY_QUALIFIED_SUB_TYPE_NAME = PACKAGE_NAME + "." + SUB_TYPE_NAME;
+	
+	
+	public EclipseLink2_0JavaEntityTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestEntity() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+		});
+	}
+
+	private ICompilationUnit createTestMappedSuperclass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, JPA.ONE_TO_ONE, JPA.MANY_TO_ONE, JPA.ONE_TO_MANY, JPA.MANY_TO_MANY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass");
+			}
+			
+			@Override
+			public void appendGetIdMethodAnnotationTo(StringBuilder sb) {
+				sb.append("private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToOne");
+				sb.append(CR);
+				sb.append("    private int address;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToOne");
+				sb.append(CR);
+				sb.append("    private int address2;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToMany");
+				sb.append(CR);
+				sb.append("    private int address3;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany");
+				sb.append(CR);
+				sb.append("    private int address4;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestAbstractEntityTablePerClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.INHERITANCE, JPA.INHERITANCE_TYPE, JPA.ONE_TO_ONE, JPA.MANY_TO_ONE, JPA.ONE_TO_MANY, JPA.MANY_TO_MANY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+				sb.append("@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)");
+				sb.append("abstract");
+			}
+			
+			@Override
+			public void appendGetIdMethodAnnotationTo(StringBuilder sb) {
+				sb.append("private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToOne");
+				sb.append(CR);
+				sb.append("    private int address;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToOne");
+				sb.append(CR);
+				sb.append("    private int address2;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToMany");
+				sb.append(CR);
+				sb.append("    private int address3;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany");
+				sb.append(CR);
+				sb.append("    private int address4;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+
+	private void createTestSubType() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("AnnotationTestTypeChild").append(" ");
+				sb.append("extends " + TYPE_NAME + " ");
+				sb.append("{}").append(CR);
+			}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "AnnotationTestTypeChild.java", sourceWriter);
+	}
+	
+	private void createTestMappedSuperclassCustomer() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.MAPPED_SUPERCLASS);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@MappedSuperclass");
+				sb.append(CR);
+				sb.append("public class ").append("Customer ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private String id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+			sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Customer.java", sourceWriter);
+	}
+	private void createTestMappedSuperclassCustomerWithElementCollection() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.MAPPED_SUPERCLASS);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ELEMENT_COLLECTION);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@MappedSuperclass");
+				sb.append(CR);
+				sb.append("public class ").append("Customer ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private String id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);
+				sb.append("    private java.util.Collection<Address> address;").append(CR);
+				sb.append(CR);
+			sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Customer.java", sourceWriter);
+	}
+	
+	private void createTestEntityLongTimeCustomer() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("LongTimeCustomer extends Customer ");
+				sb.append("{}");
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "LongTimeCustomer.java", sourceWriter);
+	}
+
+
+	private void createTestEmbeddableAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ONE_TO_ONE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String street;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToOne").append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private ZipCode zipCode;").append(CR);
+				sb.append(CR);
+			sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+	
+	private void createTestEmbeddableZipCode() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("ZipCode").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String zip;").append(CR);
+				sb.append(CR);
+				sb.append("    private String plusfour;").append(CR);
+				sb.append(CR);
+			sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "ZipCode.java", sourceWriter);
+	}
+
+	public void testAttributeMappingKeyAllowed() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Entity entity = (Entity) getJavaPersistentType().getMapping();
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.EMBEDDED_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(EclipseLinkMappingKeys.BASIC_COLLECTION_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(EclipseLinkMappingKeys.BASIC_MAP_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(EclipseLinkMappingKeys.TRANSFORMATION_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(EclipseLinkMappingKeys.VARIABLE_ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY));
+	}
+	
+	public void testOverridableAttributes() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		Iterator<String> overridableAttributes = getJavaEntity().overridableAttributeNames();
+		assertFalse(overridableAttributes.hasNext());
+		
+		
+		getJavaEntity().setSpecifiedInheritanceStrategy(InheritanceType.TABLE_PER_CLASS);
+		
+		overridableAttributes = getJavaEntity().overridableAttributeNames();		
+		assertEquals("id", overridableAttributes.next());
+		assertEquals("name", overridableAttributes.next());
+		assertFalse(overridableAttributes.hasNext());
+	}
+
+	public void testOverridableAttributeNames() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		Iterator<String> overridableAttributeNames = getJavaEntity().overridableAttributeNames();
+		assertFalse(overridableAttributeNames.hasNext());
+		
+		
+		getJavaEntity().setSpecifiedInheritanceStrategy(InheritanceType.TABLE_PER_CLASS);
+		
+		overridableAttributeNames = getJavaEntity().overridableAttributeNames();
+		assertEquals("id", overridableAttributeNames.next());
+		assertEquals("name", overridableAttributeNames.next());
+		assertFalse(overridableAttributeNames.hasNext());
+	}
+
+	public void testAllOverridableAttributes() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		Iterator<String> overridableAttributes = getJavaEntity().allOverridableAttributeNames();
+		assertEquals("id", overridableAttributes.next());
+		assertEquals("name", overridableAttributes.next());
+		assertEquals("foo", overridableAttributes.next());
+		assertFalse(overridableAttributes.hasNext());
+	}
+	
+	public void testAllOverridableAttributesTablePerClass() throws Exception {
+		createTestAbstractEntityTablePerClass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		Iterator<String> overridableAttributes = getJavaEntity().allOverridableAttributeNames();
+		assertEquals("id", overridableAttributes.next());
+		assertEquals("name", overridableAttributes.next());
+		assertEquals("foo", overridableAttributes.next());
+		assertFalse(overridableAttributes.hasNext());
+		
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		JavaEntity abstractEntity = (JavaEntity) classRefs.next().getJavaPersistentType().getMapping();
+		overridableAttributes = abstractEntity.allOverridableAttributeNames();
+		assertEquals("id", overridableAttributes.next());
+		assertEquals("name", overridableAttributes.next());
+		assertEquals("foo", overridableAttributes.next());
+		assertFalse(overridableAttributes.hasNext());
+	}
+	
+	public void testAllOverridableAssociationsTablePerClass() throws Exception {
+		createTestAbstractEntityTablePerClass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		Iterator<String> overridableAssociations = getJavaEntity().allOverridableAssociationNames();
+		assertEquals("address", overridableAssociations.next());
+		assertEquals("address2", overridableAssociations.next());
+		assertEquals("address3", overridableAssociations.next());
+		assertEquals("address4", overridableAssociations.next());
+		assertFalse(overridableAssociations.hasNext());
+		
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		JavaEntity abstractEntity = (JavaEntity) classRefs.next().getJavaPersistentType().getMapping();
+		overridableAssociations = abstractEntity.allOverridableAssociationNames();
+		assertEquals("address", overridableAssociations.next());
+		assertEquals("address2", overridableAssociations.next());
+		assertEquals("address3", overridableAssociations.next());
+		assertEquals("address4", overridableAssociations.next());
+		assertFalse(overridableAssociations.hasNext());
+	}
+
+	public void testAllOverridableAttributesMappedSuperclassInOrmXml() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Iterator<String> overridableAttributes = getJavaEntity().allOverridableAttributeNames();
+		assertEquals("id", overridableAttributes.next());
+		assertEquals("name", overridableAttributes.next());
+		assertEquals("foo", overridableAttributes.next());
+		assertFalse(overridableAttributes.hasNext());
+	}
+
+	public void testAllOverridableAttributeNames() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		Iterator<String> overridableAttributeNames = getJavaEntity().allOverridableAttributeNames();
+		assertEquals("id", overridableAttributeNames.next());
+		assertEquals("name", overridableAttributeNames.next());
+		assertEquals("foo", overridableAttributeNames.next());
+		assertFalse(overridableAttributeNames.hasNext());
+	}
+		
+	public void testSpecifiedAttributeOverrides() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+		ListIterator<JavaAttributeOverride> specifiedAttributeOverrides = (ListIterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();
+		
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) typeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = (ListIterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		attributeOverride = (AttributeOverrideAnnotation) typeResource.addAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("BAR");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = (ListIterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+
+		attributeOverride = (AttributeOverrideAnnotation) typeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("BAZ");
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = (ListIterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+	
+		//move an annotation to the resource model and verify the context model is updated
+		typeResource.moveAnnotation(1, 0, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = (ListIterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAZ", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		typeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = (ListIterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+	
+		typeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = (ListIterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		
+		typeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAttributeOverrides = (ListIterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();		
+		assertFalse(specifiedAttributeOverrides.hasNext());
+	}
+
+	public void testDefaultAttributeOverrides() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		JavaEntity javaEntity = (JavaEntity) classRefs.next().getJavaPersistentType().getMapping();
+		AttributeOverrideContainer overrideContainer = javaEntity.getAttributeOverrideContainer();
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+		assertNull(typeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(typeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+		
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		VirtualAttributeOverride virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("id", virtualAttributeOverride.getColumn().getName());
+		assertEquals(SUB_TYPE_NAME, virtualAttributeOverride.getColumn().getTable());
+		
+
+		MappedSuperclass mappedSuperclass = (MappedSuperclass) getJavaPersistentType().getMapping();
+		
+		BasicMapping idMapping = (BasicMapping) mappedSuperclass.getPersistentType().getAttributeNamed("id").getMapping();
+		idMapping.getColumn().setSpecifiedName("FOO");
+		idMapping.getColumn().setSpecifiedTable("BAR");
+		
+		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+		assertNull(typeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(typeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("FOO", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BAR", virtualAttributeOverride.getColumn().getTable());
+
+		idMapping.getColumn().setSpecifiedName(null);
+		idMapping.getColumn().setSpecifiedTable(null);
+		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+		assertNull(typeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(typeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+
+		virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("id", virtualAttributeOverride.getColumn().getName());
+		assertEquals(SUB_TYPE_NAME, virtualAttributeOverride.getColumn().getTable());
+		
+		virtualAttributeOverride.convertToSpecified();
+		assertEquals(2, overrideContainer.virtualOverridesSize());
+	}
+	
+	public void testDefaultAttributeOverridesEntityHierachy() throws Exception {
+		createTestAbstractEntityTablePerClass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		JavaEntity javaEntity = (JavaEntity) classRefs.next().getJavaPersistentType().getMapping();
+		AttributeOverrideContainer overrideContainer = javaEntity.getAttributeOverrideContainer();
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+		assertNull(typeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(typeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+		
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		VirtualAttributeOverride virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("id", virtualAttributeOverride.getColumn().getName());
+		assertEquals(SUB_TYPE_NAME, virtualAttributeOverride.getColumn().getTable());
+		
+
+		JavaEntity superclass = (JavaEntity) getJavaPersistentType().getMapping();
+		
+		BasicMapping idMapping = (BasicMapping) superclass.getPersistentType().getAttributeNamed("id").getMapping();
+		idMapping.getColumn().setSpecifiedName("FOO");
+		idMapping.getColumn().setSpecifiedTable("BAR");
+		
+		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+		assertNull(typeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(typeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("FOO", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BAR", virtualAttributeOverride.getColumn().getTable());
+
+		idMapping.getColumn().setSpecifiedName(null);
+		idMapping.getColumn().setSpecifiedTable(null);
+		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+		assertNull(typeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(typeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+
+		virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("id", virtualAttributeOverride.getColumn().getName());
+		assertEquals(SUB_TYPE_NAME, virtualAttributeOverride.getColumn().getTable());
+		
+		virtualAttributeOverride.convertToSpecified();
+		assertEquals(2, overrideContainer.virtualOverridesSize());
+	}
+	
+	public void testSpecifiedAttributeOverridesSize() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+		assertEquals(0, overrideContainer.specifiedOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) typeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) typeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("BAR");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(2, overrideContainer.specifiedOverridesSize());
+	}
+	
+	public void testDefaultAttributeOverridesSize() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+		
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(2, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(1, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(0, overrideContainer.virtualOverridesSize());
+	}
+	
+	public void testAttributeOverridesSize() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+		
+		assertEquals(3, overrideContainer.overridesSize());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(3, overrideContainer.overridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(3, overrideContainer.overridesSize());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		AttributeOverrideAnnotation annotation = (AttributeOverrideAnnotation) typeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		annotation.setName("bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(4, overrideContainer.overridesSize());
+	}
+
+	public void testAttributeOverrideSetVirtual() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+				
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		Iterator<NestableAnnotation> attributeOverrides = typeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("id", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+	}
+	
+	public void testAttributeOverrideSetVirtual2() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+		
+		ListIterator<JavaVirtualAttributeOverride> virtualAttributeOverrides = (ListIterator<JavaVirtualAttributeOverride>) overrideContainer.virtualOverrides();
+		virtualAttributeOverrides.next();
+		virtualAttributeOverrides.next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		Iterator<NestableAnnotation> attributeOverrides = typeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("name", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("id", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+	}
+	
+	public void testAttributeOverrideSetVirtualTrue() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+				
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		assertEquals(3, CollectionTools.size(typeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME)));
+
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		
+		Iterator<NestableAnnotation> attributeOverrideResources = typeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("name", ((AttributeOverrideAnnotation) attributeOverrideResources.next()).getName());		
+		assertEquals("foo", ((AttributeOverrideAnnotation) attributeOverrideResources.next()).getName());
+		assertFalse(attributeOverrideResources.hasNext());
+		
+		Iterator<JavaAttributeOverride> attributeOverrides = (Iterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("name", attributeOverrides.next().getName());		
+		assertEquals("foo", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+	
+		
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrideResources = typeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("foo", ((AttributeOverrideAnnotation) attributeOverrideResources.next()).getName());		
+		assertFalse(attributeOverrideResources.hasNext());
+
+		attributeOverrides = (Iterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("foo", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+
+		
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrideResources = typeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertFalse(attributeOverrideResources.hasNext());
+		attributeOverrides = (Iterator<JavaAttributeOverride>) overrideContainer.specifiedOverrides();
+		assertFalse(attributeOverrides.hasNext());
+
+		assertNull(typeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMoveSpecifiedAttributeOverride() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		
+		Iterator<NestableAnnotation> javaAttributeOverrides = typeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals(3, CollectionTools.size(javaAttributeOverrides));
+		
+		
+		overrideContainer.moveSpecifiedOverride(2, 0);
+		ListIterator<AttributeOverride> attributeOverrides = (ListIterator<AttributeOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("name", attributeOverrides.next().getName());
+		assertEquals("foo", attributeOverrides.next().getName());
+		assertEquals("id", attributeOverrides.next().getName());
+
+		javaAttributeOverrides = typeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("name", ((AttributeOverrideAnnotation) javaAttributeOverrides.next()).getName());
+		assertEquals("foo", ((AttributeOverrideAnnotation) javaAttributeOverrides.next()).getName());
+		assertEquals("id", ((AttributeOverrideAnnotation) javaAttributeOverrides.next()).getName());
+
+
+		overrideContainer.moveSpecifiedOverride(0, 1);
+		attributeOverrides = (ListIterator<AttributeOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("foo", attributeOverrides.next().getName());
+		assertEquals("name", attributeOverrides.next().getName());
+		assertEquals("id", attributeOverrides.next().getName());
+
+		javaAttributeOverrides = typeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("foo", ((AttributeOverrideAnnotation) javaAttributeOverrides.next()).getName());
+		assertEquals("name", ((AttributeOverrideAnnotation) javaAttributeOverrides.next()).getName());
+		assertEquals("id", ((AttributeOverrideAnnotation) javaAttributeOverrides.next()).getName());
+	}
+//	
+	public void testUpdateSpecifiedAttributeOverrides() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+	
+		((AttributeOverrideAnnotation) typeResource.addAnnotation(0, AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME)).setName("FOO");
+		((AttributeOverrideAnnotation) typeResource.addAnnotation(1, AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME)).setName("BAR");
+		((AttributeOverrideAnnotation) typeResource.addAnnotation(2, AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME)).setName("BAZ");
+		getJpaProject().synchronizeContextModel();
+			
+		ListIterator<AttributeOverride> attributeOverrides = (ListIterator<AttributeOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		typeResource.moveAnnotation(2, 0, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		attributeOverrides = (ListIterator<AttributeOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+	
+		typeResource.moveAnnotation(0, 1, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		attributeOverrides = (ListIterator<AttributeOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+	
+		typeResource.removeAnnotation(1,  AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		attributeOverrides = (ListIterator<AttributeOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+	
+		typeResource.removeAnnotation(1,  AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		attributeOverrides = (ListIterator<AttributeOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		typeResource.removeAnnotation(0,  AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		attributeOverrides = (ListIterator<AttributeOverride>) overrideContainer.specifiedOverrides();
+		assertFalse(attributeOverrides.hasNext());
+	}
+
+	public void testAttributeOverrideIsVirtual() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AttributeOverrideContainer overrideContainer = getJavaEntity().getAttributeOverrideContainer();
+		
+		ListIterator<JavaVirtualAttributeOverride> virtualAttributeOverrides = (ListIterator<JavaVirtualAttributeOverride>) overrideContainer.virtualOverrides();	
+		JavaVirtualAttributeOverride virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("name", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+		
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("foo", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+		assertFalse(virtualAttributeOverrides.hasNext());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		AttributeOverride specifiedAttributeOverride = overrideContainer.specifiedOverrides().next();
+		assertFalse(specifiedAttributeOverride.isVirtual());
+		
+		
+		virtualAttributeOverrides = (ListIterator<JavaVirtualAttributeOverride>) overrideContainer.virtualOverrides();	
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("name", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+		
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("foo", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+		assertFalse(virtualAttributeOverrides.hasNext());
+	}
+	
+	
+	public void testOverridableAssociations() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<String> overridableAssociations = getJavaEntity().overridableAssociationNames();
+		assertFalse(overridableAssociations.hasNext());
+	}
+
+	public void testOverridableAssociationNames() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<String> overridableAssociationNames = getJavaEntity().overridableAssociationNames();
+		assertFalse(overridableAssociationNames.hasNext());
+	}
+	
+//	//TODO add all mapping types to the mapped superclass to test which ones are overridable
+	public void testAllOverridableAssociationNames() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		Iterator<String> overridableAssociationNames = getJavaEntity().allOverridableAssociationNames();
+		assertEquals("address", overridableAssociationNames.next());
+		assertEquals("address2", overridableAssociationNames.next());
+		assertEquals("address3", overridableAssociationNames.next());
+		assertEquals("address4", overridableAssociationNames.next());
+		assertFalse(overridableAssociationNames.hasNext());
+	}
+		
+	public void testAllOverridableAssociationsMappedSuperclassInOrmXml() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Iterator<String> overridableAssociations = getJavaEntity().allOverridableAssociationNames();
+		assertEquals("address", overridableAssociations.next());
+		assertEquals("address2", overridableAssociations.next());
+		assertEquals("address3", overridableAssociations.next());
+		assertEquals("address4", overridableAssociations.next());
+		assertFalse(overridableAssociations.hasNext());
+	}
+
+	public void testSpecifiedAssociationOverrides() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+		ListIterator<JavaAssociationOverride> specifiedAssociationOverrides = (ListIterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+
+		//add an annotation to the resource model and verify the context model is updated
+		AssociationOverrideAnnotation associationOverride = (AssociationOverrideAnnotation) typeResource.addAnnotation(0, JPA.ASSOCIATION_OVERRIDE, JPA.ASSOCIATION_OVERRIDES);
+		associationOverride.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		specifiedAssociationOverrides = (ListIterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+		associationOverride = (AssociationOverrideAnnotation) typeResource.addAnnotation(1, JPA.ASSOCIATION_OVERRIDE, JPA.ASSOCIATION_OVERRIDES);
+		associationOverride.setName("BAR");
+		getJpaProject().synchronizeContextModel();
+		specifiedAssociationOverrides = (ListIterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+
+		associationOverride = (AssociationOverrideAnnotation) typeResource.addAnnotation(0, JPA.ASSOCIATION_OVERRIDE, JPA.ASSOCIATION_OVERRIDES);
+		associationOverride.setName("BAZ");
+		getJpaProject().synchronizeContextModel();
+		specifiedAssociationOverrides = (ListIterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAssociationOverrides.next().getName());
+		assertEquals("FOO", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+	
+		//move an annotation to the resource model and verify the context model is updated
+		typeResource.moveAnnotation(1, 0, JPA.ASSOCIATION_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAssociationOverrides = (ListIterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAZ", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+		typeResource.removeAnnotation(0, JPA.ASSOCIATION_OVERRIDE, JPA.ASSOCIATION_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAssociationOverrides = (ListIterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+	
+		typeResource.removeAnnotation(0, JPA.ASSOCIATION_OVERRIDE, JPA.ASSOCIATION_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAssociationOverrides = (ListIterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();		
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+		
+		typeResource.removeAnnotation(0, JPA.ASSOCIATION_OVERRIDE, JPA.ASSOCIATION_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedAssociationOverrides = (ListIterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();		
+		assertFalse(specifiedAssociationOverrides.hasNext());
+	}
+
+	public void testVirtualAssociationOverrides() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		JavaEntity javaEntity = (JavaEntity) classRefs.next().getJavaPersistentType().getMapping();
+		AssociationOverrideContainer overrideContainer = javaEntity.getAssociationOverrideContainer();
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+		assertNull(typeResource.getAnnotation(AssociationOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(typeResource.getAnnotation(AssociationOverridesAnnotation.ANNOTATION_NAME));
+		
+		assertEquals(4, overrideContainer.virtualOverridesSize());
+		VirtualAssociationOverride virtualAssociationOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("address", virtualAssociationOverride.getName());
+		
+
+		//MappedSuperclass mappedSuperclass = (MappedSuperclass) javaPersistentType().getMapping();
+		//BasicMapping idMapping = (BasicMapping) mappedSuperclass.persistentType().attributeNamed("id").getMapping();
+		//idMapping.getColumn().setSpecifiedName("FOO");
+		//idMapping.getColumn().setSpecifiedTable("BAR");
+		
+		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+		assertNull(typeResource.getAnnotation(AssociationOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(typeResource.getAnnotation(AssociationOverridesAnnotation.ANNOTATION_NAME));
+
+		assertEquals(4, overrideContainer.virtualOverridesSize());
+		virtualAssociationOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("address", virtualAssociationOverride.getName());
+
+		//idMapping.getColumn().setSpecifiedName(null);
+		//idMapping.getColumn().setSpecifiedTable(null);
+		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+		assertNull(typeResource.getAnnotation(AssociationOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(typeResource.getAnnotation(AssociationOverridesAnnotation.ANNOTATION_NAME));
+
+		virtualAssociationOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("address", virtualAssociationOverride.getName());
+		
+		virtualAssociationOverride.convertToSpecified();
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		
+		
+		
+//		//TODO joinColumns for default association overrides
+////	IJoinColumn defaultJoinColumn = defaultAssociationOverride.joinColumns().next();
+////	assertEquals("address", defaultJoinColumn.getName());
+////	assertEquals("address", defaultJoinColumn.getReferencedColumnName());
+////	assertEquals(SUB_TYPE_NAME, defaultJoinColumn.getTable());
+////	
+////
+////	IMappedSuperclass mappedSuperclass = (IMappedSuperclass) javaPersistentType().getMapping();
+////	
+////	IOneToOneMapping addressMapping = (IOneToOneMapping) mappedSuperclass.persistentType().attributeNamed("address").getMapping();
+////	IJoinColumn joinColumn = addressMapping.addSpecifiedJoinColumn(0);
+////	joinColumn.setSpecifiedName("FOO");
+////	joinColumn.setSpecifiedReferencedColumnName("BAR");
+////	joinColumn.setSpecifiedTable("BAZ");
+////	
+////	assertEquals(SUB_TYPE_NAME, typeResource.getName());
+////	assertNull(typeResource.annotation(AssociationOverride.ANNOTATION_NAME));
+////	assertNull(typeResource.annotation(AssociationOverrides.ANNOTATION_NAME));
+////
+////	assertEquals(1, CollectionTools.size(javaEntity.defaultAssociationOverrides()));
+////	defaultAssociationOverride = javaEntity.defaultAssociationOverrides().next();
+////	assertEquals("address", defaultAssociationOverride.getName());
+////	assertEquals("FOO", defaultJoinColumn.getName());
+////	assertEquals("BAR", defaultJoinColumn.getReferencedColumnName());
+////	assertEquals("BAZ", defaultJoinColumn.getTable());
+////
+////	joinColumn.setSpecifiedName(null);
+////	joinColumn.setSpecifiedReferencedColumnName(null);
+////	joinColumn.setSpecifiedTable(null);
+////	assertEquals(SUB_TYPE_NAME, typeResource.getName());
+////	assertNull(typeResource.annotation(AssociationOverride.ANNOTATION_NAME));
+////	assertNull(typeResource.annotation(AssociationOverrides.ANNOTATION_NAME));
+////
+////	defaultAssociationOverride = javaEntity.defaultAssociationOverrides().next();
+////	assertEquals("address", defaultJoinColumn.getName());
+////	assertEquals("address", defaultJoinColumn.getReferencedColumnName());
+////	assertEquals(SUB_TYPE_NAME, defaultJoinColumn.getTable());
+////	
+////	javaEntity.addSpecifiedAssociationOverride(0).setName("address");
+////	assertEquals(0, CollectionTools.size(javaEntity.defaultAssociationOverrides()));
+
+	}
+	
+	public void testSpecifiedAssociationOverridesSize() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+		
+		assertEquals(0, overrideContainer.specifiedOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+
+		//add an annotation to the resource model and verify the context model is updated
+		AssociationOverrideAnnotation associationOverride = (AssociationOverrideAnnotation) typeResource.addAnnotation(0, JPA.ASSOCIATION_OVERRIDE, JPA.ASSOCIATION_OVERRIDES);
+		associationOverride.setName("FOO");
+		associationOverride = (AssociationOverrideAnnotation) typeResource.addAnnotation(0, JPA.ASSOCIATION_OVERRIDE, JPA.ASSOCIATION_OVERRIDES);
+		associationOverride.setName("BAR");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(2, overrideContainer.specifiedOverridesSize());
+	}
+	
+	public void testVirtualAssociationOverridesSize() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+		
+		assertEquals(4, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(2, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(1, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(0, overrideContainer.virtualOverridesSize());
+	}
+	
+	public void testAssociationOverridesSize() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+		
+		assertEquals(4, overrideContainer.overridesSize());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(4, overrideContainer.overridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(4, overrideContainer.overridesSize());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		AssociationOverrideAnnotation annotation = (AssociationOverrideAnnotation) typeResource.addAnnotation(0, JPA.ASSOCIATION_OVERRIDE, JPA.ASSOCIATION_OVERRIDES);
+		annotation.setName("bar");	
+		getJpaProject().synchronizeContextModel();
+		assertEquals(5, overrideContainer.overridesSize());
+	}
+
+	public void testAssociationOverrideSetVirtual() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+				
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		Iterator<NestableAnnotation> associationOverrides = typeResource.annotations(AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("address", ((AssociationOverrideAnnotation) associationOverrides.next()).getName());
+		assertEquals("address2", ((AssociationOverrideAnnotation) associationOverrides.next()).getName());
+		assertFalse(associationOverrides.hasNext());
+	}
+	
+	public void testAssociationOverrideSetVirtual2() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+		
+		ListIterator<JavaVirtualAssociationOverride> virtualAssociationOverrides = (ListIterator<JavaVirtualAssociationOverride>) overrideContainer.virtualOverrides();
+		virtualAssociationOverrides.next();
+		virtualAssociationOverrides.next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		Iterator<NestableAnnotation> associationOverrides = typeResource.annotations(AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("address2", ((AssociationOverrideAnnotation) associationOverrides.next()).getName());
+		assertEquals("address", ((AssociationOverrideAnnotation) associationOverrides.next()).getName());
+		assertFalse(associationOverrides.hasNext());
+	}
+	
+	public void testAssociationOverrideSetVirtualTrue() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+				
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		assertEquals(2, CollectionTools.size(typeResource.annotations(AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME)));
+
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		
+		Iterator<NestableAnnotation> associationOverrideResources = typeResource.annotations(AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("address2", ((AssociationOverrideAnnotation) associationOverrideResources.next()).getName());		
+		assertFalse(associationOverrideResources.hasNext());
+
+		Iterator<JavaAssociationOverride> associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("address2", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+
+		
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		associationOverrideResources = typeResource.annotations(AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		assertFalse(associationOverrideResources.hasNext());
+		associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertFalse(associationOverrides.hasNext());
+
+		assertNull(typeResource.getAnnotation(AssociationOverridesAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testMoveSpecifiedAssociationOverride() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		
+		Iterator<NestableAnnotation> javaAssociationOverrides = typeResource.annotations(AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals(2, CollectionTools.size(javaAssociationOverrides));
+		
+		
+		overrideContainer.moveSpecifiedOverride(1, 0);
+		Iterator<JavaAssociationOverride> associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("address2", associationOverrides.next().getName());
+		assertEquals("address", associationOverrides.next().getName());
+
+		javaAssociationOverrides = typeResource.annotations(AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("address2", ((AssociationOverrideAnnotation) javaAssociationOverrides.next()).getName());
+		assertEquals("address", ((AssociationOverrideAnnotation) javaAssociationOverrides.next()).getName());
+
+
+		overrideContainer.moveSpecifiedOverride(0, 1);
+		associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("address", associationOverrides.next().getName());
+		assertEquals("address2", associationOverrides.next().getName());
+
+		javaAssociationOverrides = typeResource.annotations(AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("address", ((AssociationOverrideAnnotation) javaAssociationOverrides.next()).getName());
+		assertEquals("address2", ((AssociationOverrideAnnotation) javaAssociationOverrides.next()).getName());
+	}
+
+	public void testUpdateSpecifiedAssociationOverrides() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+	
+		((AssociationOverrideAnnotation) typeResource.addAnnotation(0, AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME)).setName("FOO");
+		((AssociationOverrideAnnotation) typeResource.addAnnotation(1, AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME)).setName("BAR");
+		((AssociationOverrideAnnotation) typeResource.addAnnotation(2, AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME)).setName("BAZ");
+		getJpaProject().synchronizeContextModel();
+			
+		Iterator<JavaAssociationOverride> associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("FOO", associationOverrides.next().getName());
+		assertEquals("BAR", associationOverrides.next().getName());
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+		
+		typeResource.moveAnnotation(2, 0, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("BAR", associationOverrides.next().getName());
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertEquals("FOO", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+	
+		typeResource.moveAnnotation(0, 1, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertEquals("BAR", associationOverrides.next().getName());
+		assertEquals("FOO", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+	
+		typeResource.removeAnnotation(1,  AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertEquals("FOO", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+	
+		typeResource.removeAnnotation(1,  AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+		
+		typeResource.removeAnnotation(0,  AssociationOverrideAnnotation.ANNOTATION_NAME, AssociationOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		associationOverrides = (Iterator<JavaAssociationOverride>) overrideContainer.specifiedOverrides();
+		assertFalse(associationOverrides.hasNext());
+	}
+
+	public void testAssociationOverrideIsVirtual() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		AssociationOverrideContainer overrideContainer = getJavaEntity().getAssociationOverrideContainer();
+		
+		ListIterator<JavaVirtualAssociationOverride> virtualAssociationOverrides = (ListIterator<JavaVirtualAssociationOverride>) overrideContainer.virtualOverrides();
+		VirtualAssociationOverride virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address2", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address3", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address4", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		assertFalse(virtualAssociationOverrides.hasNext());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		AssociationOverride specifiedAssociationOverride = overrideContainer.specifiedOverrides().next();
+		assertFalse(specifiedAssociationOverride.isVirtual());
+		
+		
+		virtualAssociationOverrides = (ListIterator<JavaVirtualAssociationOverride>) overrideContainer.virtualOverrides();	
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address2", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address3", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address4", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		assertFalse(virtualAssociationOverrides.hasNext());
+	}
+	
+	public void testNestedVirtualAttributeOverrides() throws Exception {
+		createTestMappedSuperclassCustomer();
+		createTestEntityLongTimeCustomer();
+		createTestEmbeddableAddress();
+		createTestEmbeddableZipCode();
+		
+		addXmlClassRef(PACKAGE_NAME + ".Customer");
+		addXmlClassRef(PACKAGE_NAME + ".LongTimeCustomer");
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".ZipCode");
+		ListIterator<ClassRef> specifiedClassRefs = getPersistenceUnit().specifiedClassRefs();
+		PersistentType customerPersistentType = specifiedClassRefs.next().getJavaPersistentType();
+		PersistentType longTimeCustomerPersistentType = specifiedClassRefs.next().getJavaPersistentType();
+		PersistentType addressPersistentType = specifiedClassRefs.next().getJavaPersistentType();		
+		PersistentType zipCodePersistentType = specifiedClassRefs.next().getJavaPersistentType();
+
+		AttributeOverrideContainer attributeOverrideContainer = ((Entity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		
+		assertEquals(6, attributeOverrideContainer.virtualOverridesSize());
+		ListIterator<VirtualAttributeOverride> virtualAttributeOverrides = (ListIterator<VirtualAttributeOverride>) attributeOverrideContainer.virtualOverrides();
+		VirtualAttributeOverride virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("name", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.street", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.city", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.zipCode.zip", virtualAttributeOverride.getName());
+		assertEquals("zip", virtualAttributeOverride.getColumn().getName());
+		assertEquals("LongTimeCustomer", virtualAttributeOverride.getColumn().getTable());		
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("plusfour", virtualAttributeOverride.getColumn().getName());
+		assertEquals("LongTimeCustomer", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals(null, virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(true, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(255, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(0, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, virtualAttributeOverride.getColumn().getScale());
+
+		
+		BasicMapping plusFourMapping = (BasicMapping) zipCodePersistentType.getAttributeNamed("plusfour").getMapping();
+		plusFourMapping.getColumn().setSpecifiedName("BLAH");
+		plusFourMapping.getColumn().setSpecifiedTable("BLAH_TABLE");
+		plusFourMapping.getColumn().setColumnDefinition("COLUMN_DEFINITION");
+		plusFourMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		plusFourMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		plusFourMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		plusFourMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+
+		attributeOverrideContainer = ((Entity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		//check the top-level embedded (Customer.address) attribute override to verify it is getting settings from the specified column on Zipcode.plusfour
+		virtualAttributeOverride = (VirtualAttributeOverride) attributeOverrideContainer.getOverrideNamed("address.zipCode.plusfour");
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("BLAH", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BLAH_TABLE", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals("COLUMN_DEFINITION", virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(false, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(5, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(6, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, virtualAttributeOverride.getColumn().getScale());
+		
+		//set an attribute override on Address.zipCode embedded mapping
+		AttributeOverride specifiedAttributeOverride = ((VirtualAttributeOverride) ((EmbeddedMapping) addressPersistentType.getAttributeNamed("zipCode").getMapping()).getAttributeOverrideContainer().getOverrideNamed("plusfour")).convertToSpecified();
+		specifiedAttributeOverride.getColumn().setSpecifiedName("BLAH_OVERRIDE");
+		specifiedAttributeOverride.getColumn().setSpecifiedTable("BLAH_TABLE_OVERRIDE");
+		specifiedAttributeOverride.getColumn().setColumnDefinition("COLUMN_DEFINITION_OVERRIDE");
+
+
+		attributeOverrideContainer = ((Entity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		virtualAttributeOverride = (VirtualAttributeOverride) attributeOverrideContainer.getOverrideNamed("address.zipCode.plusfour");
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("BLAH_OVERRIDE", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BLAH_TABLE_OVERRIDE", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals("COLUMN_DEFINITION_OVERRIDE", virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(true, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(255, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(0, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, virtualAttributeOverride.getColumn().getScale());
+		
+		specifiedAttributeOverride = virtualAttributeOverride.convertToSpecified();
+		assertEquals(false, specifiedAttributeOverride.isVirtual());
+		assertEquals("address.zipCode.plusfour", specifiedAttributeOverride.getName());
+		//TODO I have the default wrong in this case, but this was wrong before as well.  Need to fix this later
+//		assertEquals("plusfour", specifiedAttributeOverride.getColumn().getDefaultName());
+		assertEquals("BLAH_OVERRIDE", specifiedAttributeOverride.getColumn().getSpecifiedName());
+//		assertEquals("Customer", specifiedAttributeOverride.getColumn().getDefaultTable());	
+		assertEquals("BLAH_TABLE_OVERRIDE", specifiedAttributeOverride.getColumn().getSpecifiedTable());	
+		assertEquals("COLUMN_DEFINITION_OVERRIDE", specifiedAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, specifiedAttributeOverride.getColumn().isUnique());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isNullable());
+		assertEquals(255, specifiedAttributeOverride.getColumn().getLength());
+		assertEquals(0, specifiedAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, specifiedAttributeOverride.getColumn().getScale());
+	}
+
+	public void testNestedVirtualAttributeOverridesElementCollection() throws Exception {
+		createTestMappedSuperclassCustomerWithElementCollection();
+		createTestEntityLongTimeCustomer();
+		createTestEmbeddableAddress();
+		createTestEmbeddableZipCode();
+		
+		addXmlClassRef(PACKAGE_NAME + ".Customer");
+		addXmlClassRef(PACKAGE_NAME + ".LongTimeCustomer");
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".ZipCode");
+		ListIterator<ClassRef> specifiedClassRefs = getPersistenceUnit().specifiedClassRefs();
+		PersistentType customerPersistentType = specifiedClassRefs.next().getJavaPersistentType();
+		PersistentType longTimeCustomerPersistentType = specifiedClassRefs.next().getJavaPersistentType();
+		PersistentType addressPersistentType = specifiedClassRefs.next().getJavaPersistentType();		
+		PersistentType zipCodePersistentType = specifiedClassRefs.next().getJavaPersistentType();
+		
+		AttributeOverrideContainer attributeOverrideContainer = ((Entity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		
+		assertEquals(6, attributeOverrideContainer.virtualOverridesSize());
+		ListIterator<VirtualAttributeOverride> virtualAttributeOverrides = (ListIterator<VirtualAttributeOverride>) attributeOverrideContainer.virtualOverrides();
+		VirtualAttributeOverride virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("name", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.street", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.city", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.zipCode.zip", virtualAttributeOverride.getName());
+		assertEquals("zip", virtualAttributeOverride.getColumn().getName());
+		assertEquals("LongTimeCustomer", virtualAttributeOverride.getColumn().getTable());		
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("plusfour", virtualAttributeOverride.getColumn().getName());
+		assertEquals("LongTimeCustomer", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals(null, virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(true, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(255, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(0, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, virtualAttributeOverride.getColumn().getScale());
+
+		
+		BasicMapping plusFourMapping = (BasicMapping) zipCodePersistentType.getAttributeNamed("plusfour").getMapping();
+		plusFourMapping.getColumn().setSpecifiedName("BLAH");
+		plusFourMapping.getColumn().setSpecifiedTable("BLAH_TABLE");
+		plusFourMapping.getColumn().setColumnDefinition("COLUMN_DEFINITION");
+		plusFourMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		plusFourMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		plusFourMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		plusFourMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+
+		attributeOverrideContainer = ((Entity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		//check the top-level embedded (Customer.address) attribute override to verify it is getting settings from the specified column on Zipcode.plusfour
+		virtualAttributeOverride = (VirtualAttributeOverride) attributeOverrideContainer.getOverrideNamed("address.zipCode.plusfour");
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("BLAH", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BLAH_TABLE", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals("COLUMN_DEFINITION", virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(false, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(5, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(6, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, virtualAttributeOverride.getColumn().getScale());
+		
+		//set an attribute override on Address.zipCode embedded mapping
+		AttributeOverride specifiedAttributeOverride = ((VirtualAttributeOverride) ((EmbeddedMapping) addressPersistentType.getAttributeNamed("zipCode").getMapping()).getAttributeOverrideContainer().getOverrideNamed("plusfour")).convertToSpecified();
+		specifiedAttributeOverride.getColumn().setSpecifiedName("BLAH_OVERRIDE");
+		specifiedAttributeOverride.getColumn().setSpecifiedTable("BLAH_TABLE_OVERRIDE");
+		specifiedAttributeOverride.getColumn().setColumnDefinition("COLUMN_DEFINITION_OVERRIDE");
+
+
+		attributeOverrideContainer = ((Entity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		virtualAttributeOverride = (VirtualAttributeOverride) attributeOverrideContainer.getOverrideNamed("address.zipCode.plusfour");
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("BLAH_OVERRIDE", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BLAH_TABLE_OVERRIDE", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals("COLUMN_DEFINITION_OVERRIDE", virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(true, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(255, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(0, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, virtualAttributeOverride.getColumn().getScale());
+		
+		specifiedAttributeOverride = virtualAttributeOverride.convertToSpecified();
+		assertEquals(false, specifiedAttributeOverride.isVirtual());
+		assertEquals("address.zipCode.plusfour", specifiedAttributeOverride.getName());
+		//TODO I have the default wrong in this case, but this was wrong before as well.  Need to fix this later
+//		assertEquals("plusfour", specifiedAttributeOverride.getColumn().getDefaultName());
+		assertEquals("BLAH_OVERRIDE", specifiedAttributeOverride.getColumn().getSpecifiedName());
+//		assertEquals("Customer", specifiedAttributeOverride.getColumn().getDefaultTable());	
+		assertEquals("BLAH_TABLE_OVERRIDE", specifiedAttributeOverride.getColumn().getSpecifiedTable());	
+		assertEquals("COLUMN_DEFINITION_OVERRIDE", specifiedAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, specifiedAttributeOverride.getColumn().isUnique());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isNullable());
+		assertEquals(255, specifiedAttributeOverride.getColumn().getLength());
+		assertEquals(0, specifiedAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, specifiedAttributeOverride.getColumn().getScale());
+	}
+
+	public void testNestedVirtualAssociationOverrides() throws Exception {
+		createTestMappedSuperclassCustomer();
+		createTestEntityLongTimeCustomer();
+		createTestEmbeddableAddress();
+		createTestEmbeddableZipCode();
+		
+		addXmlClassRef(PACKAGE_NAME + ".Customer");
+		addXmlClassRef(PACKAGE_NAME + ".LongTimeCustomer");
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".ZipCode");
+		ListIterator<ClassRef> specifiedClassRefs = getPersistenceUnit().specifiedClassRefs();
+		specifiedClassRefs.next();
+		PersistentType longTimeCustomerPersistentType = specifiedClassRefs.next().getJavaPersistentType();
+
+		AssociationOverrideContainer attributeOverrideContainer = ((Entity) longTimeCustomerPersistentType.getMapping()).getAssociationOverrideContainer();
+		
+		assertEquals(1, attributeOverrideContainer.virtualOverridesSize());
+		ListIterator<VirtualAssociationOverride> virtualAssociationOverrides = (ListIterator<VirtualAssociationOverride>) attributeOverrideContainer.virtualOverrides();
+		VirtualAssociationOverride virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address.state", virtualAssociationOverride.getName());
+	}
+
+	public void testNestedVirtualAssociationOverridesElementCollection() throws Exception {
+		createTestMappedSuperclassCustomerWithElementCollection();
+		createTestEntityLongTimeCustomer();
+		createTestEmbeddableAddress();
+		createTestEmbeddableZipCode();
+		
+		addXmlClassRef(PACKAGE_NAME + ".Customer");
+		addXmlClassRef(PACKAGE_NAME + ".LongTimeCustomer");
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".ZipCode");
+		ListIterator<ClassRef> specifiedClassRefs = getPersistenceUnit().specifiedClassRefs();
+		specifiedClassRefs.next();
+		PersistentType longTimeCustomerPersistentType = specifiedClassRefs.next().getJavaPersistentType();
+
+		AssociationOverrideContainer attributeOverrideContainer = ((Entity) longTimeCustomerPersistentType.getMapping()).getAssociationOverrideContainer();
+		
+		assertEquals(1, attributeOverrideContainer.virtualOverridesSize());
+		ListIterator<VirtualAssociationOverride> virtualAssociationOverrides = (ListIterator<VirtualAssociationOverride>) attributeOverrideContainer.virtualOverrides();
+		VirtualAssociationOverride virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address.state", virtualAssociationOverride.getName());
+	}
+	
+	public void testSetSpecifiedCacheable() throws Exception {
+		ICompilationUnit cu = createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) getJavaEntity()).getCacheable();
+		Cacheable2_0Annotation cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation);
+		
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);		
+		assertEquals(Boolean.FALSE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.FALSE, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable(false)", cu);
+		
+		cacheable.setSpecifiedCacheable(Boolean.TRUE);
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);		
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable", cu);
+		
+		cacheable.setSpecifiedCacheable(null);
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);		
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation);
+		assertSourceDoesNotContain("@Cacheable", cu);
+	}
+	
+	public void testGetSpecifiedCacheable() throws Exception {
+		ICompilationUnit cu = createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) getJavaEntity()).getCacheable();
+		Cacheable2_0Annotation cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation);
+		
+		getJavaPersistentType().getResourcePersistentType().addAnnotation(JPA2_0.CACHEABLE);
+		getJpaProject().synchronizeContextModel();
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable", cu);
+
+		cacheableAnnotation.setValue(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.FALSE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.FALSE, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable(false)", cu);
+		
+		cacheableAnnotation.setValue(Boolean.TRUE);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.TRUE, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable(true)", cu);
+		
+		cacheableAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable", cu);
+
+		getJavaPersistentType().getResourcePersistentType().removeAnnotation(JPA2_0.CACHEABLE);
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);		
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null,  cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation);
+		assertSourceDoesNotContain("@Cacheable", cu);
+	}
+	
+	public void testIsDefaultCacheable() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) getJavaEntity()).getCacheable();
+		PersistenceUnit2_0 persistenceUnit = getPersistenceUnit();
+		assertEquals(SharedCacheMode.DISABLE_SELECTIVE, persistenceUnit.getSharedCacheMode());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.ALL);
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.UNSPECIFIED);
+		assertEquals(true, cacheable.isDefaultCacheable());
+	}
+	
+	public void testInheritedIsDefaultCacheable() throws Exception {
+		createTestEntity();
+		createTestSubType();
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 subCacheable = ((CacheableHolder2_0) getJavaEntity()).getCacheable();
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) getJavaEntity().getParentEntity()).getCacheable();
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(null);
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+				
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		cacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaManyToManyMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaManyToManyMappingTests.java
new file mode 100644
index 0000000..6b19554
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaManyToManyMappingTests.java
@@ -0,0 +1,1303 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.Embeddable;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.JoinTableRelationshipStrategy;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.PersistentType;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaAttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JavaVirtualAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrderColumn2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.Orderable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaManyToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.MapKeyClass2_0Annotation;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.MapKeyColumn2_0Annotation;
+import org.eclipse.jpt.jpa.core.resource.java.AttributeOverrideAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.AttributeOverridesAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.MapKeyAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.NestableAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetch;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkRelationshipMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkJoinFetchAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.EclipseLink2_0ContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0JavaManyToManyMappingTests
+	extends EclipseLink2_0ContextModelTestCase
+{
+	public EclipseLink2_0JavaManyToManyMappingTests(String name) {
+		super(name);
+	}
+	
+	private ICompilationUnit createTestEntityWithJoinFetchManyToMany() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, EclipseLink.JOIN_FETCH);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ManyToMany").append(CR);
+				sb.append("@JoinFetch").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithValidManyToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, JPA.ID, "java.util.Collection");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);				
+				sb.append("    private Collection<Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityWithValidGenericMapManyToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);				
+				sb.append("    private java.util.Map<Integer, Address> addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithValidNonGenericMapManyToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);				
+				sb.append("    private java.util.Map addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MANY_TO_MANY);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);
+				sb.append("    private java.util.Collection<AnnotationTestType> employees;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	private void createTestTargetEntityAddressWithElementCollection() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ELEMENT_COLLECTION);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);
+				sb.append("    private java.util.Collection<State> state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	private void createTestEmbeddableState() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("State").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    private String address;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter);
+	}
+
+	private ICompilationUnit createTestEntityWithEmbeddableKeyManyToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);				
+				sb.append("    private java.util.Map<Address, PropertyInfo> parcels;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private void createTestEmbeddableAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	private void createTestEntityPropertyInfo() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PropertyInfo").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private Integer parcelNumber;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+				sb.append("    private Integer size;").append(CR);
+				sb.append(CR);
+				sb.append("    private java.math.BigDecimal tax;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PropertyInfo.java", sourceWriter);
+	}
+	
+	public void testGetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchManyToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test context value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to INNER specifically, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change resource to OUTER, test context
+		
+		joinFetchAnnotation.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// remove value from resource, test context
+		
+		joinFetchAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// remove annotation, text context
+		
+		attributeResource.removeAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertNull(contextJoinFetch.getValue());
+	}
+	
+	public void testSetJoinFetchValue() throws Exception {
+		createTestEntityWithJoinFetchManyToMany();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		EclipseLinkRelationshipMapping manyToManyMapping = (EclipseLinkRelationshipMapping) persistentAttribute.getMapping();
+		EclipseLinkJoinFetch contextJoinFetch = manyToManyMapping.getJoinFetch();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		EclipseLinkJoinFetchAnnotation joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test resource value
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to INNER specifically, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		
+		assertNull(joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+		
+		// change context to OUTER, test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.OUTER);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.OUTER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.OUTER, contextJoinFetch.getValue());
+		
+		// set context to null, test resource
+		
+		contextJoinFetch.setValue(null);
+		
+		assertNull(attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME));
+		assertNull(contextJoinFetch.getValue());
+		
+		// change context to INNER specifically (this time from no annotation), test resource
+		
+		contextJoinFetch.setValue(EclipseLinkJoinFetchType.INNER);
+		joinFetchAnnotation = (EclipseLinkJoinFetchAnnotation) attributeResource.getAnnotation(EclipseLinkJoinFetchAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.JoinFetchType.INNER, joinFetchAnnotation.getValue());
+		assertEquals(EclipseLinkJoinFetchType.INNER, contextJoinFetch.getValue());
+	}
+
+	public void testCandidateMappedByAttributeNames() throws Exception {
+		createTestEntityWithValidManyToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		PersistentAttribute persistentAttribute = (getJavaPersistentType()).attributes().next();
+		ManyToManyMapping manyToManyMapping = (ManyToManyMapping) persistentAttribute.getMapping();
+
+		Iterator<String> attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertEquals("employees", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		manyToManyMapping.setSpecifiedTargetEntity("foo");
+		attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertFalse(attributeNames.hasNext());
+		
+		manyToManyMapping.setSpecifiedTargetEntity(null);
+		attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertEquals("employees", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+
+		AttributeMapping stateFooMapping = manyToManyMapping.getResolvedTargetEntity().resolveAttributeMapping("state.foo");
+		assertEquals("foo", stateFooMapping.getName());
+	}
+	
+	public void testCandidateMappedByAttributeNamesElementCollection() throws Exception {
+		createTestEntityWithValidManyToManyMapping();
+		createTestTargetEntityAddressWithElementCollection();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		PersistentAttribute persistentAttribute = (getJavaPersistentType()).attributes().next();
+		ManyToManyMapping manyToManyMapping = (ManyToManyMapping) persistentAttribute.getMapping();
+
+		Iterator<String> attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		manyToManyMapping.setSpecifiedTargetEntity("foo");
+		attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertFalse(attributeNames.hasNext());
+		
+		manyToManyMapping.setSpecifiedTargetEntity(null);
+		attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+
+		AttributeMapping stateFooMapping = manyToManyMapping.getResolvedTargetEntity().resolveAttributeMapping("state.foo");
+		assertEquals("foo", stateFooMapping.getName());
+	}
+	
+	public void testUpdateMapKey() throws Exception {
+		createTestEntityWithValidManyToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping manyToManyMapping = (ManyToManyMapping) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(manyToManyMapping.getSpecifiedMapKey());
+		assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME));
+		
+		//set mapKey in the resource model, verify context model does not change
+		attributeResource.addAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNull(manyToManyMapping.getSpecifiedMapKey());
+		MapKeyAnnotation mapKey = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNotNull(mapKey);
+				
+		//set mapKey name in the resource model, verify context model updated
+		mapKey.setName("myMapKey");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals("myMapKey", manyToManyMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", mapKey.getName());
+		
+		//set mapKey name to null in the resource model
+		mapKey.setName(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(manyToManyMapping.getSpecifiedMapKey());
+		assertNull(mapKey.getName());
+		
+		mapKey.setName("myMapKey");
+		attributeResource.removeAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNull(manyToManyMapping.getSpecifiedMapKey());
+		assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testModifyMapKey() throws Exception {
+		createTestEntityWithValidManyToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping manyToManyMapping = (ManyToManyMapping) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(manyToManyMapping.getSpecifiedMapKey());
+		assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME));
+					
+		//set mapKey  in the context model, verify resource model updated
+		manyToManyMapping.setSpecifiedMapKey("myMapKey");
+		MapKeyAnnotation mapKey = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertEquals("myMapKey", manyToManyMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", mapKey.getName());
+		//set mapKey to null in the context model
+		manyToManyMapping.setSpecifiedMapKey(null);
+		assertNull(manyToManyMapping.getSpecifiedMapKey());
+		mapKey = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNull(mapKey.getName());
+	}
+	
+	public void testCandidateMapKeyNames() throws Exception {
+		createTestEntityWithValidGenericMapManyToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping manyToManyMapping2_0 = (ManyToManyMapping) persistentAttribute.getMapping();
+
+		Iterator<String> mapKeyNames = 
+			manyToManyMapping2_0.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.foo", mapKeyNames.next());
+		assertEquals("state.address", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertEquals("employees", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+	}
+	
+	public void testCandidateMapKeyNames2() throws Exception {
+		createTestEntityWithValidNonGenericMapManyToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping manyToManyMapping2_0 = (ManyToManyMapping) persistentAttribute.getMapping();
+
+		Iterator<String> mapKeyNames = manyToManyMapping2_0.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		manyToManyMapping2_0.setSpecifiedTargetEntity("Address");
+		mapKeyNames = manyToManyMapping2_0.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.foo", mapKeyNames.next());
+		assertEquals("state.address", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertEquals("employees", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		manyToManyMapping2_0.setSpecifiedTargetEntity("String");
+		mapKeyNames = manyToManyMapping2_0.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+	}
+	
+	public void testUpdateMapKeyClass() throws Exception {
+		createTestEntityWithValidManyToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping2_0 manyToManyMapping = (ManyToManyMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(manyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+		
+		//set mapKey in the resource model, verify context model does not change
+		attributeResource.addAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		assertNull(manyToManyMapping.getSpecifiedMapKeyClass());
+		MapKeyClass2_0Annotation mapKeyClassAnnotation = (MapKeyClass2_0Annotation) attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		assertNotNull(mapKeyClassAnnotation);
+				
+		//set mapKey name in the resource model, verify context model updated
+		mapKeyClassAnnotation.setValue("myMapKeyClass");
+		this.getJpaProject().synchronizeContextModel();
+		assertEquals("myMapKeyClass", manyToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("myMapKeyClass", mapKeyClassAnnotation.getValue());
+		
+		//set mapKey name to null in the resource model
+		mapKeyClassAnnotation.setValue(null);
+		this.getJpaProject().synchronizeContextModel();
+		assertNull(manyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(mapKeyClassAnnotation.getValue());
+		
+		mapKeyClassAnnotation.setValue("myMapKeyClass");
+		attributeResource.removeAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+
+		assertNull(manyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+	}
+	
+	public void testModifyMapKeyClass() throws Exception {
+		createTestEntityWithValidManyToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping2_0 manyToManyMapping = (ManyToManyMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(manyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+					
+		//set mapKey  in the context model, verify resource model updated
+		manyToManyMapping.setSpecifiedMapKeyClass("String");
+		MapKeyClass2_0Annotation mapKeyClass = (MapKeyClass2_0Annotation) attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		assertEquals("String", manyToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("String", mapKeyClass.getValue());
+	
+		//set mapKey to null in the context model
+		manyToManyMapping.setSpecifiedMapKeyClass(null);
+		assertNull(manyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+	}
+
+	public void testDefaultMapKeyClass() throws Exception {
+		createTestEntityWithValidGenericMapManyToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping2_0 manyToManyMapping = (ManyToManyMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals("java.lang.Integer", manyToManyMapping.getDefaultMapKeyClass());
+
+		//test default still the same when specified target entity it set
+		manyToManyMapping.setSpecifiedMapKeyClass("foo");
+		assertEquals("java.lang.Integer", manyToManyMapping.getDefaultMapKeyClass());
+	}
+	
+	public void testDefaultMapKeyClassCollectionType() throws Exception {
+		createTestEntityWithValidManyToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping2_0 manyToManyMapping = (ManyToManyMapping2_0) persistentAttribute.getMapping();
+
+		assertNull(manyToManyMapping.getDefaultMapKeyClass());
+	}
+	
+	public void testMapKeyClass() throws Exception {
+		createTestEntityWithValidGenericMapManyToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping2_0 manyToManyMapping = (ManyToManyMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals("java.lang.Integer", manyToManyMapping.getMapKeyClass());
+
+		manyToManyMapping.setSpecifiedMapKeyClass("foo");
+		assertEquals("foo", manyToManyMapping.getMapKeyClass());
+		
+		manyToManyMapping.setSpecifiedMapKeyClass(null);
+		assertEquals("java.lang.Integer", manyToManyMapping.getMapKeyClass());
+	}
+
+	public void testOrderColumnDefaults() throws Exception {
+		createTestEntityPrintQueue();
+		createTestEntityPrintJob();
+		
+		addXmlClassRef(PACKAGE_NAME + ".PrintQueue");
+		addXmlClassRef(PACKAGE_NAME + ".PrintJob");
+		JavaPersistentType printQueuePersistentType = (JavaPersistentType) getPersistenceUnit().getPersistentType("test.PrintQueue");
+		ManyToManyMapping jobsMapping = (ManyToManyMapping) printQueuePersistentType.getAttributeNamed("jobs").getMapping();
+		JavaPersistentType printJobPersistentType = (JavaPersistentType) getPersistenceUnit().getPersistentType("test.PrintJob");
+		ManyToManyMapping queuesMapping = (ManyToManyMapping) printJobPersistentType.getAttributeNamed("queues").getMapping();
+
+		Orderable2_0 jobsOrderable = ((Orderable2_0) jobsMapping.getOrderable());
+		OrderColumn2_0 jobsOrderColumn = jobsOrderable.getOrderColumn();
+		assertEquals(true, jobsOrderable.isOrderColumnOrdering());
+		assertEquals(null, jobsOrderColumn.getSpecifiedName());
+		assertEquals("jobs_ORDER", jobsOrderColumn.getDefaultName());
+		assertEquals("PrintJob_PrintQueue", jobsOrderColumn.getTable()); //the join table name
+		Orderable2_0 queuesOrderable = ((Orderable2_0) queuesMapping.getOrderable());
+		OrderColumn2_0 queuesOrderColumn = queuesOrderable.getOrderColumn();
+		assertEquals(true, queuesOrderable.isOrderColumnOrdering());
+		assertEquals(null, queuesOrderColumn.getSpecifiedName());
+		assertEquals("queues_ORDER", queuesOrderColumn.getDefaultName());
+		assertEquals("PrintJob_PrintQueue", queuesOrderColumn.getTable());
+		
+		jobsOrderColumn.setSpecifiedName("FOO");
+		assertEquals("FOO", jobsOrderColumn.getSpecifiedName());
+		assertEquals("jobs_ORDER", jobsOrderColumn.getDefaultName());
+		assertEquals("PrintJob_PrintQueue", jobsOrderColumn.getTable());
+		queuesOrderColumn.setSpecifiedName("BAR");
+		assertEquals("BAR", queuesOrderColumn.getSpecifiedName());
+		assertEquals("queues_ORDER", queuesOrderColumn.getDefaultName());
+		assertEquals("PrintJob_PrintQueue", queuesOrderColumn.getTable());
+		
+		((Entity) printJobPersistentType.getMapping()).getTable().setSpecifiedName("MY_TABLE");
+		assertEquals("MY_TABLE_PrintQueue", jobsOrderColumn.getTable());
+		assertEquals("MY_TABLE_PrintQueue", queuesOrderColumn.getTable());
+		
+		((Entity) printQueuePersistentType.getMapping()).getTable().setSpecifiedName("OTHER_TABLE");
+		assertEquals("MY_TABLE_OTHER_TABLE", jobsOrderColumn.getTable());
+		assertEquals("MY_TABLE_OTHER_TABLE", queuesOrderColumn.getTable());
+		
+		queuesMapping.getRelationship().getJoinTableStrategy().getJoinTable().setSpecifiedName("MY_JOIN_TABLE");
+		assertEquals("MY_JOIN_TABLE", jobsOrderColumn.getTable());
+		assertEquals("MY_JOIN_TABLE", queuesOrderColumn.getTable());
+	}
+	
+	private void createTestEntityPrintQueue() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MANY_TO_MANY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ORDER_COLUMN);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PrintQueue").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany(mappedBy=\"queues\")").append(CR);
+				sb.append("    @OrderColumn").append(CR);
+				sb.append("    private java.util.List<PrintJob> jobs;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PrintQueue.java", sourceWriter);
+	}
+	
+	private void createTestEntityPrintJob() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MANY_TO_MANY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ORDER_COLUMN);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PrintJob").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);
+				sb.append("    @OrderColumn").append(CR);
+				sb.append("    private java.util.List<PrintQueue> queues;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PrintJob.java", sourceWriter);
+	}
+
+	public void testGetMapKeyColumnMappedByStrategy() throws Exception {
+		createTestEntityWithValidGenericMapManyToManyMapping();
+		createTestTargetEntityAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping2_0 manyToManyMapping = (ManyToManyMapping2_0) persistentAttribute.getMapping();
+		manyToManyMapping.getRelationship().setStrategyToMappedBy();
+		manyToManyMapping.getRelationship().getMappedByStrategy().setMappedByAttribute("employees");
+		
+		assertNull(manyToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("addresses_KEY", manyToManyMapping.getMapKeyColumn().getName());
+		assertEquals("Address_" + TYPE_NAME, manyToManyMapping.getMapKeyColumn().getTable());//join table name of owning many-to-many
+		
+		PersistentType persistentType = getPersistenceUnit().getPersistentType("test.Address");
+		ManyToManyMapping owningManyToManyMapping = (ManyToManyMapping) persistentType.getAttributeNamed("employees").getMapping();
+		((JoinTableRelationshipStrategy) owningManyToManyMapping.getRelationship().getStrategy()).getJoinTable().setSpecifiedName("MY_JOIN_TABLE");
+		assertEquals("MY_JOIN_TABLE", manyToManyMapping.getMapKeyColumn().getTable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		MapKeyColumn2_0Annotation column = (MapKeyColumn2_0Annotation) attributeResource.addAnnotation(JPA2_0.MAP_KEY_COLUMN);
+		column.setName("foo");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals("foo", manyToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("foo", manyToManyMapping.getMapKeyColumn().getName());
+		assertEquals("addresses_KEY", manyToManyMapping.getMapKeyColumn().getDefaultName());
+	}
+
+	public void testGetMapKeyColumnJoinTableStrategy() throws Exception {
+		createTestEntityWithValidGenericMapManyToManyMapping();
+		createTestTargetEntityAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		ManyToManyMapping2_0 manyToManyMapping = (ManyToManyMapping2_0) persistentAttribute.getMapping();
+		
+		assertNull(manyToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("addresses_KEY", manyToManyMapping.getMapKeyColumn().getName());
+		assertEquals(TYPE_NAME + "_Address", manyToManyMapping.getMapKeyColumn().getTable());//join table name
+		
+		manyToManyMapping.getRelationship().getJoinTableStrategy().getJoinTable().setSpecifiedName("MY_JOIN_TABLE");
+		assertEquals("MY_JOIN_TABLE", manyToManyMapping.getMapKeyColumn().getTable());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		MapKeyColumn2_0Annotation column = (MapKeyColumn2_0Annotation) attributeResource.addAnnotation(JPA2_0.MAP_KEY_COLUMN);
+		column.setName("foo");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals("foo", manyToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("foo", manyToManyMapping.getMapKeyColumn().getName());
+		assertEquals("addresses_KEY", manyToManyMapping.getMapKeyColumn().getDefaultName());
+	}
+
+	public void testMapKeySpecifiedAttributeOverrides() throws Exception {
+		createTestEntityWithEmbeddableKeyManyToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		
+		JavaManyToManyMapping2_0 manyToManyMapping = (JavaManyToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = manyToManyMapping.getMapKeyAttributeOverrideContainer();
+		
+		ListIterator<JavaAttributeOverride> specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.BAR");
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAZ");
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+	
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BLAH");
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("BAZ", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		//move an annotation to the resource model and verify the context model is updated
+		attributeResource.moveAnnotation(1, 0, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+	
+		attributeResource.removeAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+	}
+
+	public void testMapKeyValueVirtualAttributeOverrides() throws Exception {
+		createTestEntityWithEmbeddableKeyManyToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaManyToManyMapping2_0 manyToManyMapping = (JavaManyToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = manyToManyMapping.getMapKeyAttributeOverrideContainer();
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertEquals("parcels", attributeResource.getName());
+		assertNull(attributeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+		
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		ReadOnlyAttributeOverride defaultAttributeOverride = mapKeyAttributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("city", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_PropertyInfo", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		Embeddable addressEmbeddable = (Embeddable) classRefs.next().getJavaPersistentType().getMapping();
+		
+		BasicMapping cityMapping = (BasicMapping) addressEmbeddable.getPersistentType().getAttributeNamed("city").getMapping();
+		cityMapping.getColumn().setSpecifiedName("FOO");
+		cityMapping.getColumn().setSpecifiedTable("BAR");
+		cityMapping.getColumn().setColumnDefinition("COLUMN_DEF");
+		cityMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		cityMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		cityMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		cityMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+		
+		assertEquals("parcels", attributeResource.getName());
+		assertNull(attributeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		defaultAttributeOverride = mapKeyAttributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("FOO", defaultAttributeOverride.getColumn().getName());
+		assertEquals("BAR", defaultAttributeOverride.getColumn().getTable());
+		assertEquals("COLUMN_DEF", defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(false, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(5, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(6, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, defaultAttributeOverride.getColumn().getScale());
+
+		cityMapping.getColumn().setSpecifiedName(null);
+		cityMapping.getColumn().setSpecifiedTable(null);
+		cityMapping.getColumn().setColumnDefinition(null);
+		cityMapping.getColumn().setSpecifiedInsertable(null);
+		cityMapping.getColumn().setSpecifiedUpdatable(null);
+		cityMapping.getColumn().setSpecifiedUnique(null);
+		cityMapping.getColumn().setSpecifiedNullable(null);
+		cityMapping.getColumn().setSpecifiedLength(null);
+		cityMapping.getColumn().setSpecifiedPrecision(null);
+		cityMapping.getColumn().setSpecifiedScale(null);
+		defaultAttributeOverride = mapKeyAttributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("city", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_PropertyInfo", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		AttributeOverrideAnnotation annotation = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		annotation.setName("key.city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(3, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		}
+	
+	public void testMapKeyValueSpecifiedAttributeOverridesSize() throws Exception {
+		createTestEntityWithEmbeddableKeyManyToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaManyToManyMapping2_0 manyToManyMapping = (JavaManyToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = manyToManyMapping.getMapKeyAttributeOverrideContainer();
+		assertEquals(0, mapKeyAttributeOverrideContainer.specifiedOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAR");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.FOO2");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(3, mapKeyAttributeOverrideContainer.specifiedOverridesSize());
+	}
+	
+	public void testMapKeyValueAttributeOverridesSize() throws Exception {
+		createTestEntityWithEmbeddableKeyManyToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+
+		JavaManyToManyMapping2_0 manyToManyMapping = (JavaManyToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = manyToManyMapping.getMapKeyAttributeOverrideContainer();
+		assertEquals(4, mapKeyAttributeOverrideContainer.overridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAR");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.FOO2");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(7, mapKeyAttributeOverrideContainer.overridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(7, mapKeyAttributeOverrideContainer.overridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.state.foo");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(7, mapKeyAttributeOverrideContainer.overridesSize());
+	}
+	
+	public void testMapKeyValueVirtualAttributeOverridesSize() throws Exception {
+		createTestEntityWithEmbeddableKeyManyToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaManyToManyMapping2_0 manyToManyMapping = (JavaManyToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = manyToManyMapping.getMapKeyAttributeOverrideContainer();
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAR");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(3, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.state.foo");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("size");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(2, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+	}
+
+	public void testMapKeyValueAttributeOverrideSetVirtual() throws Exception {
+		createTestEntityWithEmbeddableKeyManyToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+				
+		JavaManyToManyMapping2_0 manyToManyMapping = (JavaManyToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = manyToManyMapping.getMapKeyAttributeOverrideContainer();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		Iterator<NestableAnnotation> attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("key.city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.state.foo", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		mapKeyAttributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("key.state.foo", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		mapKeyAttributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertFalse(attributeOverrides.hasNext());
+		
+		Iterator<JavaVirtualAttributeOverride> virtualAttributeOverrides = mapKeyAttributeOverrideContainer.virtualOverrides();
+		assertEquals("city", virtualAttributeOverrides.next().getName());
+		assertEquals("state.foo", virtualAttributeOverrides.next().getName());
+		assertEquals("state.address", virtualAttributeOverrides.next().getName());
+		assertEquals("zip", virtualAttributeOverrides.next().getName());
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+	}
+	
+	
+	public void testMapKeyValueMoveSpecifiedAttributeOverride() throws Exception {
+		createTestEntityWithEmbeddableKeyManyToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaManyToManyMapping2_0 manyToManyMapping = (JavaManyToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = manyToManyMapping.getMapKeyAttributeOverrideContainer();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		ListIterator<JavaAttributeOverride> specifiedOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("city", specifiedOverrides.next().getName());
+		assertEquals("state.foo", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		attributeResource.moveAnnotation(1, 0, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		Iterator<NestableAnnotation> attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+
+		assertEquals("key.state.foo", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		specifiedOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("state.foo", specifiedOverrides.next().getName());
+		assertEquals("city", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaManyToOneMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaManyToOneMappingTests.java
new file mode 100644
index 0000000..5a0a6e1
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaManyToOneMappingTests.java
@@ -0,0 +1,330 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToOneRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaManyToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOneToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.MapsId2_0Annotation;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.EclipseLink2_0ContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0JavaManyToOneMappingTests
+	extends EclipseLink2_0ContextModelTestCase
+{
+	public EclipseLink2_0JavaManyToOneMappingTests(String name) {
+		super(name);
+	}
+	
+	
+	private void createTestEntity() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE);
+			}
+			
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+				sb.append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToOne");
+				sb.append(CR);
+				sb.append("    private Address address;");
+				sb.append(CR);
+				sb.append(CR);
+				sb.append("    @Id");			
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithIdDerivedIdentity() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToOne @Id").append(CR);				
+				sb.append("    private " + TYPE_NAME + " manyToOne;").append(CR);
+				sb.append(CR);				
+			}
+		});
+	}
+	
+	private void createTestEntityWithMapsIdDerivedIdentity() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE, JPA2_0.MAPS_ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToOne @MapsId").append(CR);				
+				sb.append("    private " + TYPE_NAME + " manyToOne;").append(CR);
+				sb.append(CR);				
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+	
+	public void testUpdateDerivedId() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("manyToOne");
+		JavaManyToOneMapping2_0 contextMapping = (JavaManyToOneMapping2_0) contextAttribute.getMapping();
+		
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceAttribute.removeAnnotation(JPA.ID);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceAttribute.addAnnotation(JPA.ID);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+	}
+	
+	public void testSetDerivedId() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("manyToOne");
+		JavaManyToOneMapping2_0 contextMapping = (JavaManyToOneMapping2_0) contextAttribute.getMapping();
+		
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().setValue(false);
+		assertNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().setValue(true);
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+	}
+	
+	public void testUpdateMapsId() throws Exception {
+		createTestEntityWithMapsIdDerivedIdentity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("manyToOne");
+		JavaManyToOneMapping2_0 contextMapping = (JavaManyToOneMapping2_0) contextAttribute.getMapping();
+		
+		MapsId2_0Annotation annotation = 
+				(MapsId2_0Annotation) resourceAttribute.getAnnotation(JPA2_0.MAPS_ID);
+		annotation.setValue("foo");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("foo", annotation.getValue());
+		assertEquals("foo", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		annotation.setValue("bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("bar", annotation.getValue());
+		assertEquals("bar", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		resourceAttribute.removeAnnotation(JPA2_0.MAPS_ID);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+	
+	public void testSetMapsId() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("address");
+		JavaManyToOneMapping2_0 contextMapping = (JavaManyToOneMapping2_0) contextAttribute.getMapping();
+		
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue("foo");
+		MapsId2_0Annotation annotation = 
+				(MapsId2_0Annotation) resourceAttribute.getAnnotation(JPA2_0.MAPS_ID);
+		assertNotNull(annotation);
+		assertEquals("foo", annotation.getValue());
+		assertEquals("foo", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue("bar");
+		assertEquals("bar", annotation.getValue());
+		assertEquals("bar", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue(null);
+		assertNotNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+	
+	public void testMorphMapping() throws Exception {
+		createTestEntityWithMapsIdDerivedIdentity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("manyToOne");
+		
+		((MapsId2_0Annotation) resourceAttribute.getAnnotation(JPA2_0.MAPS_ID)).setValue("foo");
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertFalse(((JavaManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertNotNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertEquals("foo", ((MapsId2_0Annotation) resourceAttribute.getAnnotation(JPA2_0.MAPS_ID)).getValue());
+		assertEquals("foo", ((JavaManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextAttribute.setMappingKey(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		assertFalse(((JavaOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertNotNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertEquals("foo", ((MapsId2_0Annotation) resourceAttribute.getAnnotation(JPA2_0.MAPS_ID)).getValue());
+		assertEquals("foo", ((JavaOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextAttribute.setMappingKey(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		assertFalse(((JavaManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertNotNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertEquals("foo", ((MapsId2_0Annotation) resourceAttribute.getAnnotation(JPA2_0.MAPS_ID)).getValue());
+		assertEquals("foo", ((JavaManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+
+	public void testModifyPredominantJoiningStrategy() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaResourcePersistentAttribute resourceAttribute = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME).persistableAttributes().next();
+		PersistentAttribute contextAttribute = getJavaPersistentType().attributes().next();
+		ManyToOneMapping2_0 mapping = (ManyToOneMapping2_0) contextAttribute.getMapping();
+		ManyToOneRelationship2_0 rel = (ManyToOneRelationship2_0) mapping.getRelationship();
+
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinColumn();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinTable();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinColumn();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+	}
+
+	public void testUpdatePredominantJoiningStrategy() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaResourcePersistentAttribute resourceAttribute = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME).persistableAttributes().next();
+		PersistentAttribute contextAttribute = getJavaPersistentType().attributes().next();
+		ManyToOneMapping2_0 mapping = (ManyToOneMapping2_0) contextAttribute.getMapping();
+		ManyToOneRelationship2_0 rel = (ManyToOneRelationship2_0) mapping.getRelationship();
+
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceAttribute.addAnnotation(JPA.JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceAttribute.addAnnotation(JPA.JOIN_TABLE);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+
+		resourceAttribute.removeAnnotation(JPA.JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+
+		resourceAttribute.removeAnnotation(JPA.JOIN_TABLE);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaMappedSuperclassTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaMappedSuperclassTests.java
new file mode 100644
index 0000000..900873b
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaMappedSuperclassTests.java
@@ -0,0 +1,528 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cacheable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.CacheableHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.PersistenceUnit2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.SharedCacheMode;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.Cacheable2_0Annotation;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTracking;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomizer;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkMappedSuperclass;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkReadOnly;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkChangeTrackingAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkCustomizerAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLinkReadOnlyAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.EclipseLink2_0ContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0JavaMappedSuperclassTests extends EclipseLink2_0ContextModelTestCase
+{
+	protected static final String SUB_TYPE_NAME = "AnnotationTestTypeChild";
+	protected static final String FULLY_QUALIFIED_SUB_TYPE_NAME = PACKAGE_NAME + "." + SUB_TYPE_NAME;
+
+	private ICompilationUnit createTestMappedSuperclass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+
+	private void createTestSubType() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MAPPED_SUPERCLASS);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@MappedSuperclass");
+				sb.append(CR);
+				sb.append("public class ").append("AnnotationTestTypeChild").append(" ");
+				sb.append("extends " + TYPE_NAME + " ");
+				sb.append("{}").append(CR);
+			}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "AnnotationTestTypeChild.java", sourceWriter);
+	}
+
+	private ICompilationUnit createTestMappedSuperclassWithReadOnly() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.READ_ONLY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+				sb.append("@ReadOnly").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclassWithConvertAndCustomizerClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.CUSTOMIZER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+				sb.append("    @Customizer(Foo.class");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclassWithChangeTracking() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.CHANGE_TRACKING);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+				sb.append("    @ChangeTracking").append(CR);
+			}
+		});
+	}
+
+	public EclipseLink2_0JavaMappedSuperclassTests(String name) {
+		super(name);
+	}
+
+
+	public void testGetReadOnly() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(true, readOnly.isReadOnly());
+	}
+
+	public void testGetSpecifiedReadOnly() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+	}
+
+	//TODO test inheriting a default readonly from you superclass
+	public void testGetDefaultReadOnly() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(false, readOnly.isDefaultReadOnly());
+	}
+
+	public void testSetSpecifiedReadOnly() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(true, readOnly.isReadOnly());
+		
+		readOnly.setSpecifiedReadOnly(Boolean.FALSE);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		assertNull(typeResource.getAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME));
+		assertEquals(null, readOnly.getSpecifiedReadOnly());//Boolean.FALSE and null really mean the same thing since there are only 2 states in the java resource model
+
+		readOnly.setSpecifiedReadOnly(Boolean.TRUE);
+		assertNotNull(typeResource.getAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME));
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+
+		readOnly.setSpecifiedReadOnly(null);
+		assertNull(typeResource.getAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME));
+		assertEquals(null, readOnly.getSpecifiedReadOnly());//Boolean.FALSE and null really mean the same thing since there are only 2 states in the java resource model
+	}
+	
+	public void testSpecifiedReadOnlyUpdatesFromResourceModelChange() throws Exception {
+		createTestMappedSuperclassWithReadOnly();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkReadOnly readOnly = mappedSuperclass.getReadOnly();
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+		
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		typeResource.removeAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(null, readOnly.getSpecifiedReadOnly());
+		assertEquals(false, readOnly.isDefaultReadOnly());
+		
+		typeResource.addAnnotation(EclipseLinkReadOnlyAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, readOnly.getSpecifiedReadOnly());
+	}
+
+	public void testGetCustomizerClass() throws Exception {
+		createTestMappedSuperclassWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCustomizer customizer = ((EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping()).getCustomizer();
+		
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+	}
+
+	public void testSetCustomizerClass() throws Exception {
+		createTestMappedSuperclassWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkCustomizer customizer = ((EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping()).getCustomizer();
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+		
+		customizer.setSpecifiedCustomizerClass("Bar");
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+			
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCustomizerAnnotation customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", customizerAnnotation.getValue());
+
+		
+		customizer.setSpecifiedCustomizerClass(null);
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals(null, customizerAnnotation);
+
+
+		customizer.setSpecifiedCustomizerClass("Bar");
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		assertEquals("Bar", customizerAnnotation.getValue());
+	}
+	
+	public void testGetCustomizerClassUpdatesFromResourceModelChange() throws Exception {
+		createTestMappedSuperclassWithConvertAndCustomizerClass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkCustomizer customizer = mappedSuperclass.getCustomizer();
+
+		assertEquals("Foo", customizer.getSpecifiedCustomizerClass());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkCustomizerAnnotation customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.getAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);
+		customizerAnnotation.setValue("Bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("Bar", customizer.getSpecifiedCustomizerClass());
+		
+		typeResource.removeAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		
+		customizerAnnotation = (EclipseLinkCustomizerAnnotation) typeResource.addAnnotation(EclipseLinkCustomizerAnnotation.ANNOTATION_NAME);		
+		getJpaProject().synchronizeContextModel();
+		assertEquals(null, customizer.getSpecifiedCustomizerClass());
+		
+		customizerAnnotation.setValue("FooBar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("FooBar", customizer.getSpecifiedCustomizerClass());	
+	}
+	
+	public void testGetChangeTracking() throws Exception {
+		createTestMappedSuperclassWithChangeTracking();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkChangeTracking contextChangeTracking = mappedSuperclass.getChangeTracking();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkChangeTrackingAnnotation resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test context value
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to ATTRIBUTE specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to OBJECT specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to DEFERRED specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getSpecifiedType());
+		
+		// change resource to AUTO specifically, test context
+		
+		resourceChangeTracking.setValue(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// remove value from resource, test context
+		
+		resourceChangeTracking.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// remove annotation, text context
+		
+		typeResource.removeAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getDefaultType());
+		assertNull(contextChangeTracking.getSpecifiedType());
+	}
+	
+	public void testSetChangeTracking() throws Exception {
+		createTestMappedSuperclassWithChangeTracking();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) getJavaPersistentType().getMapping();
+		EclipseLinkChangeTracking contextChangeTracking = mappedSuperclass.getChangeTracking();
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		EclipseLinkChangeTrackingAnnotation resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		// base annotated, test resource value
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change context to AUTO specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		
+		assertNull(resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+		
+		// change context to ATTRIBUTE specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.ATTRIBUTE, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, contextChangeTracking.getSpecifiedType());
+		
+		// change context to OBJECT specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.OBJECT);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.OBJECT, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, contextChangeTracking.getSpecifiedType());
+		
+		// change context to DEFERRED specifically, test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.DEFERRED);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.DEFERRED, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, contextChangeTracking.getSpecifiedType());
+		
+		// change context to null, test resource
+		
+		contextChangeTracking.setSpecifiedType(null);
+		
+		assertNull(typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME));
+		assertNull(contextChangeTracking.getSpecifiedType());
+		
+		// change context to AUTO specifically (this time from no annotation), test resource
+		
+		contextChangeTracking.setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		resourceChangeTracking = (EclipseLinkChangeTrackingAnnotation) typeResource.getAnnotation(EclipseLinkChangeTrackingAnnotation.ANNOTATION_NAME);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.java.ChangeTrackingType.AUTO, resourceChangeTracking.getValue());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, contextChangeTracking.getSpecifiedType());
+	}
+	
+	
+	public void testSetSpecifiedCacheable() throws Exception {
+		ICompilationUnit cu = createTestMappedSuperclass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) getJavaPersistentType().getMapping()).getCacheable();
+		Cacheable2_0Annotation cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation);
+		
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);		
+		assertEquals(Boolean.FALSE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.FALSE, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable(false)", cu);
+		
+		cacheable.setSpecifiedCacheable(Boolean.TRUE);
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);		
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable", cu);
+		
+		cacheable.setSpecifiedCacheable(null);
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);		
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation);
+		assertSourceDoesNotContain("@Cacheable", cu);
+	}
+	
+	public void testGetSpecifiedCacheable() throws Exception {
+		ICompilationUnit cu = createTestMappedSuperclass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) getJavaPersistentType().getMapping()).getCacheable();
+		Cacheable2_0Annotation cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation);
+		
+		getJavaPersistentType().getResourcePersistentType().addAnnotation(JPA2_0.CACHEABLE);
+		getJpaProject().synchronizeContextModel();
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable", cu);
+
+		cacheableAnnotation.setValue(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.FALSE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.FALSE, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable(false)", cu);
+		
+		cacheableAnnotation.setValue(Boolean.TRUE);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.TRUE, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable(true)", cu);
+		
+		cacheableAnnotation.setValue(null);
+		getJpaProject().synchronizeContextModel();
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation.getValue());
+		assertSourceContains("@Cacheable", cu);
+
+		getJavaPersistentType().getResourcePersistentType().removeAnnotation(JPA2_0.CACHEABLE);
+		getJpaProject().synchronizeContextModel();
+		cacheableAnnotation = (Cacheable2_0Annotation) getJavaPersistentType().getResourcePersistentType().getAnnotation(JPA2_0.CACHEABLE);		
+		assertEquals(null,  cacheable.getSpecifiedCacheable());
+		assertEquals(null, cacheableAnnotation);
+		assertSourceDoesNotContain("@Cacheable", cu);
+	}
+	
+	public void testIsDefaultCacheable() throws Exception {
+		createTestMappedSuperclass();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) getJavaPersistentType().getMapping()).getCacheable();
+		PersistenceUnit2_0 persistenceUnit = getPersistenceUnit();
+		assertEquals(SharedCacheMode.DISABLE_SELECTIVE, persistenceUnit.getSharedCacheMode());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.ALL);
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit.setSpecifiedSharedCacheMode(SharedCacheMode.UNSPECIFIED);
+		assertEquals(true, cacheable.isDefaultCacheable());
+	}
+	
+	public void testInheritedIsDefaultCacheable() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		addXmlClassRef(FULLY_QUALIFIED_SUB_TYPE_NAME);
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 subCacheable = ((CacheableHolder2_0) getJavaPersistentType().getMapping()).getCacheable();
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) getJavaPersistentType().getSuperPersistentType().getMapping()).getCacheable();
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(null);
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+				
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		cacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaOneToManyMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaOneToManyMappingTests.java
new file mode 100644
index 0000000..b7601a0
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaOneToManyMappingTests.java
@@ -0,0 +1,1422 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2011 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.Embeddable;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinColumnRelationship;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.java.JavaAttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.java.JavaVirtualAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToManyRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrderColumn2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.Orderable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOneToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOrphanRemovable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.MapKeyClass2_0Annotation;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.MapKeyColumn2_0Annotation;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.OneToMany2_0Annotation;
+import org.eclipse.jpt.jpa.core.resource.java.AttributeOverrideAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.AttributeOverridesAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.MapKeyAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.NestableAnnotation;
+import org.eclipse.jpt.jpa.core.resource.java.OneToManyAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.EclipseLink2_0ContextModelTestCase;
+
+/**
+ *  EclipseLink2_0JavaOneToManyMappingTests
+ */
+@SuppressWarnings("nls")
+public class EclipseLink2_0JavaOneToManyMappingTests
+	extends EclipseLink2_0ContextModelTestCase
+{
+	public EclipseLink2_0JavaOneToManyMappingTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestEntity() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID, "java.util.Collection");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private Collection<Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private ICompilationUnit createTestEntityWithOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToMany").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithValidGenericMapOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private java.util.Map<String, Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithValidNonGenericMapOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private java.util.Map addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MANY_TO_ONE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToOne").append(CR);
+				sb.append("    private AnnotationTestType employee;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+			}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	private void createTestEmbeddableState() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("State").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    private String address;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+			}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter);
+	}
+
+	private ICompilationUnit createTestEntityWithEmbeddableKeyOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private java.util.Map<Address, PropertyInfo> parcels;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private void createTestEmbeddableAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+			}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	private void createTestEntityPropertyInfo() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PropertyInfo").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private Integer parcelNumber;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+				sb.append("    private Integer size;").append(CR);
+				sb.append(CR);
+				sb.append("    private java.math.BigDecimal tax;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PropertyInfo.java", sourceWriter);
+	}			
+	private ICompilationUnit createTestEntityWithValidOneToManyMappingOrphanRemovalSpecified() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID, "java.util.Collection");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany(orphanRemoval=false)").append(CR);
+				sb.append("    private Collection<Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private JavaOrphanRemovable2_0 getOrphanRemovalOf(OneToManyMapping2_0 oneToManyMapping) {
+		return ((JavaOrphanRemovalHolder2_0) oneToManyMapping).getOrphanRemoval();
+	}
+
+	public void testDefaultOneToManyGetDefaultOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		assertEquals(false, this.getOrphanRemovalOf(oneToManyMapping).isDefaultOrphanRemoval());
+	}
+	
+	public void testSpecifiedOneToManyGetDefaultOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		assertEquals(false, this.getOrphanRemovalOf(oneToManyMapping).isDefaultOrphanRemoval());
+	}
+	
+	public void testGetOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToManyMapping);
+
+
+		assertEquals(false, mappingsOrphanRemoval.isOrphanRemoval());
+		
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.TRUE);
+		assertEquals(true, mappingsOrphanRemoval.isOrphanRemoval());
+	}
+	
+	public void testGetSpecifiedOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToManyMapping);
+
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToMany2_0Annotation oneToMany = (OneToMany2_0Annotation) attributeResource.getAnnotation(JPA.ONE_TO_MANY);
+		oneToMany.setOrphanRemoval(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(Boolean.FALSE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+	}
+	
+	public void testGetSpecifiedOrphanRemoval2() throws Exception {
+		this.createTestEntityWithValidOneToManyMappingOrphanRemovalSpecified();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToManyMapping);
+
+		assertEquals(Boolean.FALSE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+	}
+
+	public void testSetSpecifiedOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToManyMapping);
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.TRUE);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToMany2_0Annotation oneToMany = (OneToMany2_0Annotation) attributeResource.getAnnotation(JPA.ONE_TO_MANY);
+		
+		assertEquals(Boolean.TRUE, oneToMany.getOrphanRemoval());
+		
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(null);
+		assertNotNull(attributeResource.getAnnotation(JPA.ONE_TO_MANY)); 	// .getElement);
+	}
+	
+	public void testSetSpecifiedOrphanRemoval2() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToManyMapping);
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.TRUE);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToMany2_0Annotation oneToMany = (OneToMany2_0Annotation) attributeResource.getAnnotation(JPA.ONE_TO_MANY);
+		
+		assertEquals(Boolean.TRUE, oneToMany.getOrphanRemoval());
+		
+		oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		assertEquals(Boolean.TRUE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(null);
+		assertNotNull(attributeResource.getAnnotation(JPA.ONE_TO_MANY));
+		
+		oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+	}
+
+	public void testGetSpecifiedOrphanRemovalUpdatesFromResourceModelChange() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToManyMapping);
+
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToMany2_0Annotation oneToMany = (OneToMany2_0Annotation) attributeResource.getAnnotation(JPA.ONE_TO_MANY);
+		oneToMany.setOrphanRemoval(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(Boolean.FALSE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		
+		oneToMany.setOrphanRemoval(null);
+		getJpaProject().synchronizeContextModel();
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertSame(oneToManyMapping, persistentAttribute.getMapping());
+		
+		oneToMany.setOrphanRemoval(Boolean.FALSE);
+		attributeResource.setPrimaryAnnotation(null, EmptyIterable.<String>instance());
+		getJpaProject().synchronizeContextModel();
+		
+		assertTrue(persistentAttribute.getMapping().isDefault());
+	}
+	
+	public void testUpdateMapKey() throws Exception {
+		createTestEntityWithOneToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping oneToManyMapping = (OneToManyMapping) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(oneToManyMapping.getSpecifiedMapKey());
+		assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME));
+		
+		//set mapKey in the resource model, verify context model does not change
+		attributeResource.addAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNull(oneToManyMapping.getSpecifiedMapKey());
+		MapKeyAnnotation mapKey = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNotNull(mapKey);
+				
+		//set mapKey name in the resource model, verify context model updated
+		mapKey.setName("myMapKey");
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals("myMapKey", oneToManyMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", mapKey.getName());
+		
+		//set mapKey name to null in the resource model
+		mapKey.setName(null);
+		getJpaProject().synchronizeContextModel();
+		
+		assertNull(oneToManyMapping.getSpecifiedMapKey());
+		assertNull(mapKey.getName());
+		
+		mapKey.setName("myMapKey");
+		attributeResource.removeAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNull(oneToManyMapping.getSpecifiedMapKey());
+		assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME));
+	}
+	
+	public void testModifyMapKey() throws Exception {
+		createTestEntityWithOneToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping oneToManyMapping = (OneToManyMapping) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(oneToManyMapping.getSpecifiedMapKey());
+		assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME));
+					
+		//set mapKey  in the context model, verify resource model updated
+		oneToManyMapping.setSpecifiedMapKey("myMapKey");
+		MapKeyAnnotation mapKey = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertEquals("myMapKey", oneToManyMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", mapKey.getName());
+	
+		//set mapKey to null in the context model
+		oneToManyMapping.setSpecifiedMapKey(null);
+		assertNull(oneToManyMapping.getSpecifiedMapKey());
+		mapKey = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME);
+		assertNull(mapKey.getName());
+	}
+	
+	public void testCandidateMapKeyNames() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaOneToManyMapping javaOneToManyMapping = (JavaOneToManyMapping) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = 
+			javaOneToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.foo", mapKeyNames.next());
+		assertEquals("state.address", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertEquals("employee", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+	}
+	
+	public void testCandidateMapKeyNames2() throws Exception {
+		createTestEntityWithValidNonGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaOneToManyMapping javaOneToManyMapping = (JavaOneToManyMapping) getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = javaOneToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		javaOneToManyMapping.setSpecifiedTargetEntity("test.Address");
+		mapKeyNames = javaOneToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.foo", mapKeyNames.next());
+		assertEquals("state.address", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertEquals("employee", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+	}
+	
+	public void testUpdateMapKeyClass() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(oneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+		
+		//set mapKey in the resource model, verify context model does not change
+		attributeResource.addAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		assertNull(oneToManyMapping.getSpecifiedMapKeyClass());
+		MapKeyClass2_0Annotation mapKeyClassAnnotation = (MapKeyClass2_0Annotation) attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		assertNotNull(mapKeyClassAnnotation);
+				
+		//set mapKey name in the resource model, verify context model updated
+		mapKeyClassAnnotation.setValue("myMapKeyClass");
+		this.getJpaProject().synchronizeContextModel();
+		assertEquals("myMapKeyClass", oneToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("myMapKeyClass", mapKeyClassAnnotation.getValue());
+		
+		//set mapKey name to null in the resource model
+		mapKeyClassAnnotation.setValue(null);
+		this.getJpaProject().synchronizeContextModel();
+		assertNull(oneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(mapKeyClassAnnotation.getValue());
+		
+		mapKeyClassAnnotation.setValue("myMapKeyClass");
+		attributeResource.removeAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+
+		assertNull(oneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+	}
+	
+	public void testModifyMapKeyClass() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		assertNull(oneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+					
+		//set mapKey  in the context model, verify resource model updated
+		oneToManyMapping.setSpecifiedMapKeyClass("String");
+		MapKeyClass2_0Annotation mapKeyClass = (MapKeyClass2_0Annotation) attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME);
+		assertEquals("String", oneToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("String", mapKeyClass.getValue());
+	
+		//set mapKey to null in the context model
+		oneToManyMapping.setSpecifiedMapKeyClass(null);
+		assertNull(oneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME));
+	}
+
+	public void testDefaultMapKeyClass() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals("java.lang.String", oneToManyMapping.getDefaultMapKeyClass());
+
+		//test default still the same when specified target entity it set
+		oneToManyMapping.setSpecifiedMapKeyClass("foo");
+		assertEquals("java.lang.String", oneToManyMapping.getDefaultMapKeyClass());
+	}
+	
+	public void testDefaultMapKeyClassCollectionType() throws Exception {
+		createTestEntityWithValidOneToManyMappingOrphanRemovalSpecified();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+
+		assertNull(oneToManyMapping.getDefaultMapKeyClass());
+	}
+	
+	public void testMapKeyClass() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals("java.lang.String", oneToManyMapping.getMapKeyClass());
+
+		oneToManyMapping.setSpecifiedMapKeyClass("foo");
+		assertEquals("foo", oneToManyMapping.getMapKeyClass());
+		
+		oneToManyMapping.setSpecifiedMapKeyClass(null);
+		assertEquals("java.lang.String", oneToManyMapping.getMapKeyClass());
+	}
+
+	public void testOrderColumnDefaults() throws Exception {
+		createTestEntityPrintQueue();
+		createTestEntityPrintJob();
+		
+		addXmlClassRef(PACKAGE_NAME + ".PrintQueue");
+		addXmlClassRef(PACKAGE_NAME + ".PrintJob");
+		
+		OneToManyMapping oneToManyMapping = (OneToManyMapping) getJavaPersistentType().getAttributeNamed("jobs").getMapping();
+
+		Orderable2_0 orderable = ((Orderable2_0) oneToManyMapping.getOrderable());
+		OrderColumn2_0 orderColumn = orderable.getOrderColumn();
+		assertEquals(true, orderable.isOrderColumnOrdering());
+		assertEquals(null, orderColumn.getSpecifiedName());
+		assertEquals("jobs_ORDER", orderColumn.getDefaultName());
+		assertEquals("PrintJob", orderColumn.getTable());
+		
+		orderColumn.setSpecifiedName("FOO");
+		assertEquals("FOO", orderColumn.getSpecifiedName());
+		assertEquals("jobs_ORDER", orderColumn.getDefaultName());
+		assertEquals("PrintJob", orderColumn.getTable());
+		
+		JavaPersistentType printJobPersistentType = (JavaPersistentType) getPersistenceUnit().getPersistentType("test.PrintJob");
+		((Entity) printJobPersistentType.getMapping()).getTable().setSpecifiedName("MY_TABLE");
+
+		assertEquals("MY_TABLE", orderColumn.getTable());
+	}
+	
+	private void createTestEntityPrintQueue() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ONE_TO_MANY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ORDER_COLUMN);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PrintQueue").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToMany(mappedBy=\"queue\")").append(CR);
+				sb.append("    @OrderColumn").append(CR);
+				sb.append("    private java.util.List<PrintJob> jobs;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PrintQueue.java", sourceWriter);
+	}
+	
+	private void createTestEntityPrintJob() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MANY_TO_ONE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PrintJob").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToOne").append(CR);
+				sb.append("    private PrintQueue queue;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PrintJob.java", sourceWriter);
+	}
+
+	public void testGetMapKeyColumnMappedByStrategy() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		oneToManyMapping.getRelationship().setStrategyToMappedBy();
+		oneToManyMapping.getRelationship().getMappedByStrategy().setMappedByAttribute("employee");
+
+		assertNull(oneToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("addresses_KEY", oneToManyMapping.getMapKeyColumn().getName());
+		assertEquals("Address", oneToManyMapping.getMapKeyColumn().getTable());//owing entity table name
+
+		Entity addressEntity = getPersistenceUnit().getEntity("test.Address");
+		addressEntity.getTable().setSpecifiedName("MY_PRIMARY_TABLE");
+		assertEquals("MY_PRIMARY_TABLE", oneToManyMapping.getMapKeyColumn().getTable());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		MapKeyColumn2_0Annotation column = (MapKeyColumn2_0Annotation) attributeResource.addAnnotation(JPA2_0.MAP_KEY_COLUMN);
+		column.setName("foo");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals("foo", oneToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("foo", oneToManyMapping.getMapKeyColumn().getName());
+		assertEquals("addresses_KEY", oneToManyMapping.getMapKeyColumn().getDefaultName());
+	}
+	
+	public void testGetMapKeyColumnJoinTableStrategy() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+
+		assertNull(oneToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("addresses_KEY", oneToManyMapping.getMapKeyColumn().getName());
+		assertEquals(TYPE_NAME + "_Address", oneToManyMapping.getMapKeyColumn().getTable());//join table name
+
+		oneToManyMapping.getRelationship().getJoinTableStrategy().getJoinTable().setSpecifiedName("MY_PRIMARY_TABLE");
+		assertEquals("MY_PRIMARY_TABLE", oneToManyMapping.getMapKeyColumn().getTable());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		MapKeyColumn2_0Annotation column = (MapKeyColumn2_0Annotation) attributeResource.addAnnotation(JPA2_0.MAP_KEY_COLUMN);
+		column.setName("foo");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals("foo", oneToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("foo", oneToManyMapping.getMapKeyColumn().getName());
+		assertEquals("addresses_KEY", oneToManyMapping.getMapKeyColumn().getDefaultName());
+	}
+
+	public void testTargetForeignKeyJoinColumnStrategy() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		((JoinColumnRelationship) oneToManyMapping.getRelationship()).setStrategyToJoinColumn();
+
+		JoinColumn joinColumn = ((JoinColumnRelationship) oneToManyMapping.getRelationship()).getJoinColumnStrategy().specifiedJoinColumns().next();
+
+		assertEquals("addresses_id", joinColumn.getDefaultName());
+		assertEquals("Address", joinColumn.getDefaultTable());//target table name
+
+		Entity addressEntity = getPersistenceUnit().getEntity("test.Address");
+		addressEntity.getTable().setSpecifiedName("ADDRESS_PRIMARY_TABLE");
+		assertEquals("ADDRESS_PRIMARY_TABLE", joinColumn.getDefaultTable());
+
+		joinColumn.setSpecifiedName("FOO");
+		assertEquals("addresses_id", joinColumn.getDefaultName());
+		assertEquals("FOO", joinColumn.getSpecifiedName());
+		assertEquals("ADDRESS_PRIMARY_TABLE", joinColumn.getDefaultTable());
+	}
+
+	//target foreign key case
+	public void testGetMapKeyColumnJoinColumnStrategy() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		((JoinColumnRelationship) oneToManyMapping.getRelationship()).setStrategyToJoinColumn();
+
+		assertNull(oneToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("addresses_KEY", oneToManyMapping.getMapKeyColumn().getName());
+		assertEquals("Address", oneToManyMapping.getMapKeyColumn().getTable());//target table name
+
+		Entity addressEntity = getPersistenceUnit().getEntity("test.Address");
+		addressEntity.getTable().setSpecifiedName("ADDRESS_PRIMARY_TABLE");
+		assertEquals("ADDRESS_PRIMARY_TABLE", oneToManyMapping.getMapKeyColumn().getTable());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		MapKeyColumn2_0Annotation column = (MapKeyColumn2_0Annotation) attributeResource.addAnnotation(JPA2_0.MAP_KEY_COLUMN);
+		column.setName("foo");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals("foo", oneToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("foo", oneToManyMapping.getMapKeyColumn().getName());
+		assertEquals("addresses_KEY", oneToManyMapping.getMapKeyColumn().getDefaultName());
+		assertEquals("ADDRESS_PRIMARY_TABLE", oneToManyMapping.getMapKeyColumn().getDefaultTable());
+	}
+
+	//target foreign key case
+	public void testOrderColumnDefaultsJoinColumnStrategy() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		((JoinColumnRelationship) oneToManyMapping.getRelationship()).setStrategyToJoinColumn();
+		((Orderable2_0) oneToManyMapping.getOrderable()).setOrderColumnOrdering(true);
+		OrderColumn2_0 orderColumn = ((Orderable2_0) oneToManyMapping.getOrderable()).getOrderColumn();
+
+
+		assertNull(orderColumn.getSpecifiedName());
+		assertEquals("addresses_ORDER", orderColumn.getName());
+		assertEquals("Address", orderColumn.getTable());//target table name
+
+		Entity addressEntity = getPersistenceUnit().getEntity("test.Address");
+		addressEntity.getTable().setSpecifiedName("ADDRESS_PRIMARY_TABLE");
+		assertEquals("ADDRESS_PRIMARY_TABLE", orderColumn.getTable());
+	}
+
+	public void testModifyPredominantJoiningStrategy() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaResourcePersistentAttribute resourceAttribute = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME).persistableAttributes().next();
+		OneToManyAnnotation annotation = (OneToManyAnnotation) resourceAttribute.getAnnotation(JPA.ONE_TO_MANY);
+		PersistentAttribute contextAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 mapping = (OneToManyMapping2_0) contextAttribute.getMapping();
+		OneToManyRelationship2_0 rel = (OneToManyRelationship2_0) mapping.getRelationship();
+		
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToJoinColumn();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToMappedBy();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNotNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToJoinTable();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+	}
+	
+	public void testUpdatePredominantJoiningStrategy() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		JavaResourcePersistentAttribute resourceAttribute = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME).persistableAttributes().next();
+		OneToManyAnnotation annotation = (OneToManyAnnotation) resourceAttribute.getAnnotation(JPA.ONE_TO_MANY);
+		PersistentAttribute contextAttribute = getJavaPersistentType().attributes().next();
+		OneToManyMapping2_0 mapping = (OneToManyMapping2_0) contextAttribute.getMapping();
+		OneToManyRelationship2_0 rel = (OneToManyRelationship2_0) mapping.getRelationship();
+		
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		annotation.setMappedBy("foo");
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNotNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceAttribute.addAnnotation(JPA.JOIN_TABLE);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNotNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceAttribute.addAnnotation(JPA.JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNotNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		annotation.setMappedBy(null);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceAttribute.removeAnnotation(JPA.JOIN_TABLE);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceAttribute.removeAnnotation(JPA.JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertNull(annotation.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+	}
+
+	public void testMapKeySpecifiedAttributeOverrides() throws Exception {
+		createTestEntityWithEmbeddableKeyOneToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		
+		JavaOneToManyMapping2_0 oneToManyMapping = (JavaOneToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = oneToManyMapping.getMapKeyAttributeOverrideContainer();
+		
+		ListIterator<JavaAttributeOverride> specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.BAR");
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAZ");
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+	
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BLAH");
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("BAZ", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		//move an annotation to the resource model and verify the context model is updated
+		attributeResource.moveAnnotation(1, 0, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+	
+		attributeResource.removeAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("BLAH", specifiedMapKeyAttributeOverrides.next().getName());
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertEquals("value.BAR", specifiedMapKeyAttributeOverrides.next().getName());
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+
+		attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		getJpaProject().synchronizeContextModel();
+		specifiedMapKeyAttributeOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();		
+		assertFalse(specifiedMapKeyAttributeOverrides.hasNext());
+	}
+
+	public void testMapKeyValueVirtualAttributeOverrides() throws Exception {
+		createTestEntityWithEmbeddableKeyOneToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaOneToManyMapping2_0 oneToManyMapping = (JavaOneToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = oneToManyMapping.getMapKeyAttributeOverrideContainer();
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		assertEquals("parcels", attributeResource.getName());
+		assertNull(attributeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+		
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		ReadOnlyAttributeOverride defaultAttributeOverride = mapKeyAttributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("city", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_PropertyInfo", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		
+		ListIterator<ClassRef> classRefs = getPersistenceUnit().specifiedClassRefs();
+		classRefs.next();
+		Embeddable addressEmbeddable = (Embeddable) classRefs.next().getJavaPersistentType().getMapping();
+		
+		BasicMapping cityMapping = (BasicMapping) addressEmbeddable.getPersistentType().getAttributeNamed("city").getMapping();
+		cityMapping.getColumn().setSpecifiedName("FOO");
+		cityMapping.getColumn().setSpecifiedTable("BAR");
+		cityMapping.getColumn().setColumnDefinition("COLUMN_DEF");
+		cityMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		cityMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		cityMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		cityMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		cityMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+		
+		assertEquals("parcels", attributeResource.getName());
+		assertNull(attributeResource.getAnnotation(AttributeOverrideAnnotation.ANNOTATION_NAME));
+		assertNull(attributeResource.getAnnotation(AttributeOverridesAnnotation.ANNOTATION_NAME));
+
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		defaultAttributeOverride = mapKeyAttributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("FOO", defaultAttributeOverride.getColumn().getName());
+		assertEquals("BAR", defaultAttributeOverride.getColumn().getTable());
+		assertEquals("COLUMN_DEF", defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(false, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(5, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(6, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, defaultAttributeOverride.getColumn().getScale());
+
+		cityMapping.getColumn().setSpecifiedName(null);
+		cityMapping.getColumn().setSpecifiedTable(null);
+		cityMapping.getColumn().setColumnDefinition(null);
+		cityMapping.getColumn().setSpecifiedInsertable(null);
+		cityMapping.getColumn().setSpecifiedUpdatable(null);
+		cityMapping.getColumn().setSpecifiedUnique(null);
+		cityMapping.getColumn().setSpecifiedNullable(null);
+		cityMapping.getColumn().setSpecifiedLength(null);
+		cityMapping.getColumn().setSpecifiedPrecision(null);
+		cityMapping.getColumn().setSpecifiedScale(null);
+		defaultAttributeOverride = mapKeyAttributeOverrideContainer.virtualOverrides().next();
+		assertEquals("city", defaultAttributeOverride.getName());
+		assertEquals("city", defaultAttributeOverride.getColumn().getName());
+		assertEquals(TYPE_NAME +"_PropertyInfo", defaultAttributeOverride.getColumn().getTable());
+		assertEquals(null, defaultAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, defaultAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, defaultAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, defaultAttributeOverride.getColumn().isUnique());
+		assertEquals(true, defaultAttributeOverride.getColumn().isNullable());
+		assertEquals(255, defaultAttributeOverride.getColumn().getLength());
+		assertEquals(0, defaultAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, defaultAttributeOverride.getColumn().getScale());
+		
+		AttributeOverrideAnnotation annotation = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		annotation.setName("key.city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(3, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		}
+	
+	public void testMapKeyValueSpecifiedAttributeOverridesSize() throws Exception {
+		createTestEntityWithEmbeddableKeyOneToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaOneToManyMapping2_0 oneToManyMapping = (JavaOneToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = oneToManyMapping.getMapKeyAttributeOverrideContainer();
+		assertEquals(0, mapKeyAttributeOverrideContainer.specifiedOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAR");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.FOO2");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(3, mapKeyAttributeOverrideContainer.specifiedOverridesSize());
+	}
+	
+	public void testMapKeyValueAttributeOverridesSize() throws Exception {
+		createTestEntityWithEmbeddableKeyOneToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+
+		JavaOneToManyMapping2_0 oneToManyMapping = (JavaOneToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = oneToManyMapping.getMapKeyAttributeOverrideContainer();
+		assertEquals(4, mapKeyAttributeOverrideContainer.overridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAR");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("value.FOO2");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(7, mapKeyAttributeOverrideContainer.overridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(7, mapKeyAttributeOverrideContainer.overridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.state.foo");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(7, mapKeyAttributeOverrideContainer.overridesSize());
+	}
+	
+	public void testMapKeyValueVirtualAttributeOverridesSize() throws Exception {
+		createTestEntityWithEmbeddableKeyOneToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaOneToManyMapping2_0 oneToManyMapping = (JavaOneToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = oneToManyMapping.getMapKeyAttributeOverrideContainer();
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+
+		//add an annotation to the resource model and verify the context model is updated
+		AttributeOverrideAnnotation attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("FOO");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.BAR");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.city");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(3, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+		
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("key.state.foo");
+		attributeOverride = (AttributeOverrideAnnotation) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+		attributeOverride.setName("size");
+		getJpaProject().synchronizeContextModel();
+		assertEquals(2, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+	}
+
+	public void testMapKeyValueAttributeOverrideSetVirtual() throws Exception {
+		createTestEntityWithEmbeddableKeyOneToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+				
+		JavaOneToManyMapping2_0 oneToManyMapping = (JavaOneToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = oneToManyMapping.getMapKeyAttributeOverrideContainer();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		Iterator<NestableAnnotation> attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		
+		assertEquals("key.city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.state.foo", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		mapKeyAttributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertEquals("key.state.foo", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		mapKeyAttributeOverrideContainer.specifiedOverrides().next().convertToVirtual();
+		attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		assertFalse(attributeOverrides.hasNext());
+		
+		Iterator<JavaVirtualAttributeOverride> virtualAttributeOverrides = mapKeyAttributeOverrideContainer.virtualOverrides();
+		assertEquals("city", virtualAttributeOverrides.next().getName());
+		assertEquals("state.foo", virtualAttributeOverrides.next().getName());
+		assertEquals("state.address", virtualAttributeOverrides.next().getName());
+		assertEquals("zip", virtualAttributeOverrides.next().getName());
+		assertEquals(4, mapKeyAttributeOverrideContainer.virtualOverridesSize());
+	}
+	
+	
+	public void testMapKeyValueMoveSpecifiedAttributeOverride() throws Exception {
+		createTestEntityWithEmbeddableKeyOneToManyMapping();
+		createTestEmbeddableAddress();
+		createTestEmbeddableState();
+		createTestEntityPropertyInfo();
+		
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".PropertyInfo");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		JavaOneToManyMapping2_0 oneToManyMapping = (JavaOneToManyMapping2_0) getJavaPersistentType().getAttributeNamed("parcels").getMapping();
+		JavaAttributeOverrideContainer mapKeyAttributeOverrideContainer = oneToManyMapping.getMapKeyAttributeOverrideContainer();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		mapKeyAttributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		ListIterator<JavaAttributeOverride> specifiedOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("city", specifiedOverrides.next().getName());
+		assertEquals("state.foo", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		
+		attributeResource.moveAnnotation(1, 0, AttributeOverridesAnnotation.ANNOTATION_NAME);
+		getJpaProject().synchronizeContextModel();
+		
+		Iterator<NestableAnnotation> attributeOverrides = attributeResource.annotations(AttributeOverrideAnnotation.ANNOTATION_NAME, AttributeOverridesAnnotation.ANNOTATION_NAME);
+
+		assertEquals("key.state.foo", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertEquals("key.city", ((AttributeOverrideAnnotation) attributeOverrides.next()).getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		specifiedOverrides = mapKeyAttributeOverrideContainer.specifiedOverrides();
+		assertEquals("state.foo", specifiedOverrides.next().getName());
+		assertEquals("city", specifiedOverrides.next().getName());
+		assertFalse(specifiedOverrides.hasNext());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaOneToOneMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaOneToOneMappingTests.java
new file mode 100644
index 0000000..8d0d5ad
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/EclipseLink2_0JavaOneToOneMappingTests.java
@@ -0,0 +1,818 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToOneRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaManyToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOneToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOrphanRemovable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.MapsId2_0Annotation;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.OneToOne2_0Annotation;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.java.OneToOneAnnotation;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.EclipseLink2_0ContextModelTestCase;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0JavaOneToOneMappingTests
+	extends EclipseLink2_0ContextModelTestCase
+{
+	public EclipseLink2_0JavaOneToOneMappingTests(String name) {
+		super(name);
+	}
+	
+	
+	private void createTestEntity() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE);
+			}
+			
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+				sb.append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne");
+				sb.append(CR);
+				sb.append("    private Address address;");
+				sb.append(CR);
+				sb.append(CR);
+				sb.append("    @Id");			
+			}
+		});
+	}
+
+	private void createTestEntityWithValidOneToOneMappingOrphanRemovalSpecified() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE);
+			}
+			
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+				sb.append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne(orphanRemoval=false)");
+				sb.append(CR);
+				sb.append("    private Address address;");
+				sb.append(CR);
+				sb.append(CR);
+				sb.append("    @Id");			
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithIdDerivedIdentity() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne @Id").append(CR);				
+				sb.append("    private " + TYPE_NAME + " oneToOne;").append(CR);
+				sb.append(CR);				
+			}
+		});
+	}
+	
+	private void createTestEntityWithMapsIdDerivedIdentity() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, JPA2_0.MAPS_ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne @MapsId").append(CR);				
+				sb.append("    private " + TYPE_NAME + " oneToOne;").append(CR);
+				sb.append(CR);				
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+	
+	private ICompilationUnit createTestEntityWithValidOneToOneMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne").append(CR);				
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	private void createTestTargetEntityAddressWithElementCollection() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ELEMENT_COLLECTION);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);
+				sb.append("    private java.util.Collection<State> state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+	
+	private void createTestEmbeddableState() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("State").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter);
+	}
+	
+	public void testUpdateDerivedId() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("oneToOne");
+		JavaOneToOneMapping2_0 contextMapping = (JavaOneToOneMapping2_0) contextAttribute.getMapping();
+		
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceAttribute.removeAnnotation(JPA.ID);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceAttribute.addAnnotation(JPA.ID);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+	}
+	
+	public void testSetDerivedId() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("oneToOne");
+		JavaOneToOneMapping2_0 contextMapping = (JavaOneToOneMapping2_0) contextAttribute.getMapping();
+		
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().setValue(false);
+		assertNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().setValue(true);
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+	}
+	
+	public void testUpdateMapsId() throws Exception {
+		createTestEntityWithMapsIdDerivedIdentity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("oneToOne");
+		JavaOneToOneMapping2_0 contextMapping = (JavaOneToOneMapping2_0) contextAttribute.getMapping();
+		
+		assertNotNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		MapsId2_0Annotation annotation = 
+				(MapsId2_0Annotation) resourceAttribute.getAnnotation(JPA2_0.MAPS_ID);
+		annotation.setValue("foo");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("foo", annotation.getValue());
+		assertEquals("foo", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		annotation.setValue("bar");
+		getJpaProject().synchronizeContextModel();
+		assertEquals("bar", annotation.getValue());
+		assertEquals("bar", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		resourceAttribute.removeAnnotation(JPA2_0.MAPS_ID);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+	
+	public void testSetMapsId() throws Exception {
+		createTestEntity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("address");
+		JavaOneToOneMapping2_0 contextMapping = (JavaOneToOneMapping2_0) contextAttribute.getMapping();
+		
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue("foo");
+		MapsId2_0Annotation annotation = 
+				(MapsId2_0Annotation) resourceAttribute.getAnnotation(JPA2_0.MAPS_ID);
+		assertNotNull(annotation);
+		assertEquals("foo", annotation.getValue());
+		assertEquals("foo", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue("bar");
+		assertEquals("bar", annotation.getValue());
+		assertEquals("bar", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue(null);
+		assertNotNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+	
+	public void testMorphMapping() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentType resourceType = 
+				getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute resourceAttribute = resourceType.persistableAttributes().next();
+		JavaPersistentType contextType = getJavaPersistentType();
+		JavaPersistentAttribute contextAttribute = contextType.getAttributeNamed("oneToOne");
+		
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(((JavaOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(((JavaOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextAttribute.setMappingKey(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(((JavaOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(((JavaOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextAttribute.setMappingKey(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertTrue(((JavaManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertNull(((JavaManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		// this is no longer supported (it was a bit of a testing hack anyway...)
+		// contextAttribute.setMappingKey(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY);
+		// the *real* test is whether the Id annotation still results in a 1:1 mapping...
+		contextAttribute.setMappingKey(null);  // clear any mapping annotation
+		resourceAttribute.addAnnotation(JPA.ID);  // add Id annotation
+		this.getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertTrue(contextAttribute.getMapping() instanceof JavaOneToOneMapping2_0);
+		
+		contextAttribute.setMappingKey(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		assertNotNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertTrue(contextAttribute.getMapping() instanceof JavaManyToOneMapping2_0);	
+		
+		contextAttribute.setMappingKey(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY);
+		assertNull(resourceAttribute.getAnnotation(JPA.ID));
+		assertNull(resourceAttribute.getAnnotation(JPA2_0.MAPS_ID));
+		assertTrue(contextAttribute.getMapping() instanceof JavaBasicMapping);
+	}
+	
+	public void testCandidateMappedByAttributeNames() throws Exception {
+		createTestEntityWithValidOneToOneMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		PersistentAttribute persistentAttribute = (getJavaPersistentType()).attributes().next();
+		OneToOneMapping oneToOneMapping = (OneToOneMapping) persistentAttribute.getMapping();
+
+		Iterator<String> attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		oneToOneMapping.setSpecifiedTargetEntity("foo");
+		attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertFalse(attributeNames.hasNext());
+		
+		oneToOneMapping.setSpecifiedTargetEntity(null);
+		attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		AttributeMapping stateFooMapping = oneToOneMapping.getResolvedTargetEntity().resolveAttributeMapping("state.foo");
+		assertEquals("foo", stateFooMapping.getName());
+	}
+	
+	public void testCandidateMappedByAttributeNamesElementCollection() throws Exception {
+		createTestEntityWithValidOneToOneMapping();
+		createTestTargetEntityAddressWithElementCollection();
+		createTestEmbeddableState();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		PersistentAttribute persistentAttribute = (getJavaPersistentType()).attributes().next();
+		OneToOneMapping oneToOneMapping = (OneToOneMapping) persistentAttribute.getMapping();
+
+		Iterator<String> attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		oneToOneMapping.setSpecifiedTargetEntity("foo");
+		attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertFalse(attributeNames.hasNext());
+		
+		oneToOneMapping.setSpecifiedTargetEntity(null);
+		attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		AttributeMapping stateFooMapping = oneToOneMapping.getResolvedTargetEntity().resolveAttributeMapping("state.foo");
+		assertEquals("foo", stateFooMapping.getName());
+	}
+
+	private JavaOrphanRemovable2_0 getOrphanRemovalOf(OneToOneMapping2_0 oneToOneMapping) {
+		return ((JavaOrphanRemovalHolder2_0) oneToOneMapping).getOrphanRemoval();
+	}
+
+	public void testDefaultOneToOneGetDefaultOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 oneToOneMapping = (OneToOneMapping2_0) persistentAttribute.getMapping();
+		assertEquals(false, this.getOrphanRemovalOf(oneToOneMapping).isDefaultOrphanRemoval());
+	}
+	
+	public void testSpecifiedOneToOneGetDefaultOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 oneToOneMapping = (OneToOneMapping2_0) persistentAttribute.getMapping();
+		assertEquals(false, this.getOrphanRemovalOf(oneToOneMapping).isDefaultOrphanRemoval());
+	}
+	
+	public void testGetOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 oneToOneMapping = (OneToOneMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToOneMapping);
+
+		assertEquals(false, mappingsOrphanRemoval.isOrphanRemoval());
+		
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.TRUE);
+		assertEquals(true, mappingsOrphanRemoval.isOrphanRemoval());
+	}
+	
+	public void testGetSpecifiedOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 oneToOneMapping = (OneToOneMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToOneMapping);
+
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOne2_0Annotation oneToOne = (OneToOne2_0Annotation) attributeResource.getAnnotation(JPA.ONE_TO_ONE);
+		oneToOne.setOrphanRemoval(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+		
+		assertEquals(Boolean.FALSE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+	}
+	
+	public void testGetSpecifiedOrphanRemoval2() throws Exception {
+		this.createTestEntityWithValidOneToOneMappingOrphanRemovalSpecified();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 oneToOneMapping = (OneToOneMapping2_0) persistentAttribute.getMapping();
+
+		assertEquals(Boolean.FALSE, this.getOrphanRemovalOf(oneToOneMapping).getSpecifiedOrphanRemoval());
+	}
+
+	public void testSetSpecifiedOrphanRemoval() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 oneToOneMapping = (OneToOneMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToOneMapping);
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.TRUE);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOne2_0Annotation oneToOne = (OneToOne2_0Annotation) attributeResource.getAnnotation(JPA.ONE_TO_ONE);
+		
+		assertEquals(Boolean.TRUE, oneToOne.getOrphanRemoval());
+		
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(null);
+		assertNotNull(attributeResource.getAnnotation(JPA.ONE_TO_ONE)); 	// .getElement);
+	}
+	
+	public void testSetSpecifiedOrphanRemoval2() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 oneToOneMapping = (OneToOneMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToOneMapping);
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.TRUE);
+		
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOne2_0Annotation oneToOne = (OneToOne2_0Annotation) attributeResource.getAnnotation(JPA.ONE_TO_ONE);
+		
+		assertEquals(Boolean.TRUE, oneToOne.getOrphanRemoval());
+		
+		oneToOneMapping = (OneToOneMapping2_0) persistentAttribute.getMapping();
+		mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToOneMapping);
+		assertEquals(Boolean.TRUE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(null);
+		assertNotNull(attributeResource.getAnnotation(JPA.ONE_TO_ONE));
+	}
+
+	public void testGetSpecifiedOrphanRemovalUpdatesFromResourceModelChange() throws Exception {
+		this.createTestEntity();
+		this.addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		
+		PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 oneToOneMapping = (OneToOneMapping2_0) persistentAttribute.getMapping();
+		JavaOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToOneMapping);
+
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		OneToOne2_0Annotation oneToOne = (OneToOne2_0Annotation) attributeResource.getAnnotation(JPA.ONE_TO_ONE);
+		oneToOne.setOrphanRemoval(Boolean.FALSE);
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals(Boolean.FALSE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		
+		oneToOne.setOrphanRemoval(null);
+		getJpaProject().synchronizeContextModel();
+		assertNull(mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertSame(oneToOneMapping, persistentAttribute.getMapping());
+		
+		oneToOne.setOrphanRemoval(Boolean.FALSE);
+		attributeResource.setPrimaryAnnotation(null, EmptyIterable.<String>instance());
+		getJpaProject().synchronizeContextModel();
+		
+		assertTrue(persistentAttribute.getMapping().isDefault());
+	}
+
+	public void testModifyPredominantJoiningStrategy() throws Exception {
+		createTestEntityWithValidOneToOneMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaResourcePersistentAttribute resourceAttribute = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME).persistableAttributes().next();
+		OneToOneAnnotation annotation = (OneToOneAnnotation) resourceAttribute.getAnnotation(JPA.ONE_TO_ONE);
+		PersistentAttribute contextAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 mapping = (OneToOneMapping2_0) contextAttribute.getMapping();
+		OneToOneRelationship2_0 rel = (OneToOneRelationship2_0) mapping.getRelationship();
+
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNull(annotation.getMappedBy());
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToPrimaryKeyJoinColumn();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNull(annotation.getMappedBy());
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToMappedBy();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNotNull(annotation.getMappedBy());
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinTable();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNull(annotation.getMappedBy());
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertTrue(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinColumn();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNull(annotation.getMappedBy());
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+	}
+
+	public void testUpdatePredominantJoiningStrategy() throws Exception {
+		createTestEntityWithValidOneToOneMapping();
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+
+		JavaResourcePersistentAttribute resourceAttribute = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME).persistableAttributes().next();
+		OneToOneAnnotation annotation = (OneToOneAnnotation) resourceAttribute.getAnnotation(JPA.ONE_TO_ONE);
+		PersistentAttribute contextAttribute = getJavaPersistentType().attributes().next();
+		OneToOneMapping2_0 mapping = (OneToOneMapping2_0) contextAttribute.getMapping();
+		OneToOneRelationship2_0 rel = (OneToOneRelationship2_0) mapping.getRelationship();
+
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNull(annotation.getMappedBy());
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceAttribute.addAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNull(annotation.getMappedBy());
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		annotation.setMappedBy("foo");
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNotNull(annotation.getMappedBy());
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceAttribute.addAnnotation(JPA.JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNotNull(annotation.getMappedBy());
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceAttribute.addAnnotation(JPA.JOIN_TABLE);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNotNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNotNull(annotation.getMappedBy());
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceAttribute.removeAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNotNull(annotation.getMappedBy());
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		annotation.setMappedBy(null);
+		getJpaProject().synchronizeContextModel();
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNull(annotation.getMappedBy());
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertTrue(rel.strategyIsJoinTable());
+
+		resourceAttribute.removeAnnotation(JPA.JOIN_COLUMN);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNull(annotation.getMappedBy());
+		assertNotNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());	
+		assertTrue(rel.strategyIsJoinTable());
+
+		resourceAttribute.removeAnnotation(JPA.JOIN_TABLE);
+		getJpaProject().synchronizeContextModel();
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_COLUMN));
+		assertNull(resourceAttribute.getAnnotation(JPA.PRIMARY_KEY_JOIN_COLUMN));
+		assertNull(annotation.getMappedBy());
+		assertNull(resourceAttribute.getAnnotation(JPA.JOIN_TABLE));
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/JptEclipseLink2_0JavaContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/JptEclipseLink2_0JavaContextModelTests.java
new file mode 100644
index 0000000..e2b65fa
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/java/JptEclipseLink2_0JavaContextModelTests.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.java;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class JptEclipseLink2_0JavaContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLink2_0JavaContextModelTests.class.getName());
+		suite.addTestSuite(EclipseLink2_0JavaCollectionTableTests.class);
+		suite.addTestSuite(EclipseLink2_0JavaElementCollectionMappingTests.class);
+		suite.addTestSuite(EclipseLink2_0JavaEntityTests.class);
+		suite.addTestSuite(EclipseLink2_0JavaManyToManyMappingTests.class);
+		suite.addTestSuite(EclipseLink2_0JavaManyToOneMappingTests.class);
+		suite.addTestSuite(EclipseLink2_0JavaMappedSuperclassTests.class);
+		suite.addTestSuite(EclipseLink2_0JavaOneToManyMappingTests.class);
+		suite.addTestSuite(EclipseLink2_0JavaOneToOneMappingTests.class);
+		return suite;
+	}
+
+	private JptEclipseLink2_0JavaContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmCollectionTableTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmCollectionTableTests.java
new file mode 100644
index 0000000..89fb8aa
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmCollectionTableTests.java
@@ -0,0 +1,752 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.UniqueConstraint;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.context.java.JavaJoinColumn;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmJoinColumn;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmUniqueConstraint;
+import org.eclipse.jpt.jpa.core.jpa2.MappingKeys2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.CollectionTable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaCollectionTable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmCollectionTable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlCollectionTable;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlUniqueConstraint;
+import org.eclipse.jpt.jpa.core.resource.orm.v2_0.XmlElementCollection_2_0;
+import org.eclipse.jpt.jpa.core.resource.persistence.PersistenceFactory;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlMappingFileRef;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0OrmCollectionTableTests extends EclipseLink2_0OrmContextModelTestCase
+{
+	public EclipseLink2_0OrmCollectionTableTests(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		XmlMappingFileRef mappingFileRef = PersistenceFactory.eINSTANCE.createXmlMappingFileRef();
+		mappingFileRef.setFileName(JptJpaCorePlugin.DEFAULT_ORM_XML_RUNTIME_PATH.toString());
+		getXmlPersistenceUnit().getMappingFiles().add(mappingFileRef);
+		getPersistenceXmlResource().save(null);
+	}
+
+	private ICompilationUnit createTestEntityWithValidElementCollection() throws Exception {		
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID, "java.util.Collection");
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ElementCollection").append(CR);
+				sb.append("    private Collection<String> projects;").append(CR);
+				sb.append("@Id").append(CR);
+			}
+		});
+	}
+
+	public void testUpdateSpecifiedName() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 elementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = elementCollectionMapping.getCollectionTable();
+		
+		assertNull(ormCollectionTable.getSpecifiedName());
+		assertNull(resourceElementCollection.getCollectionTable());
+		
+		
+		//set name in the resource model, verify context model updated
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		resourceElementCollection.getCollectionTable().setName("FOO");
+		assertEquals("FOO", ormCollectionTable.getSpecifiedName());
+		assertEquals("FOO", resourceElementCollection.getCollectionTable().getName());
+	
+		//set name to null in the resource model
+		resourceElementCollection.getCollectionTable().setName(null);
+		assertNull(ormCollectionTable.getSpecifiedName());
+		assertNull(resourceElementCollection.getCollectionTable().getName());
+		
+		resourceElementCollection.getCollectionTable().setName("FOO");
+		assertEquals("FOO", ormCollectionTable.getSpecifiedName());
+		assertEquals("FOO", resourceElementCollection.getCollectionTable().getName());
+
+		resourceElementCollection.setCollectionTable(null);
+		assertNull(ormCollectionTable.getSpecifiedName());
+		assertNull(resourceElementCollection.getCollectionTable());
+	}
+	
+	public void testModifySpecifiedName() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 elementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = elementCollectionMapping.getCollectionTable();
+		
+		assertNull(ormCollectionTable.getSpecifiedName());
+		assertNull(resourceElementCollection.getCollectionTable());
+		
+		//set name in the context model, verify resource model modified
+		ormCollectionTable.setSpecifiedName("foo");
+		assertEquals("foo", ormCollectionTable.getSpecifiedName());
+		assertEquals("foo", resourceElementCollection.getCollectionTable().getName());
+		
+		//set name to null in the context model
+		ormCollectionTable.setSpecifiedName(null);
+		assertNull(ormCollectionTable.getSpecifiedName());
+		assertNull(resourceElementCollection.getCollectionTable());
+	}
+	
+	public void testVirtualCollectionTable() throws Exception {
+		createTestEntityWithValidElementCollection();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("projects");
+		ElementCollectionMapping2_0 virtualElementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		CollectionTable2_0 virtualCollectionTable = virtualElementCollectionMapping.getCollectionTable();
+		
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertEquals(TYPE_NAME + "_projects", virtualCollectionTable.getName());
+		assertNull(virtualCollectionTable.getSpecifiedCatalog());
+		assertNull(virtualCollectionTable.getSpecifiedSchema());
+		assertEquals(0, virtualCollectionTable.specifiedJoinColumnsSize());
+		JoinColumn virtualJoinColumn = virtualCollectionTable.getDefaultJoinColumn();
+		assertEquals(TYPE_NAME + "_id", virtualJoinColumn.getDefaultName());
+		assertEquals("id", virtualJoinColumn.getDefaultReferencedColumnName());
+	
+		JavaPersistentAttribute javaPersistentAttribute = ormPersistentAttribute.getJavaPersistentAttribute();
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) javaPersistentAttribute.getMapping();
+		JavaCollectionTable2_0 javaCollectionTable = javaElementCollectionMapping.getCollectionTable();
+		javaCollectionTable.setSpecifiedName("FOO");
+		javaCollectionTable.setSpecifiedCatalog("CATALOG");
+		javaCollectionTable.setSpecifiedSchema("SCHEMA");
+		JavaJoinColumn javaJoinColumn = javaCollectionTable.addSpecifiedJoinColumn(0);
+		javaJoinColumn.setSpecifiedName("NAME");
+		javaJoinColumn.setSpecifiedReferencedColumnName("REFERENCED_NAME");
+		
+		assertEquals("FOO", virtualCollectionTable.getSpecifiedName());
+		assertEquals("CATALOG", virtualCollectionTable.getSpecifiedCatalog());
+		assertEquals("SCHEMA", virtualCollectionTable.getSpecifiedSchema());
+		assertEquals(1, virtualCollectionTable.specifiedJoinColumnsSize());
+		virtualJoinColumn = virtualCollectionTable.specifiedJoinColumns().next();
+		assertEquals("NAME", virtualJoinColumn.getSpecifiedName());
+		assertEquals("REFERENCED_NAME", virtualJoinColumn.getSpecifiedReferencedColumnName());
+	}
+	
+	public void testUpdateDefaultNameFromJavaTable() throws Exception {
+		createTestEntityWithValidElementCollection();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "projects");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		assertEquals(TYPE_NAME + "_projects", ormCollectionTable.getDefaultName());
+
+		((JavaEntity) ormPersistentType.getJavaPersistentType().getMapping()).setSpecifiedName("Foo");
+		assertEquals("Foo_projects", ormCollectionTable.getDefaultName());
+		
+		((OrmEntity) ormPersistentType.getMapping()).setSpecifiedName("Bar");
+		assertEquals("Bar_projects", ormCollectionTable.getDefaultName());
+		
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("projects").getMapping();
+		javaElementCollectionMapping.getCollectionTable().setSpecifiedName("JAVA_COLLECTION_TABLE");
+		
+		assertEquals("Bar_projects", ormCollectionTable.getDefaultName());
+
+		
+		//set metadata-complete to true, will ignore java annotation settings
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		assertEquals("Bar_projects", ormCollectionTable.getDefaultName());
+		
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(false);
+		//remove element collection mapping from the orm.xml file
+		ormPersistentAttribute.convertToVirtual();
+		//ormPersistentType.getMapping().setSpecifiedMetadataComplete(null);
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("projects");
+		ElementCollectionMapping2_0 virtualElementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute2.getMapping();
+		CollectionTable2_0  virtualCollectionTable = virtualElementCollectionMapping.getCollectionTable();
+		assertTrue(ormPersistentAttribute2.isVirtual());
+		assertEquals("JAVA_COLLECTION_TABLE", virtualCollectionTable.getSpecifiedName());//specifiedName since this is a virtual mapping now
+		
+		javaElementCollectionMapping.getCollectionTable().setSpecifiedName(null);
+		assertNull(virtualCollectionTable.getSpecifiedName());
+		assertEquals("Bar_projects", virtualCollectionTable.getDefaultName());
+	}
+
+	public void testUpdateSpecifiedSchema() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		
+		assertNull(ormCollectionTable.getSpecifiedSchema());
+		assertNull(resourceElementCollection.getCollectionTable());
+		
+		//set schema in the resource model, verify context model updated
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		resourceElementCollection.getCollectionTable().setSchema("FOO");
+		assertEquals("FOO", ormCollectionTable.getSpecifiedSchema());
+		assertEquals("FOO", resourceElementCollection.getCollectionTable().getSchema());
+	
+		//set Schema to null in the resource model
+		resourceElementCollection.getCollectionTable().setSchema(null);
+		assertNull(ormCollectionTable.getSpecifiedSchema());
+		assertNull(resourceElementCollection.getCollectionTable().getSchema());
+		
+		resourceElementCollection.getCollectionTable().setSchema("FOO");
+		assertEquals("FOO", ormCollectionTable.getSpecifiedSchema());
+		assertEquals("FOO", resourceElementCollection.getCollectionTable().getSchema());
+
+		resourceElementCollection.setCollectionTable(null);
+		assertNull(ormCollectionTable.getSpecifiedSchema());
+		assertNull(resourceElementCollection.getCollectionTable());
+	}
+
+	public void testModifySpecifiedSchema() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		
+		assertNull(ormCollectionTable.getSpecifiedSchema());
+		assertNull(resourceElementCollection.getCollectionTable());
+		
+		//set Schema in the context model, verify resource model modified
+		ormCollectionTable.setSpecifiedSchema("foo");
+		assertEquals("foo", ormCollectionTable.getSpecifiedSchema());
+		assertEquals("foo", resourceElementCollection.getCollectionTable().getSchema());
+		
+		//set Schema to null in the context model
+		ormCollectionTable.setSpecifiedSchema(null);
+		assertNull(ormCollectionTable.getSpecifiedSchema());
+		assertNull(resourceElementCollection.getCollectionTable());
+	}
+	
+	public void testUpdateSpecifiedCatalog() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		
+		assertNull(ormCollectionTable.getSpecifiedCatalog());
+		assertNull(resourceElementCollection.getCollectionTable());
+		
+		//set Catalog in the resource model, verify context model updated
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		resourceElementCollection.getCollectionTable().setCatalog("FOO");
+		assertEquals("FOO", ormCollectionTable.getSpecifiedCatalog());
+		assertEquals("FOO", resourceElementCollection.getCollectionTable().getCatalog());
+	
+		//set Catalog to null in the resource model
+		resourceElementCollection.getCollectionTable().setCatalog(null);
+		assertNull(ormCollectionTable.getSpecifiedCatalog());
+		assertNull(resourceElementCollection.getCollectionTable().getCatalog());
+		
+		resourceElementCollection.getCollectionTable().setCatalog("FOO");
+		assertEquals("FOO", ormCollectionTable.getSpecifiedCatalog());
+		assertEquals("FOO", resourceElementCollection.getCollectionTable().getCatalog());
+
+		resourceElementCollection.setCollectionTable(null);
+		assertNull(ormCollectionTable.getSpecifiedCatalog());
+		assertNull(resourceElementCollection.getCollectionTable());
+	}
+	
+	public void testModifySpecifiedCatalog() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		
+		assertNull(ormCollectionTable.getSpecifiedCatalog());
+		assertNull(resourceElementCollection.getCollectionTable());
+		
+		//set Catalog in the context model, verify resource model modified
+		ormCollectionTable.setSpecifiedCatalog("foo");
+		assertEquals("foo", ormCollectionTable.getSpecifiedCatalog());
+		assertEquals("foo", resourceElementCollection.getCollectionTable().getCatalog());
+		
+		//set Catalog to null in the context model
+		ormCollectionTable.setSpecifiedCatalog(null);
+		assertNull(ormCollectionTable.getSpecifiedCatalog());
+		assertNull(resourceElementCollection.getCollectionTable());
+	}
+
+	public void testAddSpecifiedJoinColumn() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		
+		OrmJoinColumn joinColumn = ormCollectionTable.addSpecifiedJoinColumn(0);
+		joinColumn.setSpecifiedName("FOO");
+				
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+		assertEquals("FOO", resourceCollectionTable.getJoinColumns().get(0).getName());
+		
+		OrmJoinColumn joinColumn2 = ormCollectionTable.addSpecifiedJoinColumn(0);
+		joinColumn2.setSpecifiedName("BAR");
+		
+		assertEquals("BAR", resourceCollectionTable.getJoinColumns().get(0).getName());
+		assertEquals("FOO", resourceCollectionTable.getJoinColumns().get(1).getName());
+		
+		OrmJoinColumn joinColumn3 = ormCollectionTable.addSpecifiedJoinColumn(1);
+		joinColumn3.setSpecifiedName("BAZ");
+		
+		assertEquals("BAR", resourceCollectionTable.getJoinColumns().get(0).getName());
+		assertEquals("BAZ", resourceCollectionTable.getJoinColumns().get(1).getName());
+		assertEquals("FOO", resourceCollectionTable.getJoinColumns().get(2).getName());
+		
+		ListIterator<OrmJoinColumn> joinColumns = ormCollectionTable.specifiedJoinColumns();
+		assertEquals(joinColumn2, joinColumns.next());
+		assertEquals(joinColumn3, joinColumns.next());
+		assertEquals(joinColumn, joinColumns.next());
+		
+		joinColumns = ormCollectionTable.specifiedJoinColumns();
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+	}
+	
+	public void testRemoveSpecifiedJoinColumn() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		
+		ormCollectionTable.addSpecifiedJoinColumn(0).setSpecifiedName("FOO");
+		ormCollectionTable.addSpecifiedJoinColumn(1).setSpecifiedName("BAR");
+		ormCollectionTable.addSpecifiedJoinColumn(2).setSpecifiedName("BAZ");
+		
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+		assertEquals(3, resourceCollectionTable.getJoinColumns().size());
+		
+		ormCollectionTable.removeSpecifiedJoinColumn(0);
+		assertEquals(2, resourceCollectionTable.getJoinColumns().size());
+		assertEquals("BAR", resourceCollectionTable.getJoinColumns().get(0).getName());
+		assertEquals("BAZ", resourceCollectionTable.getJoinColumns().get(1).getName());
+
+		ormCollectionTable.removeSpecifiedJoinColumn(0);
+		assertEquals(1, resourceCollectionTable.getJoinColumns().size());
+		assertEquals("BAZ", resourceCollectionTable.getJoinColumns().get(0).getName());
+		
+		ormCollectionTable.removeSpecifiedJoinColumn(0);
+		assertEquals(0, resourceCollectionTable.getJoinColumns().size());
+	}
+	
+	public void testMoveSpecifiedJoinColumn() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		
+		ormCollectionTable.addSpecifiedJoinColumn(0).setSpecifiedName("FOO");
+		ormCollectionTable.addSpecifiedJoinColumn(1).setSpecifiedName("BAR");
+		ormCollectionTable.addSpecifiedJoinColumn(2).setSpecifiedName("BAZ");
+		
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+		assertEquals(3, resourceCollectionTable.getJoinColumns().size());
+		
+		
+		ormCollectionTable.moveSpecifiedJoinColumn(2, 0);
+		ListIterator<OrmJoinColumn> joinColumns = ormCollectionTable.specifiedJoinColumns();
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+
+		assertEquals("BAR", resourceCollectionTable.getJoinColumns().get(0).getName());
+		assertEquals("BAZ", resourceCollectionTable.getJoinColumns().get(1).getName());
+		assertEquals("FOO", resourceCollectionTable.getJoinColumns().get(2).getName());
+
+
+		ormCollectionTable.moveSpecifiedJoinColumn(0, 1);
+		joinColumns = ormCollectionTable.specifiedJoinColumns();
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+
+		assertEquals("BAZ", resourceCollectionTable.getJoinColumns().get(0).getName());
+		assertEquals("BAR", resourceCollectionTable.getJoinColumns().get(1).getName());
+		assertEquals("FOO", resourceCollectionTable.getJoinColumns().get(2).getName());
+	}
+	
+	
+	public void testUpdateJoinColumns() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+	
+		resourceCollectionTable.getJoinColumns().add(OrmFactory.eINSTANCE.createXmlJoinColumn());
+		resourceCollectionTable.getJoinColumns().add(OrmFactory.eINSTANCE.createXmlJoinColumn());
+		resourceCollectionTable.getJoinColumns().add(OrmFactory.eINSTANCE.createXmlJoinColumn());
+		
+		resourceCollectionTable.getJoinColumns().get(0).setName("FOO");
+		resourceCollectionTable.getJoinColumns().get(1).setName("BAR");
+		resourceCollectionTable.getJoinColumns().get(2).setName("BAZ");
+
+		ListIterator<OrmJoinColumn> joinColumns = ormCollectionTable.specifiedJoinColumns();
+		assertEquals("FOO", joinColumns.next().getName());
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+		
+		resourceCollectionTable.getJoinColumns().move(2, 0);
+		joinColumns = ormCollectionTable.specifiedJoinColumns();
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+
+		resourceCollectionTable.getJoinColumns().move(0, 1);
+		joinColumns = ormCollectionTable.specifiedJoinColumns();
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("BAR", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+
+		resourceCollectionTable.getJoinColumns().remove(1);
+		joinColumns = ormCollectionTable.specifiedJoinColumns();
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertEquals("FOO", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+
+		resourceCollectionTable.getJoinColumns().remove(1);
+		joinColumns = ormCollectionTable.specifiedJoinColumns();
+		assertEquals("BAZ", joinColumns.next().getName());
+		assertFalse(joinColumns.hasNext());
+		
+		resourceCollectionTable.getJoinColumns().remove(0);
+		assertFalse(ormCollectionTable.specifiedJoinColumns().hasNext());
+	}
+
+	public void testUniqueConstraints() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+		
+		ListIterator<OrmUniqueConstraint> uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertFalse(uniqueConstraints.hasNext());
+		
+		XmlUniqueConstraint uniqueConstraintResource = OrmFactory.eINSTANCE.createXmlUniqueConstraint();
+		resourceCollectionTable.getUniqueConstraints().add(0, uniqueConstraintResource);
+		uniqueConstraintResource.getColumnNames().add(0, "foo");
+		
+		uniqueConstraintResource = OrmFactory.eINSTANCE.createXmlUniqueConstraint();
+		resourceCollectionTable.getUniqueConstraints().add(0, uniqueConstraintResource);
+		uniqueConstraintResource.getColumnNames().add(0, "bar");
+		
+		uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertTrue(uniqueConstraints.hasNext());
+		assertEquals("bar", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("foo", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	}
+	
+	public void testUniqueConstraintsSize() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+		
+		assertEquals(0,  ormCollectionTable.uniqueConstraintsSize());
+		
+		XmlUniqueConstraint uniqueConstraintResource = OrmFactory.eINSTANCE.createXmlUniqueConstraint();
+		resourceCollectionTable.getUniqueConstraints().add(0, uniqueConstraintResource);
+		uniqueConstraintResource.getColumnNames().add(0, "foo");
+		
+		uniqueConstraintResource = OrmFactory.eINSTANCE.createXmlUniqueConstraint();
+		resourceCollectionTable.getUniqueConstraints().add(1, uniqueConstraintResource);
+		uniqueConstraintResource.getColumnNames().add(0, "bar");
+		
+		assertEquals(2,  ormCollectionTable.uniqueConstraintsSize());
+	}
+
+	public void testAddUniqueConstraint() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+		
+		ormCollectionTable.addUniqueConstraint(0).addColumnName(0, "FOO");
+		ormCollectionTable.addUniqueConstraint(0).addColumnName(0, "BAR");
+		ormCollectionTable.addUniqueConstraint(0).addColumnName(0, "BAZ");
+
+		ListIterator<XmlUniqueConstraint> uniqueConstraints = resourceCollectionTable.getUniqueConstraints().listIterator();
+		
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().get(0));
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().get(0));
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().get(0));
+		assertFalse(uniqueConstraints.hasNext());
+	}
+	
+	public void testAddUniqueConstraint2() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+
+		ormCollectionTable.addUniqueConstraint(0).addColumnName(0, "FOO");
+		ormCollectionTable.addUniqueConstraint(1).addColumnName(0, "BAR");
+		ormCollectionTable.addUniqueConstraint(0).addColumnName(0, "BAZ");
+		
+		ListIterator<XmlUniqueConstraint> uniqueConstraints = resourceCollectionTable.getUniqueConstraints().listIterator();
+		
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().get(0));
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().get(0));
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().get(0));
+		assertFalse(uniqueConstraints.hasNext());
+	}
+	
+	public void testRemoveUniqueConstraint() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+		
+		ormCollectionTable.addUniqueConstraint(0).addColumnName(0, "FOO");
+		ormCollectionTable.addUniqueConstraint(1).addColumnName(0, "BAR");
+		ormCollectionTable.addUniqueConstraint(2).addColumnName(0, "BAZ");
+		
+		assertEquals(3, resourceCollectionTable.getUniqueConstraints().size());
+
+		ormCollectionTable.removeUniqueConstraint(1);
+		
+		ListIterator<XmlUniqueConstraint> uniqueConstraintResources = resourceCollectionTable.getUniqueConstraints().listIterator();
+		assertEquals("FOO", uniqueConstraintResources.next().getColumnNames().get(0));		
+		assertEquals("BAZ", uniqueConstraintResources.next().getColumnNames().get(0));
+		assertFalse(uniqueConstraintResources.hasNext());
+		
+		Iterator<OrmUniqueConstraint> uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());		
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	
+		
+		ormCollectionTable.removeUniqueConstraint(1);
+		uniqueConstraintResources = resourceCollectionTable.getUniqueConstraints().listIterator();
+		assertEquals("FOO", uniqueConstraintResources.next().getColumnNames().get(0));		
+		assertFalse(uniqueConstraintResources.hasNext());
+
+		uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());		
+		assertFalse(uniqueConstraints.hasNext());
+
+		
+		ormCollectionTable.removeUniqueConstraint(0);
+		uniqueConstraintResources = resourceCollectionTable.getUniqueConstraints().listIterator();
+		assertFalse(uniqueConstraintResources.hasNext());
+		uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertFalse(uniqueConstraints.hasNext());
+	}
+	
+	public void testMoveUniqueConstraint() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+		
+		ormCollectionTable.addUniqueConstraint(0).addColumnName(0, "FOO");
+		ormCollectionTable.addUniqueConstraint(1).addColumnName(0, "BAR");
+		ormCollectionTable.addUniqueConstraint(2).addColumnName(0, "BAZ");
+		
+		assertEquals(3, resourceCollectionTable.getUniqueConstraints().size());
+		
+		
+		ormCollectionTable.moveUniqueConstraint(2, 0);
+		ListIterator<OrmUniqueConstraint> uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+
+		ListIterator<XmlUniqueConstraint> uniqueConstraintResources = resourceCollectionTable.getUniqueConstraints().listIterator();
+		assertEquals("BAR", uniqueConstraintResources.next().getColumnNames().get(0));
+		assertEquals("BAZ", uniqueConstraintResources.next().getColumnNames().get(0));
+		assertEquals("FOO", uniqueConstraintResources.next().getColumnNames().get(0));
+
+
+		ormCollectionTable.moveUniqueConstraint(0, 1);
+		uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+
+		uniqueConstraintResources = resourceCollectionTable.getUniqueConstraints().listIterator();
+		assertEquals("BAZ", uniqueConstraintResources.next().getColumnNames().get(0));
+		assertEquals("BAR", uniqueConstraintResources.next().getColumnNames().get(0));
+		assertEquals("FOO", uniqueConstraintResources.next().getColumnNames().get(0));
+	}
+	
+	public void testUpdateUniqueConstraints() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 resourceElementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		OrmCollectionTable2_0 ormCollectionTable = ormElementCollectionMapping.getCollectionTable();
+		resourceElementCollection.setCollectionTable(OrmFactory.eINSTANCE.createXmlCollectionTable());
+		XmlCollectionTable resourceCollectionTable = resourceElementCollection.getCollectionTable();
+	
+		XmlUniqueConstraint uniqueConstraintResource = OrmFactory.eINSTANCE.createXmlUniqueConstraint();
+		resourceCollectionTable.getUniqueConstraints().add(0, uniqueConstraintResource);
+		uniqueConstraintResource.getColumnNames().add(0, "FOO");
+
+		uniqueConstraintResource = OrmFactory.eINSTANCE.createXmlUniqueConstraint();
+		resourceCollectionTable.getUniqueConstraints().add(1, uniqueConstraintResource);
+		uniqueConstraintResource.getColumnNames().add(0, "BAR");
+
+		uniqueConstraintResource = OrmFactory.eINSTANCE.createXmlUniqueConstraint();
+		resourceCollectionTable.getUniqueConstraints().add(2, uniqueConstraintResource);
+		uniqueConstraintResource.getColumnNames().add(0, "BAZ");
+
+		
+		ListIterator<OrmUniqueConstraint> uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+		
+		resourceCollectionTable.getUniqueConstraints().move(2, 0);
+		uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	
+		resourceCollectionTable.getUniqueConstraints().move(0, 1);
+		uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	
+		resourceCollectionTable.getUniqueConstraints().remove(1);
+		uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+	
+		resourceCollectionTable.getUniqueConstraints().remove(1);
+		uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+		
+		resourceCollectionTable.getUniqueConstraints().remove(0);
+		uniqueConstraints = ormCollectionTable.uniqueConstraints();
+		assertFalse(uniqueConstraints.hasNext());
+	}
+
+	public void testUniqueConstraintsFromJava() throws Exception {
+		createTestEntityWithValidElementCollection();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		ElementCollectionMapping2_0 virtualElementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentType.attributes().next().getMapping();
+		CollectionTable2_0 virtualCollectionTable = virtualElementCollectionMapping.getCollectionTable();
+		
+		assertTrue(ormPersistentType.attributes().next().isVirtual());
+		
+		ListIterator<UniqueConstraint> uniqueConstraints = (ListIterator<UniqueConstraint>) virtualCollectionTable.uniqueConstraints();
+		assertFalse(uniqueConstraints.hasNext());
+
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping2_0 = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().attributes().next().getMapping();
+		JavaCollectionTable2_0 javaCollectionTable = javaElementCollectionMapping2_0.getCollectionTable();
+		
+		javaCollectionTable.addUniqueConstraint(0).addColumnName(0, "FOO");
+		javaCollectionTable.addUniqueConstraint(1).addColumnName(0, "BAR");
+		javaCollectionTable.addUniqueConstraint(2).addColumnName(0, "BAZ");
+
+		uniqueConstraints = (ListIterator<UniqueConstraint>) virtualCollectionTable.uniqueConstraints();
+		assertTrue(uniqueConstraints.hasNext());
+		assertEquals("FOO", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAR", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertEquals("BAZ", uniqueConstraints.next().getColumnNames().iterator().next());
+		assertFalse(uniqueConstraints.hasNext());
+		
+		ormPersistentType.attributes().next().convertToSpecified();
+		
+		virtualElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentType.attributes().next().getMapping();
+		assertEquals(0,  virtualElementCollectionMapping.getCollectionTable().uniqueConstraintsSize());
+	}
+
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmContextModelTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmContextModelTestCase.java
new file mode 100644
index 0000000..c5828b9
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmContextModelTestCase.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import org.eclipse.jpt.common.core.internal.operations.JptFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetInstallDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.JpaFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.internal.operations.OrmFileCreationDataModelProperties;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+import org.eclipse.jpt.jpa.core.tests.internal.projects.TestJpaProject;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkEntityMappings;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationDataModelProvider;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.operations.EclipseLinkOrmFileCreationOperation;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntityMappings;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v2_0.EclipseLink2_0;
+import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.EclipseLink2_0ContextModelTestCase;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("nls")
+public abstract class EclipseLink2_0OrmContextModelTestCase
+	extends EclipseLink2_0ContextModelTestCase
+{
+	protected JpaXmlResource eclipseLink2_0OrmXmlResource;
+	
+	
+	protected EclipseLink2_0OrmContextModelTestCase(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.eclipseLink2_0OrmXmlResource = getJpaProject().getDefaultEclipseLinkOrmXmlResource();
+	}
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		// don't create default orm.xml - instead build eclipselink-orm.xml
+		dataModel.setProperty(JpaFacetInstallDataModelProperties.CREATE_ORM_XML, Boolean.FALSE);
+		return dataModel;
+	}
+	
+	@Override
+	protected TestJpaProject buildJpaProject(String projectName, boolean autoBuild, IDataModel jpaConfig) throws Exception {
+		TestJpaProject testJpaProject = super.buildJpaProject(projectName, autoBuild, jpaConfig);
+		
+		EclipseLinkOrmFileCreationOperation operation = 
+			new EclipseLinkOrmFileCreationOperation(buildEclipseLinkOrmConfig(testJpaProject));
+		operation.execute(null, null);
+		
+		return testJpaProject;
+	}
+	
+	protected IDataModel buildEclipseLinkOrmConfig(TestJpaProject testJpaProject) {
+		IDataModel dataModel = 
+			DataModelFactory.createDataModel(new EclipseLinkOrmFileCreationDataModelProvider());		
+		dataModel.setProperty(JptFileCreationDataModelProperties.CONTAINER_PATH, 
+				testJpaProject.getProject().getFolder("src/META-INF").getFullPath());
+		dataModel.setProperty(JpaFileCreationDataModelProperties.VERSION, EclipseLink2_0.SCHEMA_VERSION);
+		dataModel.setProperty(OrmFileCreationDataModelProperties.ADD_TO_PERSISTENCE_UNIT, Boolean.TRUE);
+		return dataModel;
+	}
+	
+	@Override
+	protected void tearDown() throws Exception {
+		this.eclipseLink2_0OrmXmlResource = null;
+		super.tearDown();
+	}
+	
+	@Override
+	protected JpaXmlResource getOrmXmlResource() {
+		return this.eclipseLink2_0OrmXmlResource;
+	}
+	
+	@Override
+	protected XmlEntityMappings getXmlEntityMappings() {
+		return (XmlEntityMappings) super.getXmlEntityMappings();
+	}
+	
+	@Override
+	protected EclipseLinkEntityMappings getEntityMappings() {
+		return (EclipseLinkEntityMappings) super.getEntityMappings();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmElementCollectionMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmElementCollectionMappingTests.java
new file mode 100644
index 0000000..2a541bc
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmElementCollectionMappingTests.java
@@ -0,0 +1,1446 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AttributeOverride;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.Column;
+import org.eclipse.jpt.jpa.core.context.EmbeddedIdMapping;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.IdMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ManyToOneMapping;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyColumn;
+import org.eclipse.jpt.jpa.core.context.TransientMapping;
+import org.eclipse.jpt.jpa.core.context.VersionMapping;
+import org.eclipse.jpt.jpa.core.context.java.JavaBasicMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.orm.OrmAttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.orm.OrmColumn;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.jpa2.MappingKeys2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrderColumn2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.Orderable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmElementCollectionMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlElementCollection;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlOneToMany;
+import org.eclipse.jpt.jpa.core.resource.orm.v2_0.XmlElementCollection_2_0;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0OrmElementCollectionMappingTests extends EclipseLink2_0OrmContextModelTestCase
+{
+	private static final String ATTRIBUTE_OVERRIDE_NAME = "city";
+	private static final String ATTRIBUTE_OVERRIDE_COLUMN_NAME = "E_CITY";
+
+	public EclipseLink2_0OrmElementCollectionMappingTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestEntityWithElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.FETCH_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection(targetClass=String.class, fetch=FetchType.EAGER)");
+				sb.append(CR);
+				sb.append("    private java.util.Collection<Address> address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}	
+	
+	private void createTestTargetEmbeddableAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+				sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+	
+	private ICompilationUnit createTestEntityWithEmbeddableElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.FETCH_TYPE, JPA.ATTRIBUTE_OVERRIDE, JPA.COLUMN);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection");
+				sb.append(CR);
+				sb.append("    @AttributeOverride(name=\"" + ATTRIBUTE_OVERRIDE_NAME + "\", column=@Column(name=\"" + ATTRIBUTE_OVERRIDE_COLUMN_NAME + "\"))");
+				sb.append("    private java.util.Collection<Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}	
+	
+	private ICompilationUnit createTestEntityWithNonGenericElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Collection addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithGenericBasicElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Collection<String> addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}	
+	
+	private ICompilationUnit createTestEntityWithValidMapElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Map<String, Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private void createTestEmbeddableState() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("State").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    private String abbr;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter);
+	}	
+	
+	private ICompilationUnit createTestEntityWithValidNonGenericMapElementCollectionMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA2_0.ELEMENT_COLLECTION, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);				
+				sb.append("    private java.util.Map addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+
+	private void createSelfReferentialElementCollection() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ELEMENT_COLLECTION);
+					sb.append(";");
+					sb.append(CR).append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("Foo").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);
+				sb.append("    private java.util.List<Foo> elementCollection;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Foo.java", sourceWriter);
+	}
+
+	public void testUpdateName() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOneMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection elementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+		
+		assertEquals("oneToOneMapping", ormElementCollectionMapping.getName());
+		assertEquals("oneToOneMapping", elementCollection.getName());
+				
+		//set name in the resource model, verify context model updated
+		elementCollection.setName("newName");
+		assertEquals("newName", ormElementCollectionMapping.getName());
+		assertEquals("newName", elementCollection.getName());
+	
+		//set name to null in the resource model
+		elementCollection.setName(null);
+		assertNull(ormElementCollectionMapping.getName());
+		assertNull(elementCollection.getName());
+	}
+	
+	public void testModifyName() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOneMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection elementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+		
+		assertEquals("oneToOneMapping", ormElementCollectionMapping.getName());
+		assertEquals("oneToOneMapping", elementCollection.getName());
+				
+		//set name in the context model, verify resource model updated
+		ormElementCollectionMapping.setName("newName");
+		assertEquals("newName", ormElementCollectionMapping.getName());
+		assertEquals("newName", elementCollection.getName());
+	
+		//set name to null in the context model
+		ormElementCollectionMapping.setName(null);
+		assertNull(ormElementCollectionMapping.getName());
+		assertNull(elementCollection.getName());
+	}
+
+	public void testMappingNoUnderylingJavaAttribute() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "foo");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());
+		
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		
+		assertEquals("foo", ormElementCollectionMapping.getName());
+
+		assertNull(ormElementCollectionMapping.getSpecifiedFetch());
+		assertEquals(FetchType.LAZY, ormElementCollectionMapping.getFetch());
+	}
+	
+	
+	public void testVirtualMappingMetadataCompleteFalse() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		
+		ElementCollectionMapping2_0 virtualElementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();	
+		assertEquals("address", virtualElementCollectionMapping.getName());
+		assertEquals(FetchType.EAGER, virtualElementCollectionMapping.getSpecifiedFetch());
+		assertEquals("String", virtualElementCollectionMapping.getSpecifiedTargetClass());
+		
+		ormPersistentAttribute.convertToSpecified();
+		ormPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();	
+		assertEquals("address", ormElementCollectionMapping.getName());
+		assertEquals(null, ormElementCollectionMapping.getSpecifiedFetch());
+		assertEquals(FetchType.LAZY, ormElementCollectionMapping.getDefaultFetch());
+		assertEquals(null, ormElementCollectionMapping.getSpecifiedTargetClass());
+		assertEquals(PACKAGE_NAME + ".Address", ormElementCollectionMapping.getDefaultTargetClass());
+	}
+	
+	public void testVirtualMappingMetadataCompleteTrue() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+		
+		assertEquals(MappingKeys.NULL_ATTRIBUTE_MAPPING_KEY, ormPersistentAttribute.getMappingKey());
+		
+		ormPersistentAttribute.convertToSpecified(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY);
+		ormPersistentAttribute= ormPersistentType.specifiedAttributes().next();
+
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();	
+		assertEquals("address", ormElementCollectionMapping.getName());
+		assertEquals(FetchType.LAZY, ormElementCollectionMapping.getFetch());
+	}
+	
+	public void testSpecifiedMapping() throws Exception {
+		createTestEntityWithElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "address");
+		assertEquals(2, ormPersistentType.virtualAttributesSize());
+		
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		
+		assertEquals("address", ormElementCollectionMapping.getName());
+		assertNull(ormElementCollectionMapping.getSpecifiedFetch());
+		assertEquals(FetchType.LAZY, ormElementCollectionMapping.getFetch());
+	}
+	
+	
+	public void testMorphToIdMapping() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertFalse(elementCollectionMapping.isDefault());	
+		
+		ormPersistentAttribute.setMappingKey(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY);
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		assertEquals(ormPersistentAttribute, ormPersistentType.specifiedAttributes().next());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof IdMapping);
+		assertEquals("oneToOne", ormPersistentAttribute.getMapping().getName());
+	}
+	
+	public void testMorphToVersionMapping() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertFalse(elementCollectionMapping.isDefault());	
+		
+		ormPersistentAttribute.setMappingKey(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY);
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		assertEquals(ormPersistentAttribute, ormPersistentType.specifiedAttributes().next());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof VersionMapping);
+		assertEquals("oneToOne", ormPersistentAttribute.getMapping().getName());
+	}
+	
+	public void testMorphToTransientMapping() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertFalse(elementCollectionMapping.isDefault());	
+		
+		ormPersistentAttribute.setMappingKey(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY);
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		assertEquals(ormPersistentAttribute, ormPersistentType.specifiedAttributes().next());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof TransientMapping);
+		assertEquals("oneToOne", ormPersistentAttribute.getMapping().getName());
+	}
+	
+	public void testMorphToEmbeddedMapping() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertFalse(elementCollectionMapping.isDefault());	
+		
+		ormPersistentAttribute.setMappingKey(MappingKeys.EMBEDDED_ATTRIBUTE_MAPPING_KEY);
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		assertEquals(ormPersistentAttribute, ormPersistentType.specifiedAttributes().next());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof EmbeddedMapping);
+		assertEquals("oneToOne", ormPersistentAttribute.getMapping().getName());
+	}
+	
+	public void testMorphToEmbeddedIdMapping() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertFalse(elementCollectionMapping.isDefault());	
+		
+		ormPersistentAttribute.setMappingKey(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY);
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		assertEquals(ormPersistentAttribute, ormPersistentType.specifiedAttributes().next());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof EmbeddedIdMapping);
+		assertEquals("oneToOne", ormPersistentAttribute.getMapping().getName());
+	}
+	
+	public void testMorphToManyToManyMapping() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertFalse(elementCollectionMapping.isDefault());	
+		
+		ormPersistentAttribute.setMappingKey(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY);
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		assertEquals(ormPersistentAttribute, ormPersistentType.specifiedAttributes().next());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof ManyToManyMapping);
+		assertEquals("oneToOne", ormPersistentAttribute.getMapping().getName());
+//		assertEquals(FetchType.EAGER, ((ManyToManyMapping) ormPersistentAttribute.getMapping()).getSpecifiedFetch());
+	}
+	
+	public void testMorphToOneToManyMapping() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertFalse(elementCollectionMapping.isDefault());	
+		
+		ormPersistentAttribute.setMappingKey(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY);
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		assertEquals(ormPersistentAttribute, ormPersistentType.specifiedAttributes().next());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof OneToManyMapping);
+		assertEquals("oneToOne", ormPersistentAttribute.getMapping().getName());
+//		assertEquals(FetchType.EAGER, ((OneToManyMapping) ormPersistentAttribute.getMapping()).getSpecifiedFetch());
+	}
+	
+	public void testMorphToManyToOneMapping() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertFalse(elementCollectionMapping.isDefault());	
+		
+		ormPersistentAttribute.setMappingKey(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		assertEquals(ormPersistentAttribute, ormPersistentType.specifiedAttributes().next());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof ManyToOneMapping);
+		assertEquals("oneToOne", ormPersistentAttribute.getMapping().getName());
+//		assertEquals(FetchType.EAGER, ((ManyToOneMapping) ormPersistentAttribute.getMapping()).getSpecifiedFetch());
+	}
+	
+	public void testMorphToBasicMapping() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOne");
+		
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		assertFalse(elementCollectionMapping.isDefault());
+		elementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertFalse(elementCollectionMapping.isDefault());	
+		
+		ormPersistentAttribute.setMappingKey(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY);
+		assertEquals(1, ormPersistentType.specifiedAttributesSize());
+		assertEquals(ormPersistentAttribute, ormPersistentType.specifiedAttributes().next());
+		assertTrue(ormPersistentAttribute.getMapping() instanceof BasicMapping);
+		assertEquals("oneToOne", ormPersistentAttribute.getMapping().getName());
+//TODO	assertEquals(FetchType.EAGER, ((IBasicMapping) ormPersistentAttribute.getMapping()).getSpecifiedFetch());
+	}
+	
+	public void testUpdateSpecifiedFetch() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOneMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection elementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+		
+		assertNull(ormElementCollectionMapping.getSpecifiedFetch());
+		assertNull(elementCollection.getFetch());
+				
+		//set fetch in the resource model, verify context model updated
+		elementCollection.setFetch(org.eclipse.jpt.jpa.core.resource.orm.FetchType.EAGER);
+		assertEquals(FetchType.EAGER, ormElementCollectionMapping.getSpecifiedFetch());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.FetchType.EAGER, elementCollection.getFetch());
+	
+		elementCollection.setFetch(org.eclipse.jpt.jpa.core.resource.orm.FetchType.LAZY);
+		assertEquals(FetchType.LAZY, ormElementCollectionMapping.getSpecifiedFetch());
+		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.FetchType.LAZY, elementCollection.getFetch());
+
+		//set fetch to null in the resource model
+		elementCollection.setFetch(null);
+		assertNull(ormElementCollectionMapping.getSpecifiedFetch());
+		assertNull(elementCollection.getFetch());
+	}
+	
+	public void testModifySpecifiedFetch() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToOneMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection elementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+		
+		assertNull(ormElementCollectionMapping.getSpecifiedFetch());
+		assertNull(elementCollection.getFetch());
+				
+		//set fetch in the context model, verify resource model updated
+		ormElementCollectionMapping.setSpecifiedFetch(FetchType.EAGER);
+		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.FetchType.EAGER, elementCollection.getFetch());
+		assertEquals(FetchType.EAGER, ormElementCollectionMapping.getSpecifiedFetch());
+	
+		ormElementCollectionMapping.setSpecifiedFetch(FetchType.LAZY);
+		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.FetchType.LAZY, elementCollection.getFetch());
+		assertEquals(FetchType.LAZY, ormElementCollectionMapping.getSpecifiedFetch());
+
+		//set fetch to null in the context model
+		ormElementCollectionMapping.setSpecifiedFetch(null);
+		assertNull(elementCollection.getFetch());
+		assertNull(ormElementCollectionMapping.getSpecifiedFetch());
+	}	
+	
+	public void testUpdateSpecifiedTargetClass() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 elementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+		
+		assertNull(ormElementCollectionMapping.getSpecifiedTargetClass());
+		assertNull(elementCollection.getTargetClass());
+				
+		//set target class in the resource model, verify context model updated
+		elementCollection.setTargetClass("newTargetClass");
+		assertEquals("newTargetClass", ormElementCollectionMapping.getSpecifiedTargetClass());
+		assertEquals("newTargetClass", elementCollection.getTargetClass());
+	
+		//set target class to null in the resource model
+		elementCollection.setTargetClass(null);
+		assertNull(ormElementCollectionMapping.getSpecifiedTargetClass());
+		assertNull(elementCollection.getTargetClass());
+	}
+	
+	public void testModifySpecifiedTargetClass() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection_2_0 elementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+		
+		assertNull(ormElementCollectionMapping.getSpecifiedTargetClass());
+		assertNull(elementCollection.getTargetClass());
+				
+		//set target class in the context model, verify resource model updated
+		ormElementCollectionMapping.setSpecifiedTargetClass("newTargetClass");
+		assertEquals("newTargetClass", ormElementCollectionMapping.getSpecifiedTargetClass());
+		assertEquals("newTargetClass", elementCollection.getTargetClass());
+	
+		//set target class to null in the context model
+		ormElementCollectionMapping.setSpecifiedTargetClass(null);
+		assertNull(ormElementCollectionMapping.getSpecifiedTargetClass());
+		assertNull(elementCollection.getTargetClass());
+	}
+
+	
+	public void testGetValueTypeEmbeddable() throws Exception {
+		createTestEntityWithEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, "test.Address");
+
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");	
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+
+		assertEquals(ElementCollectionMapping2_0.Type.EMBEDDABLE_TYPE, elementCollectionMapping.getValueType());
+	}
+	
+	public void testGetValueTypeEntity() throws Exception {
+		createTestEntityWithEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.Address");
+
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");	
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+
+		assertEquals(ElementCollectionMapping2_0.Type.BASIC_TYPE, elementCollectionMapping.getValueType());
+	}
+	
+	public void testGetValueTypeNone() throws Exception {
+		createTestEntityWithNonGenericElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, "test.Address");
+		
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+
+		assertEquals(ElementCollectionMapping2_0.Type.NO_TYPE, elementCollectionMapping.getValueType());
+
+		elementCollectionMapping.setSpecifiedTargetClass("test.Address");
+		assertEquals(ElementCollectionMapping2_0.Type.EMBEDDABLE_TYPE, elementCollectionMapping.getValueType());
+	}
+	
+	public void testGetValueTypeBasic() throws Exception {
+		createTestEntityWithGenericBasicElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.Address");
+
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");	
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+
+		assertEquals(ElementCollectionMapping2_0.Type.BASIC_TYPE, elementCollectionMapping.getValueType());
+	}
+	
+	
+	public void testUpdateMapKey() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToManyMapping");
+		OrmOneToManyMapping ormOneToManyMapping = (OrmOneToManyMapping) ormPersistentAttribute.getMapping();
+		XmlOneToMany oneToMany = getXmlEntityMappings().getEntities().get(0).getAttributes().getOneToManys().get(0);
+		
+		assertNull(ormOneToManyMapping.getSpecifiedMapKey());
+		assertNull(oneToMany.getMapKey());
+		
+		//set mapKey in the resource model, verify context model does not change
+		oneToMany.setMapKey(OrmFactory.eINSTANCE.createMapKey());
+		assertNull(ormOneToManyMapping.getSpecifiedMapKey());
+		assertNotNull(oneToMany.getMapKey());
+				
+		//set mapKey name in the resource model, verify context model updated
+		oneToMany.getMapKey().setName("myMapKey");
+		assertEquals("myMapKey", ormOneToManyMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", oneToMany.getMapKey().getName());
+		
+		//set mapKey name to null in the resource model
+		oneToMany.getMapKey().setName(null);
+		assertNull(ormOneToManyMapping.getSpecifiedMapKey());
+		assertNull(oneToMany.getMapKey().getName());
+		
+		oneToMany.getMapKey().setName("myMapKey");
+		oneToMany.setMapKey(null);
+		assertNull(ormOneToManyMapping.getSpecifiedMapKey());
+		assertNull(oneToMany.getMapKey());
+	}
+	
+	public void testUpdateVirtualMapKey() throws Exception {
+		createTestEntityWithValidMapElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+
+		ElementCollectionMapping2_0 virtualElementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		assertNull(virtualElementCollectionMapping.getSpecifiedMapKey());
+		assertNull(virtualElementCollectionMapping.getMapKey());
+		assertFalse(virtualElementCollectionMapping.isPkMapKey());
+		assertFalse(virtualElementCollectionMapping.isCustomMapKey());
+		assertTrue(virtualElementCollectionMapping.isNoMapKey());
+		
+		//set pk mapKey in the java, verify virtual orm mapping updates
+		javaElementCollectionMapping.setPkMapKey(true);
+		assertEquals(null, virtualElementCollectionMapping.getMapKey());//no primary key on an embeddable
+		assertTrue(virtualElementCollectionMapping.isPkMapKey());
+		assertFalse(virtualElementCollectionMapping.isCustomMapKey());
+		assertFalse(virtualElementCollectionMapping.isNoMapKey());
+		
+		
+		//set custom specified mapKey in the java, verify virtual orm mapping updates
+		javaElementCollectionMapping.setCustomMapKey(true);
+		javaElementCollectionMapping.setSpecifiedMapKey("city");
+		assertEquals("city", virtualElementCollectionMapping.getSpecifiedMapKey());
+		assertEquals("city", virtualElementCollectionMapping.getMapKey());
+		assertFalse(virtualElementCollectionMapping.isPkMapKey());
+		assertTrue(virtualElementCollectionMapping.isCustomMapKey());
+		assertFalse(virtualElementCollectionMapping.isNoMapKey());
+	}
+	
+	public void testModifyMapKey() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToManyMapping");
+		OrmOneToManyMapping ormOneToManyMapping = (OrmOneToManyMapping) ormPersistentAttribute.getMapping();
+		XmlOneToMany xmlOneToMany = getXmlEntityMappings().getEntities().get(0).getAttributes().getOneToManys().get(0);
+		
+		assertNull(ormOneToManyMapping.getSpecifiedMapKey());
+		assertNull(xmlOneToMany.getMapKey());
+					
+		//set mapKey  in the context model, verify resource model updated
+		ormOneToManyMapping.setSpecifiedMapKey("myMapKey");
+		assertEquals("myMapKey", ormOneToManyMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", xmlOneToMany.getMapKey().getName());
+	
+		//set mapKey to null in the context model
+		ormOneToManyMapping.setSpecifiedMapKey(null);
+		assertNull(ormOneToManyMapping.getSpecifiedMapKey());
+		assertNull(xmlOneToMany.getMapKey().getName());
+	}
+	
+	public void testCandidateMapKeyNames() throws Exception {
+		createTestEntityWithValidMapElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		
+		ElementCollectionMapping2_0 virtualElementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentType.getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = 
+			virtualElementCollectionMapping.candidateMapKeyNames();
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.name", mapKeyNames.next());
+		assertEquals("state.abbr", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+	}
+	
+	public void testCandidateMapKeyNames2() throws Exception {
+		createTestEntityWithValidNonGenericMapElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		OrmReadOnlyPersistentAttribute attribute = ormPersistentType.getAttributeNamed("addresses");
+		ElementCollectionMapping2_0 virtualElementCollectionMapping = (ElementCollectionMapping2_0) attribute.getMapping();
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = virtualElementCollectionMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		javaElementCollectionMapping.setSpecifiedTargetClass("test.Address");
+		mapKeyNames = virtualElementCollectionMapping.candidateMapKeyNames();
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.name", mapKeyNames.next());
+		assertEquals("state.abbr", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		attribute.convertToSpecified();
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		mapKeyNames = ormElementCollectionMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		ormElementCollectionMapping.setSpecifiedTargetClass("test.Address");
+		mapKeyNames = ormElementCollectionMapping.candidateMapKeyNames();
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.name", mapKeyNames.next());
+		assertEquals("state.abbr", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		ormElementCollectionMapping.setSpecifiedTargetClass("String");
+		mapKeyNames = ormElementCollectionMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+	}
+	
+	public void testUpdateMapKeyClass() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToManyMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection elementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+		
+		assertNull(ormElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(elementCollection.getMapKeyClass());
+		
+		//set mapKey in the resource model, verify context model does not change
+		elementCollection.setMapKeyClass(OrmFactory.eINSTANCE.createXmlClassReference());
+		assertNull(ormElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNotNull(elementCollection.getMapKeyClass());
+				
+		//set mapKey name in the resource model, verify context model updated
+		elementCollection.getMapKeyClass().setClassName("String");
+		assertEquals("String", ormElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertEquals("String", elementCollection.getMapKeyClass().getClassName());
+		
+		//set mapKey name to null in the resource model
+		elementCollection.getMapKeyClass().setClassName(null);
+		assertNull(ormElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(elementCollection.getMapKeyClass().getClassName());
+		
+		elementCollection.getMapKeyClass().setClassName("String");
+		elementCollection.setMapKeyClass(null);
+		assertNull(ormElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(elementCollection.getMapKeyClass());
+	}
+	
+	public void testUpdateVirtualMapKeyClass() throws Exception {
+		createTestEntityWithValidMapElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+
+		ElementCollectionMapping2_0 virtualElementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		assertNull(virtualElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertEquals("java.lang.String", virtualElementCollectionMapping.getMapKeyClass());
+		assertEquals("java.lang.String", virtualElementCollectionMapping.getDefaultMapKeyClass());
+		
+		//set pk mapKey in the java, verify virtual orm mapping updates
+		javaElementCollectionMapping.setSpecifiedMapKeyClass("Integer");
+		assertEquals("Integer", virtualElementCollectionMapping.getMapKeyClass());
+		assertEquals("Integer", virtualElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertEquals("java.lang.String", virtualElementCollectionMapping.getDefaultMapKeyClass());
+	}
+	
+	public void testModifyMapKeyClass() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "oneToManyMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		XmlElementCollection elementCollection = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+		
+		assertNull(ormElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(elementCollection.getMapKeyClass());
+					
+		//set mapKey  in the context model, verify resource model updated
+		ormElementCollectionMapping.setSpecifiedMapKeyClass("String");
+		assertEquals("String", ormElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertEquals("String", elementCollection.getMapKeyClass().getClassName());
+	
+		//set mapKey to null in the context model
+		ormElementCollectionMapping.setSpecifiedMapKeyClass(null);
+		assertNull(ormElementCollectionMapping.getSpecifiedMapKeyClass());
+		assertNull(elementCollection.getMapKeyClass());
+	}
+	public void testOrderColumnDefaults() throws Exception {
+		createTestEntityWithGenericBasicElementCollectionMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");
+		OrmElementCollectionMapping2_0 elementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+
+		Orderable2_0 orderable = (Orderable2_0) elementCollectionMapping.getOrderable();
+		assertEquals(false, orderable.isOrderColumnOrdering());
+		assertEquals(true, orderable.isNoOrdering());
+		
+		orderable.setOrderColumnOrdering(true);
+		OrderColumn2_0 orderColumn = orderable.getOrderColumn();
+		assertEquals(true, orderable.isOrderColumnOrdering());
+		assertEquals(null, orderColumn.getSpecifiedName());
+		assertEquals("addresses_ORDER", orderColumn.getDefaultName());
+		assertEquals(TYPE_NAME + "_addresses", orderColumn.getTable());
+		
+		orderColumn.setSpecifiedName("FOO");
+		assertEquals("FOO", orderColumn.getSpecifiedName());
+		assertEquals("addresses_ORDER", orderColumn.getDefaultName());
+		assertEquals(TYPE_NAME + "_addresses", orderColumn.getTable());
+	}
+	
+	public void testVirtualOrderColumn() throws Exception {
+		createTestEntityWithGenericBasicElementCollectionMapping();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");
+		OrmElementCollectionMapping2_0 elementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+
+		Orderable2_0 orderable = (Orderable2_0) elementCollectionMapping.getOrderable();
+		assertEquals(false, orderable.isOrderColumnOrdering());
+		assertEquals(true, orderable.isNoOrdering());
+		
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentAttribute.getJavaPersistentAttribute().getMapping();
+		((Orderable2_0) javaElementCollectionMapping.getOrderable()).setOrderColumnOrdering(true);
+				
+		assertEquals(false, orderable.isOrderColumnOrdering());
+		assertEquals(true, orderable.isNoOrdering());
+
+		ormPersistentAttribute.convertToVirtual();		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("addresses");
+		ElementCollectionMapping2_0 virtualElementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute2.getMapping();
+		orderable = (Orderable2_0) virtualElementCollectionMapping.getOrderable();
+		assertEquals(true, orderable.isOrderColumnOrdering());
+		assertEquals(false, orderable.isNoOrdering());
+		assertEquals(TYPE_NAME + "_addresses", orderable.getOrderColumn().getTable());
+		assertEquals("addresses_ORDER", orderable.getOrderColumn().getName());
+		
+		((Orderable2_0) javaElementCollectionMapping.getOrderable()).getOrderColumn().setSpecifiedName("FOO");
+		assertEquals(TYPE_NAME + "_addresses", orderable.getOrderColumn().getTable());
+		assertEquals("FOO", orderable.getOrderColumn().getName());
+	}
+
+	public void testVirtualValueColumnDefaults() throws Exception {
+		createTestEntityWithGenericBasicElementCollectionMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		//virtual attrubte in orm.xml, java attribute has no value Column annotation
+		OrmReadOnlyPersistentAttribute addressesPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ElementCollectionMapping2_0 addressesVirtualMapping = (ElementCollectionMapping2_0) addressesPersistentAttribute.getMapping();		
+		Column virtualColumn = addressesVirtualMapping.getValueColumn();
+		assertEquals("addresses", virtualColumn.getName());
+		assertEquals(TYPE_NAME + "_addresses", virtualColumn.getTable());
+		assertEquals(null, virtualColumn.getColumnDefinition());
+		assertTrue(virtualColumn.isInsertable());
+		assertTrue(virtualColumn.isUpdatable());
+		assertTrue(virtualColumn.isNullable());
+		assertFalse(virtualColumn.isUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, virtualColumn.getLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, virtualColumn.getPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, virtualColumn.getScale());
+	
+		//set Column annotation in Java
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaElementCollectionMapping.getValueColumn().setSpecifiedName("FOO");		
+		javaElementCollectionMapping.getValueColumn().setSpecifiedTable("FOO_TABLE");
+		javaElementCollectionMapping.getValueColumn().setColumnDefinition("COLUMN_DEFINITION");
+		javaElementCollectionMapping.getValueColumn().setSpecifiedInsertable(Boolean.FALSE);	
+		javaElementCollectionMapping.getValueColumn().setSpecifiedUpdatable(Boolean.FALSE);	
+		javaElementCollectionMapping.getValueColumn().setSpecifiedNullable(Boolean.FALSE);	
+		javaElementCollectionMapping.getValueColumn().setSpecifiedUnique(Boolean.TRUE);	
+		javaElementCollectionMapping.getValueColumn().setSpecifiedLength(Integer.valueOf(45));
+		javaElementCollectionMapping.getValueColumn().setSpecifiedPrecision(Integer.valueOf(46));
+		javaElementCollectionMapping.getValueColumn().setSpecifiedScale(Integer.valueOf(47));
+
+		assertEquals("FOO", virtualColumn.getSpecifiedName());
+		assertEquals("FOO_TABLE", virtualColumn.getSpecifiedTable());
+		assertEquals("COLUMN_DEFINITION", virtualColumn.getColumnDefinition());
+		assertEquals(Boolean.FALSE, virtualColumn.getSpecifiedInsertable());
+		assertEquals(Boolean.FALSE, virtualColumn.getSpecifiedUpdatable());
+		assertEquals(Boolean.FALSE, virtualColumn.getSpecifiedNullable());
+		assertEquals(Boolean.TRUE, virtualColumn.getSpecifiedUnique());
+		assertEquals(Integer.valueOf(45), virtualColumn.getSpecifiedLength());
+		assertEquals(Integer.valueOf(46), virtualColumn.getSpecifiedPrecision());
+		assertEquals(Integer.valueOf(47), virtualColumn.getSpecifiedScale());
+
+	
+		//set metadata-complete, orm.xml virtual column ignores java column annotation
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		addressesPersistentAttribute = ormPersistentType.getAttributeNamed("addresses");
+		//no longer an element collection mapping
+		assertEquals(MappingKeys.NULL_ATTRIBUTE_MAPPING_KEY, addressesPersistentAttribute.getMappingKey());
+	}
+	
+	public void testNullColumnDefaults() throws Exception {
+		createTestEntityWithGenericBasicElementCollectionMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute addressesPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");
+
+		OrmElementCollectionMapping2_0 addressesVirtualMapping = (OrmElementCollectionMapping2_0) addressesPersistentAttribute.getMapping();		
+		OrmColumn ormColumn = addressesVirtualMapping.getValueColumn();
+	
+		//set Column annotation in Java
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaElementCollectionMapping.getValueColumn().setSpecifiedName("FOO");		
+		javaElementCollectionMapping.getValueColumn().setSpecifiedTable("FOO_TABLE");
+		javaElementCollectionMapping.getValueColumn().setColumnDefinition("COLUMN_DEFINITION");
+		javaElementCollectionMapping.getValueColumn().setSpecifiedInsertable(Boolean.FALSE);	
+		javaElementCollectionMapping.getValueColumn().setSpecifiedUpdatable(Boolean.FALSE);	
+		javaElementCollectionMapping.getValueColumn().setSpecifiedNullable(Boolean.FALSE);	
+		javaElementCollectionMapping.getValueColumn().setSpecifiedUnique(Boolean.TRUE);	
+		javaElementCollectionMapping.getValueColumn().setSpecifiedLength(Integer.valueOf(45));
+		javaElementCollectionMapping.getValueColumn().setSpecifiedPrecision(Integer.valueOf(46));
+		javaElementCollectionMapping.getValueColumn().setSpecifiedScale(Integer.valueOf(47));
+
+	
+		assertEquals("addresses", ormColumn.getDefaultName());
+		assertEquals(TYPE_NAME + "_addresses", ormColumn.getDefaultTable());
+		assertEquals(true, ormColumn.isDefaultInsertable());
+		assertEquals(true, ormColumn.isDefaultUpdatable());
+		assertEquals(true, ormColumn.isDefaultNullable());
+		assertEquals(false, ormColumn.isDefaultUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, ormColumn.getDefaultLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, ormColumn.getDefaultPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, ormColumn.getDefaultScale());
+		assertNull(ormColumn.getSpecifiedName());
+		assertNull(ormColumn.getSpecifiedTable());
+		assertNull(ormColumn.getColumnDefinition());
+		assertNull(ormColumn.getSpecifiedInsertable());
+		assertNull(ormColumn.getSpecifiedUpdatable());
+		assertNull(ormColumn.getSpecifiedNullable());
+		assertNull(ormColumn.getSpecifiedUnique());
+		assertNull(ormColumn.getSpecifiedLength());
+		assertNull(ormColumn.getSpecifiedPrecision());
+		assertNull(ormColumn.getSpecifiedScale());
+	}
+
+	public void testVirtualValueColumnTable() throws Exception {
+		createTestEntityWithGenericBasicElementCollectionMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		//virtual attribute in orm.xml, java attribute has no Column annotation
+		OrmReadOnlyPersistentAttribute addressesPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ElementCollectionMapping2_0 addressesVirtualMapping = (ElementCollectionMapping2_0) addressesPersistentAttribute.getMapping();	
+		Column virtualColumn = addressesVirtualMapping.getValueColumn();
+		
+		assertEquals(TYPE_NAME + "_addresses", virtualColumn.getTable());
+	
+		//entity table should have no affect on the collection table default name
+		((OrmEntity) ormPersistentType.getMapping()).getTable().setSpecifiedName("ORM_TABLE");
+		assertEquals(TYPE_NAME + "_addresses", virtualColumn.getTable());
+		
+		//set Column table element in Java
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaElementCollectionMapping.getCollectionTable().setSpecifiedName("JAVA_COLLECTION_TABLE");
+		assertEquals("JAVA_COLLECTION_TABLE", virtualColumn.getTable());
+		javaElementCollectionMapping.getValueColumn().setSpecifiedTable("JAVA_TABLE");	
+		assertEquals("JAVA_TABLE", virtualColumn.getTable());
+		
+		//make name persistent attribute not virtual
+		addressesPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");
+		addressesVirtualMapping = (OrmElementCollectionMapping2_0) addressesPersistentAttribute.getMapping();	
+		virtualColumn = addressesVirtualMapping.getValueColumn();
+		assertNull(virtualColumn.getSpecifiedTable());
+		assertEquals(TYPE_NAME + "_addresses", virtualColumn.getDefaultTable());
+	}
+	public void testMoveSpecifiedAttributeOverride() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		OrmAttributeOverrideContainer attributeOverrideContainer = ormElementCollectionMapping.getValueAttributeOverrideContainer();
+		XmlElementCollection_2_0 elementCollectionResource = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+
+		elementCollectionResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		elementCollectionResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		elementCollectionResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		
+		elementCollectionResource.getAttributeOverrides().get(0).setName("FOO");
+		elementCollectionResource.getAttributeOverrides().get(1).setName("BAR");
+		elementCollectionResource.getAttributeOverrides().get(2).setName("BAZ");
+		
+		assertEquals(3, elementCollectionResource.getAttributeOverrides().size());		
+		
+		attributeOverrideContainer.moveSpecifiedOverride(2, 0);
+		ListIterator<OrmAttributeOverride> attributeOverrides = attributeOverrideContainer.specifiedOverrides();
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+
+		assertEquals("BAR", elementCollectionResource.getAttributeOverrides().get(0).getName());
+		assertEquals("BAZ", elementCollectionResource.getAttributeOverrides().get(1).getName());
+		assertEquals("FOO", elementCollectionResource.getAttributeOverrides().get(2).getName());
+
+
+		attributeOverrideContainer.moveSpecifiedOverride(0, 1);
+		attributeOverrides = attributeOverrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+
+		assertEquals("BAZ", elementCollectionResource.getAttributeOverrides().get(0).getName());
+		assertEquals("BAR", elementCollectionResource.getAttributeOverrides().get(1).getName());
+		assertEquals("FOO", elementCollectionResource.getAttributeOverrides().get(2).getName());
+	}
+	
+	public void testUpdateAttributeOverrides() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "elementCollectionMapping");
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		OrmAttributeOverrideContainer attributeOverrideContainer = ormElementCollectionMapping.getValueAttributeOverrideContainer();
+		XmlElementCollection_2_0 elementCollectionResource = getXmlEntityMappings().getEntities().get(0).getAttributes().getElementCollections().get(0);
+		
+		elementCollectionResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		elementCollectionResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		elementCollectionResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		
+		elementCollectionResource.getAttributeOverrides().get(0).setName("FOO");
+		elementCollectionResource.getAttributeOverrides().get(1).setName("BAR");
+		elementCollectionResource.getAttributeOverrides().get(2).setName("BAZ");
+
+		ListIterator<OrmAttributeOverride> attributeOverrides = attributeOverrideContainer.specifiedOverrides();
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		elementCollectionResource.getAttributeOverrides().move(2, 0);
+		attributeOverrides = attributeOverrideContainer.specifiedOverrides();
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+
+		elementCollectionResource.getAttributeOverrides().move(0, 1);
+		attributeOverrides = attributeOverrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+
+		elementCollectionResource.getAttributeOverrides().remove(1);
+		attributeOverrides = attributeOverrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+
+		elementCollectionResource.getAttributeOverrides().remove(1);
+		attributeOverrides = attributeOverrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		elementCollectionResource.getAttributeOverrides().remove(0);
+		assertFalse(attributeOverrideContainer.specifiedOverrides().hasNext());
+	}
+
+	public void testElementCollectionMappingNoUnderylingJavaAttribute() throws Exception {
+		createTestEntityWithEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "foo");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());
+		
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+		OrmElementCollectionMapping2_0 ormElementCollectionMapping = (OrmElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		OrmAttributeOverrideContainer attributeOverrideContainer = ormElementCollectionMapping.getValueAttributeOverrideContainer();
+		
+		assertEquals("foo", ormElementCollectionMapping.getName());
+
+		
+		assertFalse(attributeOverrideContainer.specifiedOverrides().hasNext());
+		assertFalse(attributeOverrideContainer.virtualOverrides().hasNext());
+	}
+	
+	public void testVirtualAttributeOverrides() throws Exception {
+		createTestEntityWithEmbeddableElementCollectionMapping();
+		createTestTargetEmbeddableAddress();
+		createTestEmbeddableState();
+		
+		OrmPersistentType persistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentType persistentType2 = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		OrmPersistentType persistentType3 = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		
+		//embedded mapping is virtual, specified attribute overrides should exist
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = persistentType.getAttributeNamed("addresses");
+		ElementCollectionMapping2_0 elementCollectionMapping = (ElementCollectionMapping2_0) ormPersistentAttribute.getMapping();
+		AttributeOverrideContainer attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		assertEquals(4, attributeOverrideContainer.overridesSize());
+		assertEquals(3, attributeOverrideContainer.virtualOverridesSize());
+		assertEquals(1, attributeOverrideContainer.specifiedOverridesSize());
+		ListIterator<AttributeOverride> specifiedAttributeOverrides = (ListIterator<AttributeOverride>) attributeOverrideContainer.specifiedOverrides();
+		ReadOnlyAttributeOverride attributeOverride = specifiedAttributeOverrides.next();
+		assertEquals("city", attributeOverride.getName());
+		ListIterator<AttributeOverride> virtualAttributeOverrides = (ListIterator<AttributeOverride>) attributeOverrideContainer.virtualOverrides();
+		attributeOverride = virtualAttributeOverrides.next();
+		assertEquals("state.name", attributeOverride.getName());
+		attributeOverride = virtualAttributeOverrides.next();
+		assertEquals("state.abbr", attributeOverride.getName());
+		attributeOverride = virtualAttributeOverrides.next();
+		assertEquals("zip", attributeOverride.getName());
+		
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentAttribute.getJavaPersistentAttribute().getMapping();
+		Column javaAttributeOverrideColumn = javaElementCollectionMapping.getValueAttributeOverrideContainer().specifiedOverrides().next().getColumn();
+		
+		javaAttributeOverrideColumn.setSpecifiedName("FOO_COLUMN");
+		javaAttributeOverrideColumn.setSpecifiedTable("FOO_TABLE");
+		javaAttributeOverrideColumn.setColumnDefinition("COLUMN_DEF");
+		javaAttributeOverrideColumn.setSpecifiedInsertable(Boolean.FALSE);
+		javaAttributeOverrideColumn.setSpecifiedUpdatable(Boolean.FALSE);
+		javaAttributeOverrideColumn.setSpecifiedUnique(Boolean.TRUE);
+		javaAttributeOverrideColumn.setSpecifiedNullable(Boolean.FALSE);
+		javaAttributeOverrideColumn.setSpecifiedLength(Integer.valueOf(5));
+		javaAttributeOverrideColumn.setSpecifiedPrecision(Integer.valueOf(6));
+		javaAttributeOverrideColumn.setSpecifiedScale(Integer.valueOf(7));
+
+		JavaBasicMapping javaBasicMapping = (JavaBasicMapping) persistentType3.getJavaPersistentType().getAttributeNamed("name").getMapping();
+		javaBasicMapping.getColumn().setSpecifiedName("MY_STATE_COLUMN");
+		assertEquals(4, attributeOverrideContainer.overridesSize());
+		assertEquals(3, attributeOverrideContainer.virtualOverridesSize());
+		assertEquals(1, attributeOverrideContainer.specifiedOverridesSize());
+		virtualAttributeOverrides = (ListIterator<AttributeOverride>) attributeOverrideContainer.specifiedOverrides();
+		attributeOverride = virtualAttributeOverrides.next();
+		assertEquals("city", attributeOverride.getName());
+		assertEquals("FOO_COLUMN", attributeOverride.getColumn().getSpecifiedName());
+		assertEquals("FOO_TABLE", attributeOverride.getColumn().getSpecifiedTable());
+		assertEquals("COLUMN_DEF", attributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, attributeOverride.getColumn().isInsertable());
+		assertEquals(false, attributeOverride.getColumn().isUpdatable());
+		assertEquals(true, attributeOverride.getColumn().isUnique());
+		assertEquals(false, attributeOverride.getColumn().isNullable());
+		assertEquals(5, attributeOverride.getColumn().getLength());
+		assertEquals(6, attributeOverride.getColumn().getPrecision());
+		assertEquals(7, attributeOverride.getColumn().getScale());
+		
+		specifiedAttributeOverrides = (ListIterator<AttributeOverride>) attributeOverrideContainer.virtualOverrides();
+		attributeOverride = specifiedAttributeOverrides.next();
+		assertEquals("state.name", attributeOverride.getName());
+		assertEquals("MY_STATE_COLUMN", attributeOverride.getColumn().getSpecifiedName());
+		attributeOverride = specifiedAttributeOverrides.next();
+		assertEquals("state.abbr", attributeOverride.getName());
+		attributeOverride = specifiedAttributeOverrides.next();
+		assertEquals("zip", attributeOverride.getName());
+		
+		
+		
+		//embedded mapping is specified, virtual attribute overrides should exist
+		persistentType.getAttributeNamed("addresses").convertToSpecified();
+		elementCollectionMapping = (OrmElementCollectionMapping2_0) persistentType.getAttributeNamed("addresses").getMapping();
+		attributeOverrideContainer = elementCollectionMapping.getValueAttributeOverrideContainer();
+		assertEquals(4, attributeOverrideContainer.overridesSize());
+		assertEquals(4, attributeOverrideContainer.virtualOverridesSize());
+		assertEquals(0, attributeOverrideContainer.specifiedOverridesSize());
+		virtualAttributeOverrides = (ListIterator<AttributeOverride>) attributeOverrideContainer.virtualOverrides();
+		ReadOnlyAttributeOverride virtualOverride = virtualAttributeOverrides.next();
+		assertEquals("city", virtualOverride.getName());
+		virtualOverride = virtualAttributeOverrides.next();
+		assertEquals("state.name", virtualOverride.getName());
+		assertEquals("MY_STATE_COLUMN", virtualOverride.getColumn().getName());
+		assertEquals(TYPE_NAME + "_addresses", virtualOverride.getColumn().getTable());
+		assertEquals(null, virtualOverride.getColumn().getColumnDefinition());
+		assertEquals(true, virtualOverride.getColumn().isInsertable());
+		assertEquals(true, virtualOverride.getColumn().isUpdatable());
+		assertEquals(false, virtualOverride.getColumn().isUnique());
+		assertEquals(true, virtualOverride.getColumn().isNullable());
+		assertEquals(255, virtualOverride.getColumn().getLength());
+		assertEquals(0, virtualOverride.getColumn().getPrecision());
+		assertEquals(0, virtualOverride.getColumn().getScale());
+		virtualOverride = virtualAttributeOverrides.next();
+		assertEquals("state.abbr", virtualOverride.getName());
+		assertEquals(TYPE_NAME + "_addresses", virtualOverride.getColumn().getDefaultTable());
+		virtualOverride = virtualAttributeOverrides.next();
+		assertEquals("zip", virtualOverride.getName());
+		
+		//set one of the virtual attribute overrides to specified, verify others are still virtual
+		attributeOverrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		assertEquals(4, attributeOverrideContainer.overridesSize());
+		assertEquals(1, attributeOverrideContainer.specifiedOverridesSize());
+		assertEquals(3, attributeOverrideContainer.virtualOverridesSize());
+		assertEquals("city", attributeOverrideContainer.specifiedOverrides().next().getName());
+		virtualAttributeOverrides = (ListIterator<AttributeOverride>) attributeOverrideContainer.virtualOverrides();
+		virtualOverride = virtualAttributeOverrides.next();
+		assertEquals("state.name", virtualOverride.getName());
+		virtualOverride = virtualAttributeOverrides.next();
+		assertEquals("state.abbr", virtualOverride.getName());
+		virtualOverride = virtualAttributeOverrides.next();
+		assertEquals("zip", virtualOverride.getName());
+	}
+	public void testVirtualMapKeyColumnDefaults() throws Exception {
+		createTestEntityWithValidMapElementCollectionMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+
+		//virtual attribute in orm.xml, java attribute has no value Column annotation
+		OrmReadOnlyPersistentAttribute addressesPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ElementCollectionMapping2_0 addressesVirtualMapping = (ElementCollectionMapping2_0) addressesPersistentAttribute.getMapping();		
+		Column virtualColumn = addressesVirtualMapping.getMapKeyColumn();
+		assertEquals("addresses_KEY", virtualColumn.getName());
+		assertEquals(TYPE_NAME + "_addresses", virtualColumn.getTable());
+		assertEquals(null, virtualColumn.getColumnDefinition());
+		assertTrue(virtualColumn.isInsertable());
+		assertTrue(virtualColumn.isUpdatable());
+		assertTrue(virtualColumn.isNullable());
+		assertFalse(virtualColumn.isUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, virtualColumn.getLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, virtualColumn.getPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, virtualColumn.getScale());
+
+		//set Column annotation in Java
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedName("FOO");		
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedTable("FOO_TABLE");
+		javaElementCollectionMapping.getMapKeyColumn().setColumnDefinition("COLUMN_DEFINITION");
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedInsertable(Boolean.FALSE);	
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedUpdatable(Boolean.FALSE);	
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedNullable(Boolean.FALSE);	
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedUnique(Boolean.TRUE);	
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedLength(Integer.valueOf(45));
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedPrecision(Integer.valueOf(46));
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedScale(Integer.valueOf(47));
+
+		assertEquals("FOO", virtualColumn.getSpecifiedName());
+		assertEquals("FOO_TABLE", virtualColumn.getSpecifiedTable());
+		assertEquals("COLUMN_DEFINITION", virtualColumn.getColumnDefinition());
+		assertEquals(Boolean.FALSE, virtualColumn.getSpecifiedInsertable());
+		assertEquals(Boolean.FALSE, virtualColumn.getSpecifiedUpdatable());
+		assertEquals(Boolean.FALSE, virtualColumn.getSpecifiedNullable());
+		assertEquals(Boolean.TRUE, virtualColumn.getSpecifiedUnique());
+		assertEquals(Integer.valueOf(45), virtualColumn.getSpecifiedLength());
+		assertEquals(Integer.valueOf(46), virtualColumn.getSpecifiedPrecision());
+		assertEquals(Integer.valueOf(47), virtualColumn.getSpecifiedScale());
+
+
+		//set metadata-complete, orm.xml virtual column ignores java column annotation
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		addressesPersistentAttribute = ormPersistentType.getAttributeNamed("addresses");
+		//no longer an element collection mapping
+		assertEquals(MappingKeys.NULL_ATTRIBUTE_MAPPING_KEY, addressesPersistentAttribute.getMappingKey());
+	}
+	
+	public void testNullMapKeyColumnDefaults() throws Exception {
+		createTestEntityWithValidMapElementCollectionMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute addressesPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");
+
+		OrmElementCollectionMapping2_0 addressesVirtualMapping = (OrmElementCollectionMapping2_0) addressesPersistentAttribute.getMapping();		
+		Column ormColumn = addressesVirtualMapping.getMapKeyColumn();
+
+		//set Column annotation in Java
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedName("FOO");		
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedTable("FOO_TABLE");
+		javaElementCollectionMapping.getMapKeyColumn().setColumnDefinition("COLUMN_DEFINITION");
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedInsertable(Boolean.FALSE);	
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedUpdatable(Boolean.FALSE);	
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedNullable(Boolean.FALSE);	
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedUnique(Boolean.TRUE);	
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedLength(Integer.valueOf(45));
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedPrecision(Integer.valueOf(46));
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedScale(Integer.valueOf(47));
+
+
+		assertEquals("addresses_KEY", ormColumn.getDefaultName());
+		assertEquals(TYPE_NAME + "_addresses", ormColumn.getDefaultTable());
+		assertEquals(true, ormColumn.isDefaultInsertable());
+		assertEquals(true, ormColumn.isDefaultUpdatable());
+		assertEquals(true, ormColumn.isDefaultNullable());
+		assertEquals(false, ormColumn.isDefaultUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, ormColumn.getDefaultLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, ormColumn.getDefaultPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, ormColumn.getDefaultScale());
+		assertNull(ormColumn.getSpecifiedName());
+		assertNull(ormColumn.getSpecifiedTable());
+		assertNull(ormColumn.getColumnDefinition());
+		assertNull(ormColumn.getSpecifiedInsertable());
+		assertNull(ormColumn.getSpecifiedUpdatable());
+		assertNull(ormColumn.getSpecifiedNullable());
+		assertNull(ormColumn.getSpecifiedUnique());
+		assertNull(ormColumn.getSpecifiedLength());
+		assertNull(ormColumn.getSpecifiedPrecision());
+		assertNull(ormColumn.getSpecifiedScale());
+	}
+
+	public void testVirtualMapKeyColumnTable() throws Exception {
+		createTestEntityWithValidMapElementCollectionMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+
+		//virtual attribute in orm.xml, java attribute has no Column annotation
+		OrmReadOnlyPersistentAttribute addressesPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ElementCollectionMapping2_0 addressesVirtualMapping = (ElementCollectionMapping2_0) addressesPersistentAttribute.getMapping();	
+		Column virtualColumn = addressesVirtualMapping.getMapKeyColumn();
+
+		assertEquals(TYPE_NAME + "_addresses", virtualColumn.getTable());
+
+		//entity table should have no affect on the collection table default name
+		((OrmEntity) ormPersistentType.getMapping()).getTable().setSpecifiedName("ORM_TABLE");
+		assertEquals(TYPE_NAME + "_addresses", virtualColumn.getTable());
+
+		//set Column table element in Java
+		JavaElementCollectionMapping2_0 javaElementCollectionMapping = (JavaElementCollectionMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaElementCollectionMapping.getCollectionTable().setSpecifiedName("JAVA_COLLECTION_TABLE");
+		assertEquals("JAVA_COLLECTION_TABLE", virtualColumn.getTable());
+		javaElementCollectionMapping.getMapKeyColumn().setSpecifiedTable("JAVA_TABLE");	
+		assertEquals("JAVA_TABLE", virtualColumn.getTable());
+
+		//make name persistent attribute not virtual
+		addressesPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY, "addresses");
+		addressesVirtualMapping = (OrmElementCollectionMapping2_0) addressesPersistentAttribute.getMapping();	
+		virtualColumn = addressesVirtualMapping.getMapKeyColumn();
+		assertNull(virtualColumn.getSpecifiedTable());
+		assertEquals(TYPE_NAME + "_addresses", virtualColumn.getDefaultTable());
+	}
+
+	public void testSelfReferentialElementCollectionMapping() throws Exception {
+		createSelfReferentialElementCollection();
+		OrmPersistentType persistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Foo");
+
+		ElementCollectionMapping2_0 mapping = (ElementCollectionMapping2_0) persistentType.getAttributeNamed("elementCollection").getMapping();
+		assertFalse(mapping.allOverridableAttributeMappingNames().hasNext());
+	}
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmEntityTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmEntityTests.java
new file mode 100644
index 0000000..c204384
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmEntityTests.java
@@ -0,0 +1,1806 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.core.tests.internal.utility.jdt.AnnotationTestCase.DefaultAnnotationWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AssociationOverride;
+import org.eclipse.jpt.jpa.core.context.AssociationOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.AttributeOverride;
+import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.BasicMapping;
+import org.eclipse.jpt.jpa.core.context.EmbeddedMapping;
+import org.eclipse.jpt.jpa.core.context.InheritanceType;
+import org.eclipse.jpt.jpa.core.context.VirtualAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.orm.OrmAssociationOverride;
+import org.eclipse.jpt.jpa.core.context.orm.OrmAssociationOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.orm.OrmAttributeOverride;
+import org.eclipse.jpt.jpa.core.context.orm.OrmAttributeOverrideContainer;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmMappedSuperclass;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmVirtualAssociationOverride;
+import org.eclipse.jpt.jpa.core.context.orm.OrmVirtualAttributeOverride;
+import org.eclipse.jpt.jpa.core.jpa2.MappingKeys2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cacheable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.CacheableHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.PersistenceUnit2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.SharedCacheMode;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlAssociationOverride;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkMappedSuperclass;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0OrmEntityTests extends EclipseLink2_0OrmContextModelTestCase
+{
+	protected static final String SUB_TYPE_NAME = "AnnotationTestTypeChild";
+	protected static final String FULLY_QUALIFIED_SUB_TYPE_NAME = PACKAGE_NAME + "." + SUB_TYPE_NAME;
+	
+	
+	public EclipseLink2_0OrmEntityTests(String name) {
+		super(name);
+	}
+
+	private ICompilationUnit createTestEntity() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+		});
+	}
+
+	private ICompilationUnit createTestMappedSuperclass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, JPA.ONE_TO_ONE, JPA.MANY_TO_ONE, JPA.ONE_TO_MANY, JPA.MANY_TO_MANY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass");
+			}
+			
+			@Override
+			public void appendGetIdMethodAnnotationTo(StringBuilder sb) {
+				sb.append("private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToOne");
+				sb.append(CR);
+				sb.append("    private int address;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToOne");
+				sb.append(CR);
+				sb.append("    private int address2;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToMany");
+				sb.append(CR);
+				sb.append("    private int address3;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany");
+				sb.append(CR);
+				sb.append("    private int address4;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestAbstractEntityTablePerClass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.INHERITANCE, JPA.INHERITANCE_TYPE, JPA.ONE_TO_ONE, JPA.MANY_TO_ONE, JPA.ONE_TO_MANY, JPA.MANY_TO_MANY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+				sb.append("@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)");
+				sb.append("abstract");
+			}
+			
+			@Override
+			public void appendGetIdMethodAnnotationTo(StringBuilder sb) {
+				sb.append("private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToOne");
+				sb.append(CR);
+				sb.append("    private int address;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToOne");
+				sb.append(CR);
+				sb.append("    private int address2;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToMany");
+				sb.append(CR);
+				sb.append("    private int address3;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany");
+				sb.append(CR);
+				sb.append("    private int address4;").append(CR);
+				sb.append(CR);
+				sb.append("    ");
+			}
+		});
+	}
+
+	private void createTestSubType() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("AnnotationTestTypeChild").append(" ");
+				sb.append("extends " + TYPE_NAME + " ");
+				sb.append("{}").append(CR);
+			}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "AnnotationTestTypeChild.java", sourceWriter);
+	}
+	
+	private void createTestMappedSuperclassCustomer() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.MAPPED_SUPERCLASS);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@MappedSuperclass");
+				sb.append(CR);
+				sb.append("public class ").append("Customer ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private String id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+			sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Customer.java", sourceWriter);
+	}
+
+	private void createTestMappedSuperclassCustomerWithElementCollection() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.MAPPED_SUPERCLASS);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ELEMENT_COLLECTION);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@MappedSuperclass");
+				sb.append(CR);
+				sb.append("public class ").append("Customer ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private String id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);
+				sb.append("    private java.util.Collection<Address> address;").append(CR);
+				sb.append(CR);
+			sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Customer.java", sourceWriter);
+	}
+	
+	private void createTestEntityLongTimeCustomer() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("LongTimeCustomer extends Customer ");
+				sb.append("{}");
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "LongTimeCustomer.java", sourceWriter);
+	}
+
+
+	private void createTestEmbeddableAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDED);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ONE_TO_ONE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String street;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToOne").append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    @Embedded").append(CR);
+				sb.append("    private ZipCode zipCode;").append(CR);
+				sb.append(CR);
+			sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+	
+	private void createTestEmbeddableZipCode() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("ZipCode").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String zip;").append(CR);
+				sb.append(CR);
+				sb.append("    private String plusfour;").append(CR);
+				sb.append(CR);
+			sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "ZipCode.java", sourceWriter);
+	}
+
+	public void testAttributeMappingKeyAllowed() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		OrmEntity entity = (OrmEntity) ormPersistentType.getMapping();
+
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.EMBEDDED_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.VERSION_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.TRANSIENT_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY));
+		assertTrue(entity.attributeMappingKeyAllowed(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY));
+	}
+	
+	public void testOverridableAttributes() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity entity = (OrmEntity) ormPersistentType.getMapping();
+	
+		Iterator<String> overridableAttributes = entity.overridableAttributeNames();
+		assertFalse(overridableAttributes.hasNext());
+		
+		
+		entity.setSpecifiedInheritanceStrategy(InheritanceType.TABLE_PER_CLASS);
+		
+		overridableAttributes = entity.overridableAttributeNames();		
+		assertEquals("id", overridableAttributes.next());
+		assertEquals("name", overridableAttributes.next());
+		assertFalse(overridableAttributes.hasNext());
+	}
+
+	public void testOverridableAttributeNames() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity entity = (OrmEntity) ormPersistentType.getMapping();
+	
+		Iterator<String> overridableAttributeNames = entity.overridableAttributeNames();
+		assertFalse(overridableAttributeNames.hasNext());
+		
+		
+		entity.setSpecifiedInheritanceStrategy(InheritanceType.TABLE_PER_CLASS);
+		
+		overridableAttributeNames = entity.overridableAttributeNames();
+		assertEquals("id", overridableAttributeNames.next());
+		assertEquals("name", overridableAttributeNames.next());
+		assertFalse(overridableAttributeNames.hasNext());
+	}
+
+	public void testAllOverridableAttributes() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+	
+		Iterator<String> overridableAttributes = getJavaEntity().allOverridableAttributeNames();
+		assertEquals("id", overridableAttributes.next());
+		assertEquals("name", overridableAttributes.next());
+		assertEquals("foo", overridableAttributes.next());
+		assertFalse(overridableAttributes.hasNext());
+	}
+	
+	public void testAllOverridableAttributesTablePerClass() throws Exception {
+		createTestAbstractEntityTablePerClass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+	
+		Iterator<String> overridableAttributes = ormEntity.allOverridableAttributeNames();
+		assertEquals("id", overridableAttributes.next());
+		assertEquals("name", overridableAttributes.next());
+		assertEquals("foo", overridableAttributes.next());
+		assertFalse(overridableAttributes.hasNext());
+		
+		
+		OrmEntity abstractEntity = (OrmEntity) ormEntity.getParentEntity();
+		overridableAttributes = abstractEntity.allOverridableAttributeNames();
+		assertEquals("id", overridableAttributes.next());
+		assertEquals("name", overridableAttributes.next());
+		assertEquals("foo", overridableAttributes.next());
+		assertFalse(overridableAttributes.hasNext());
+	}
+	
+	public void testAllOverridableAssociationsTablePerClass() throws Exception {
+		createTestAbstractEntityTablePerClass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+	
+		Iterator<String> overridableAssociations = ormEntity.allOverridableAssociationNames();
+		assertEquals("address", overridableAssociations.next());
+		assertEquals("address2", overridableAssociations.next());
+		assertEquals("address3", overridableAssociations.next());
+		assertEquals("address4", overridableAssociations.next());
+		assertFalse(overridableAssociations.hasNext());
+		
+		
+		OrmEntity abstractEntity = (OrmEntity) ormEntity.getParentEntity();
+		overridableAssociations = abstractEntity.allOverridableAssociationNames();
+		assertEquals("address", overridableAssociations.next());
+		assertEquals("address2", overridableAssociations.next());
+		assertEquals("address3", overridableAssociations.next());
+		assertEquals("address4", overridableAssociations.next());
+		assertFalse(overridableAssociations.hasNext());
+	}
+//TODO
+//	public void testAllOverridableAttributesMappedSuperclassInOrmXml() throws Exception {
+//		createTestMappedSuperclass();
+//		createTestSubType();
+//		addXmlClassRef(PACKAGE_NAME + ".AnnotationTestTypeChild");
+//		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+//		
+//		Iterator<PersistentAttribute> overridableAttributes = getJavaEntity().allOverridableAttributes();
+//		assertEquals("id", overridableAttributes.next().getName());
+//		assertEquals("name", overridableAttributes.next().getName());
+//		assertEquals("foo", overridableAttributes.next().getName());
+//		assertFalse(overridableAttributes.hasNext());
+//	}
+
+	public void testAllOverridableAttributeNames() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+	
+		Iterator<String> overridableAttributeNames = ormEntity.allOverridableAttributeNames();
+		assertEquals("id", overridableAttributeNames.next());
+		assertEquals("name", overridableAttributeNames.next());
+		assertEquals("foo", overridableAttributeNames.next());
+		assertFalse(overridableAttributeNames.hasNext());
+	}
+		
+	public void testSpecifiedAttributeOverrides() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity entity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAttributeOverrideContainer overrideContainer = entity.getAttributeOverrideContainer();
+		
+		ListIterator<OrmAttributeOverride> specifiedAttributeOverrides = overrideContainer.specifiedOverrides();
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+
+		//add an annotation to the resource model and verify the context model is updated
+		entityResource.getAttributeOverrides().add(0, OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		entityResource.getAttributeOverrides().get(0).setName("FOO");
+		specifiedAttributeOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		entityResource.getAttributeOverrides().add(1, OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		entityResource.getAttributeOverrides().get(1).setName("BAR");
+		specifiedAttributeOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+
+		entityResource.getAttributeOverrides().add(0, OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		entityResource.getAttributeOverrides().get(0).setName("BAZ");
+		specifiedAttributeOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAttributeOverrides.next().getName());
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+	
+		//move an annotation to the resource model and verify the context model is updated
+		entityResource.getAttributeOverrides().move(1, 0);
+		specifiedAttributeOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAZ", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+
+		entityResource.getAttributeOverrides().remove(0);
+		specifiedAttributeOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAttributeOverrides.next().getName());
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+	
+		entityResource.getAttributeOverrides().remove(0);
+		specifiedAttributeOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("BAR", specifiedAttributeOverrides.next().getName());
+		assertFalse(specifiedAttributeOverrides.hasNext());
+		
+		entityResource.getAttributeOverrides().remove(0);
+		specifiedAttributeOverrides = overrideContainer.specifiedOverrides();		
+		assertFalse(specifiedAttributeOverrides.hasNext());
+	}
+
+	public void testDefaultAttributeOverrides() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		assertEquals(0, entityResource.getAttributeOverrides().size());
+		
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		VirtualAttributeOverride virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("id", virtualAttributeOverride.getColumn().getName());
+		assertEquals(SUB_TYPE_NAME, virtualAttributeOverride.getColumn().getTable());
+		
+
+		OrmMappedSuperclass mappedSuperclass = (OrmMappedSuperclass) ormEntity.getPersistentType().getSuperPersistentType().getMapping();
+		
+		mappedSuperclass.getPersistentType().getAttributeNamed("id").convertToSpecified();
+		BasicMapping idMapping = (BasicMapping) mappedSuperclass.getPersistentType().getAttributeNamed("id").getMapping();
+		idMapping.getColumn().setSpecifiedName("FOO");
+		idMapping.getColumn().setSpecifiedTable("BAR");
+		
+		assertEquals(0, entityResource.getAttributeOverrides().size());
+
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("FOO", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BAR", virtualAttributeOverride.getColumn().getTable());
+
+		idMapping.getColumn().setSpecifiedName(null);
+		idMapping.getColumn().setSpecifiedTable(null);
+		assertEquals(0, entityResource.getAttributeOverrides().size());
+
+		virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("id", virtualAttributeOverride.getColumn().getName());
+		assertEquals(SUB_TYPE_NAME, virtualAttributeOverride.getColumn().getTable());
+		
+		virtualAttributeOverride.convertToSpecified();
+		assertEquals(2, overrideContainer.virtualOverridesSize());
+	}
+	
+	public void testDefaultAttributeOverridesEntityHierachy() throws Exception {
+		createTestAbstractEntityTablePerClass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		assertEquals(0, entityResource.getAttributeOverrides().size());
+
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		VirtualAttributeOverride virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("id", virtualAttributeOverride.getColumn().getName());
+		assertEquals(SUB_TYPE_NAME, virtualAttributeOverride.getColumn().getTable());
+		
+
+		OrmEntity superclass = (OrmEntity) ormEntity.getParentEntity();
+		
+		superclass.getPersistentType().getAttributeNamed("id").convertToSpecified();
+		BasicMapping idMapping = (BasicMapping) superclass.getPersistentType().getAttributeNamed("id").getMapping();
+		idMapping.getColumn().setSpecifiedName("FOO");
+		idMapping.getColumn().setSpecifiedTable("BAR");
+		
+		assertEquals(0, entityResource.getAttributeOverrides().size());
+
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("FOO", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BAR", virtualAttributeOverride.getColumn().getTable());
+
+		idMapping.getColumn().setSpecifiedName(null);
+		idMapping.getColumn().setSpecifiedTable(null);
+		assertEquals(0, entityResource.getAttributeOverrides().size());
+
+		virtualAttributeOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertEquals("id", virtualAttributeOverride.getColumn().getName());
+		assertEquals(SUB_TYPE_NAME, virtualAttributeOverride.getColumn().getTable());
+		
+		virtualAttributeOverride.convertToSpecified();
+		assertEquals(2, overrideContainer.virtualOverridesSize());
+	}
+	
+	public void testSpecifiedAttributeOverridesSize() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+		
+		assertEquals(0, overrideContainer.specifiedOverridesSize());
+
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+
+		//add an annotation to the resource model and verify the context model is updated
+		entityResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		entityResource.getAttributeOverrides().get(0).setName("FOO");
+		entityResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		entityResource.getAttributeOverrides().get(0).setName("BAR");
+
+		assertEquals(2, overrideContainer.specifiedOverridesSize());
+	}
+	
+	public void testDefaultAttributeOverridesSize() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+		
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(2, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(1, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(0, overrideContainer.virtualOverridesSize());
+	}
+	
+	public void testAttributeOverridesSize() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+		
+		assertEquals(3, overrideContainer.overridesSize());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(3, overrideContainer.overridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(3, overrideContainer.overridesSize());
+		
+		
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		entityResource.getAttributeOverrides().add(0, OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		entityResource.getAttributeOverrides().get(0).setName("bar");
+		assertEquals(4, overrideContainer.overridesSize());
+	}
+
+	public void testAttributeOverrideSetVirtual() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+			
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+				
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals("id", entityResource.getAttributeOverrides().get(0).getName());		
+		assertEquals("name", entityResource.getAttributeOverrides().get(1).getName());		
+		assertEquals(2, entityResource.getAttributeOverrides().size());
+	}
+	
+	public void testAttributeOverrideSetVirtual2() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+		
+		ListIterator<OrmVirtualAttributeOverride> virtualAttributeOverrides = overrideContainer.virtualOverrides();
+		virtualAttributeOverrides.next();
+		virtualAttributeOverrides.next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals("name", entityResource.getAttributeOverrides().get(0).getName());
+		assertEquals("id", entityResource.getAttributeOverrides().get(1).getName());		
+		assertEquals(2, entityResource.getAttributeOverrides().size());
+	}
+	
+	public void testAttributeOverrideSetVirtualTrue() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+				
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		assertEquals(3, entityResource.getAttributeOverrides().size());
+
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		
+		assertEquals("name", entityResource.getAttributeOverrides().get(0).getName());		
+		assertEquals("foo", entityResource.getAttributeOverrides().get(1).getName());
+		assertEquals(2, entityResource.getAttributeOverrides().size());
+		
+		Iterator<OrmAttributeOverride> attributeOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("name", attributeOverrides.next().getName());		
+		assertEquals("foo", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+	
+		
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		assertEquals("foo", entityResource.getAttributeOverrides().get(0).getName());		
+		assertEquals(1, entityResource.getAttributeOverrides().size());
+
+		attributeOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("foo", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+
+		
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		assertEquals(0, entityResource.getAttributeOverrides().size());
+		attributeOverrides = overrideContainer.specifiedOverrides();
+		assertFalse(attributeOverrides.hasNext());
+	}
+	
+	public void testMoveSpecifiedAttributeOverride() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(3, entityResource.getAttributeOverrides().size());
+		
+		
+		overrideContainer.moveSpecifiedOverride(2, 0);
+		ListIterator<OrmAttributeOverride> attributeOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("name", attributeOverrides.next().getName());
+		assertEquals("foo", attributeOverrides.next().getName());
+		assertEquals("id", attributeOverrides.next().getName());
+
+		assertEquals("name", entityResource.getAttributeOverrides().get(0).getName());
+		assertEquals("foo", entityResource.getAttributeOverrides().get(1).getName());
+		assertEquals("id", entityResource.getAttributeOverrides().get(2).getName());
+
+
+		overrideContainer.moveSpecifiedOverride(0, 1);
+		attributeOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("foo", attributeOverrides.next().getName());
+		assertEquals("name", attributeOverrides.next().getName());
+		assertEquals("id", attributeOverrides.next().getName());
+
+		assertEquals("foo", entityResource.getAttributeOverrides().get(0).getName());
+		assertEquals("name", entityResource.getAttributeOverrides().get(1).getName());
+		assertEquals("id", entityResource.getAttributeOverrides().get(2).getName());
+	}
+	
+	public void testUpdateSpecifiedAttributeOverrides() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+	
+		entityResource.getAttributeOverrides().add(0, OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		entityResource.getAttributeOverrides().get(0).setName("FOO");
+		entityResource.getAttributeOverrides().add(1, OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		entityResource.getAttributeOverrides().get(1).setName("BAR");
+		entityResource.getAttributeOverrides().add(2, OrmFactory.eINSTANCE.createXmlAttributeOverride());
+		entityResource.getAttributeOverrides().get(2).setName("BAZ");
+			
+		ListIterator<OrmAttributeOverride> attributeOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		entityResource.getAttributeOverrides().move(2, 0);
+		attributeOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+	
+		entityResource.getAttributeOverrides().move(0, 1);
+		attributeOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("BAR", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+	
+		entityResource.getAttributeOverrides().remove(1);
+		attributeOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertEquals("FOO", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+	
+		entityResource.getAttributeOverrides().remove(1);
+		attributeOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", attributeOverrides.next().getName());
+		assertFalse(attributeOverrides.hasNext());
+		
+		entityResource.getAttributeOverrides().remove(0);
+		attributeOverrides = overrideContainer.specifiedOverrides();
+		assertFalse(attributeOverrides.hasNext());
+	}
+
+	public void testAttributeOverrideIsVirtual() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAttributeOverrideContainer overrideContainer = ormEntity.getAttributeOverrideContainer();
+		
+		ListIterator<OrmVirtualAttributeOverride> virtualAttributeOverrides = overrideContainer.virtualOverrides();	
+		OrmVirtualAttributeOverride virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("name", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+		
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("foo", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+		assertFalse(virtualAttributeOverrides.hasNext());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		AttributeOverride specifiedAttributeOverride = overrideContainer.specifiedOverrides().next();
+		assertFalse(specifiedAttributeOverride.isVirtual());
+		
+		
+		virtualAttributeOverrides = overrideContainer.virtualOverrides();	
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("name", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+		
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("foo", virtualAttributeOverride.getName());
+		assertTrue(virtualAttributeOverride.isVirtual());
+		assertFalse(virtualAttributeOverrides.hasNext());
+	}
+
+	public void testOverridableAssociationNames() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		OrmEntity entity = (OrmEntity) ormPersistentType.getMapping();
+
+		Iterator<String> overridableAssociationNames = entity.overridableAssociationNames();
+		assertFalse(overridableAssociationNames.hasNext());
+	}
+	
+//	//TODO add all mapping types to the mapped superclass to test which ones are overridable
+	public void testAllOverridableAssociationNames() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+
+		Iterator<String> overridableAssociationNames = ormEntity.allOverridableAssociationNames();
+		assertEquals("address", overridableAssociationNames.next());
+		assertEquals("address2", overridableAssociationNames.next());
+		assertEquals("address3", overridableAssociationNames.next());
+		assertEquals("address4", overridableAssociationNames.next());
+		assertFalse(overridableAssociationNames.hasNext());
+	}
+	
+	public void testAllOverridableAssociations() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+	
+		Iterator<String> overridableAssociations = ormEntity.allOverridableAssociationNames();
+		assertEquals("address", overridableAssociations.next());
+		assertEquals("address2", overridableAssociations.next());
+		assertEquals("address3", overridableAssociations.next());
+		assertEquals("address4", overridableAssociations.next());
+		assertFalse(overridableAssociations.hasNext());
+	}
+
+	public void testSpecifiedAssociationOverrides() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+		
+		ListIterator<OrmAssociationOverride> specifiedAssociationOverrides = overrideContainer.specifiedOverrides();
+		
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+
+		//add an annotation to the resource model and verify the context model is updated
+		XmlAssociationOverride xmlAssociationOverride = OrmFactory.eINSTANCE.createXmlAssociationOverride();
+		entityResource.getAssociationOverrides().add(0, xmlAssociationOverride);
+		xmlAssociationOverride.setName("FOO");
+		specifiedAssociationOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+		xmlAssociationOverride = OrmFactory.eINSTANCE.createXmlAssociationOverride();
+		entityResource.getAssociationOverrides().add(1, xmlAssociationOverride);
+		xmlAssociationOverride.setName("BAR");
+		specifiedAssociationOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+
+		xmlAssociationOverride = OrmFactory.eINSTANCE.createXmlAssociationOverride();
+		entityResource.getAssociationOverrides().add(0, xmlAssociationOverride);
+		xmlAssociationOverride.setName("BAZ");
+		specifiedAssociationOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAssociationOverrides.next().getName());
+		assertEquals("FOO", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+	
+		//move an annotation to the resource model and verify the context model is updated
+		entityResource.getAssociationOverrides().move(1, 0);
+		specifiedAssociationOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("FOO", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAZ", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+		entityResource.getAssociationOverrides().remove(0);
+		specifiedAssociationOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("BAZ", specifiedAssociationOverrides.next().getName());
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+	
+		entityResource.getAssociationOverrides().remove(0);
+		specifiedAssociationOverrides = overrideContainer.specifiedOverrides();		
+		assertEquals("BAR", specifiedAssociationOverrides.next().getName());
+		assertFalse(specifiedAssociationOverrides.hasNext());
+
+		
+		entityResource.getAssociationOverrides().remove(0);
+		specifiedAssociationOverrides = overrideContainer.specifiedOverrides();		
+		assertFalse(specifiedAssociationOverrides.hasNext());
+	}
+
+	public void testDefaultAssociationOverrides() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		assertEquals(FULLY_QUALIFIED_SUB_TYPE_NAME, entityResource.getClassName());
+		assertTrue(entityResource.getAssociationOverrides().isEmpty());
+		
+		assertEquals(4, overrideContainer.virtualOverridesSize());
+		OrmVirtualAssociationOverride virtualAssociationOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("address", virtualAssociationOverride.getName());
+		
+//
+//		//MappedSuperclass mappedSuperclass = (MappedSuperclass) javaPersistentType().getMapping();
+//		//BasicMapping idMapping = (BasicMapping) mappedSuperclass.persistentType().attributeNamed("id").getMapping();
+//		//idMapping.getColumn().setSpecifiedName("FOO");
+//		//idMapping.getColumn().setSpecifiedTable("BAR");
+//		
+//		assertEquals(SUB_TYPE_NAME, entityResource.getName());
+//		assertNull(typeResource.getAnnotation(AssociationOverrideAnnotation.ANNOTATION_NAME));
+//		assertNull(typeResource.getAnnotation(AssociationOverridesAnnotation.ANNOTATION_NAME));
+
+		assertEquals(4, overrideContainer.virtualOverridesSize());
+		virtualAssociationOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("address", virtualAssociationOverride.getName());
+
+//		//idMapping.getColumn().setSpecifiedName(null);
+//		//idMapping.getColumn().setSpecifiedTable(null);
+//		assertEquals(SUB_TYPE_NAME, typeResource.getName());
+//		assertNull(typeResource.getAnnotation(AssociationOverrideAnnotation.ANNOTATION_NAME));
+//		assertNull(typeResource.getAnnotation(AssociationOverridesAnnotation.ANNOTATION_NAME));
+
+		virtualAssociationOverride = overrideContainer.virtualOverrides().next();
+		assertEquals("address", virtualAssociationOverride.getName());
+		
+		virtualAssociationOverride.convertToSpecified();
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		
+		
+		
+//		//TODO joinColumns for default association overrides
+////	IJoinColumn defaultJoinColumn = defaultAssociationOverride.joinColumns().next();
+////	assertEquals("address", defaultJoinColumn.getName());
+////	assertEquals("address", defaultJoinColumn.getReferencedColumnName());
+////	assertEquals(SUB_TYPE_NAME, defaultJoinColumn.getTable());
+////	
+////
+////	IMappedSuperclass mappedSuperclass = (IMappedSuperclass) javaPersistentType().getMapping();
+////	
+////	IOneToOneMapping addressMapping = (IOneToOneMapping) mappedSuperclass.persistentType().attributeNamed("address").getMapping();
+////	IJoinColumn joinColumn = addressMapping.addSpecifiedJoinColumn(0);
+////	joinColumn.setSpecifiedName("FOO");
+////	joinColumn.setSpecifiedReferencedColumnName("BAR");
+////	joinColumn.setSpecifiedTable("BAZ");
+////	
+////	assertEquals(SUB_TYPE_NAME, typeResource.getName());
+////	assertNull(typeResource.annotation(AssociationOverride.ANNOTATION_NAME));
+////	assertNull(typeResource.annotation(AssociationOverrides.ANNOTATION_NAME));
+////
+////	assertEquals(1, CollectionTools.size(javaEntity.defaultAssociationOverrides()));
+////	defaultAssociationOverride = javaEntity.defaultAssociationOverrides().next();
+////	assertEquals("address", defaultAssociationOverride.getName());
+////	assertEquals("FOO", defaultJoinColumn.getName());
+////	assertEquals("BAR", defaultJoinColumn.getReferencedColumnName());
+////	assertEquals("BAZ", defaultJoinColumn.getTable());
+////
+////	joinColumn.setSpecifiedName(null);
+////	joinColumn.setSpecifiedReferencedColumnName(null);
+////	joinColumn.setSpecifiedTable(null);
+////	assertEquals(SUB_TYPE_NAME, typeResource.getName());
+////	assertNull(typeResource.annotation(AssociationOverride.ANNOTATION_NAME));
+////	assertNull(typeResource.annotation(AssociationOverrides.ANNOTATION_NAME));
+////
+////	defaultAssociationOverride = javaEntity.defaultAssociationOverrides().next();
+////	assertEquals("address", defaultJoinColumn.getName());
+////	assertEquals("address", defaultJoinColumn.getReferencedColumnName());
+////	assertEquals(SUB_TYPE_NAME, defaultJoinColumn.getTable());
+////	
+////	javaEntity.addSpecifiedAssociationOverride(0).setName("address");
+////	assertEquals(0, CollectionTools.size(javaEntity.defaultAssociationOverrides()));
+
+	}
+	
+	public void testSpecifiedAssociationOverridesSize() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals(0, overrideContainer.specifiedOverridesSize());
+
+		//add to the resource model and verify the context model is updated
+		entityResource.getAssociationOverrides().add(OrmFactory.eINSTANCE.createXmlAssociationOverride());
+		entityResource.getAssociationOverrides().get(0).setName("FOO");
+		entityResource.getAssociationOverrides().add(0, OrmFactory.eINSTANCE.createXmlAssociationOverride());
+		entityResource.getAssociationOverrides().get(0).setName("BAR");
+
+		assertEquals(2, overrideContainer.specifiedOverridesSize());
+	}
+	
+	public void testDefaultAssociationOverridesSize() throws Exception {		
+		createTestMappedSuperclass();
+		createTestSubType();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+		
+		assertEquals(4, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(3, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(2, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(1, overrideContainer.virtualOverridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(0, overrideContainer.virtualOverridesSize());
+	}
+	
+	public void testAssociationOverridesSize() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+		
+		assertEquals(4, overrideContainer.overridesSize());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(4, overrideContainer.overridesSize());
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		assertEquals(4, overrideContainer.overridesSize());
+		
+		
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		entityResource.getAssociationOverrides().add(0, OrmFactory.eINSTANCE.createXmlAssociationOverride());
+		entityResource.getAssociationOverrides().get(0).setName("bar");
+		assertEquals(5, overrideContainer.overridesSize());
+	}
+
+	public void testAssociationOverrideSetVirtual() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		AssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+				
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals("address", entityResource.getAssociationOverrides().get(0).getName());
+		assertEquals("address2", entityResource.getAssociationOverrides().get(1).getName());
+		assertEquals(2, entityResource.getAssociationOverrides().size());
+	}
+	
+	public void testAssociationOverrideSetVirtual2() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+		
+		ListIterator<OrmVirtualAssociationOverride> virtualAssociationOverrides = overrideContainer.virtualOverrides();
+		virtualAssociationOverrides.next();
+		virtualAssociationOverrides.next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		
+		assertEquals("address2", entityResource.getAssociationOverrides().get(0).getName());
+		assertEquals("address", entityResource.getAssociationOverrides().get(1).getName());
+		assertEquals(2, entityResource.getAssociationOverrides().size());
+	}
+	
+	public void testAssociationOverrideSetVirtualTrue() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+				
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		assertEquals(2, entityResource.getAssociationOverrides().size());
+
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		
+		assertEquals("address2", entityResource.getAssociationOverrides().get(0).getName());
+		assertEquals(1, entityResource.getAssociationOverrides().size());
+
+		Iterator<OrmAssociationOverride> associationOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("address2", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+
+		
+		overrideContainer.specifiedOverrides().next().convertToVirtual();
+		assertEquals(0, entityResource.getAssociationOverrides().size());
+		associationOverrides = overrideContainer.specifiedOverrides();
+		assertFalse(associationOverrides.hasNext());
+	}
+	
+	public void testMoveSpecifiedAssociationOverride() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+		
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		assertEquals(2, entityResource.getAssociationOverrides().size());
+		
+		
+		overrideContainer.moveSpecifiedOverride(1, 0);
+		ListIterator<OrmAssociationOverride> associationOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("address2", associationOverrides.next().getName());
+		assertEquals("address", associationOverrides.next().getName());
+
+		assertEquals("address2", entityResource.getAssociationOverrides().get(0).getName());
+		assertEquals("address", entityResource.getAssociationOverrides().get(1).getName());
+
+
+		overrideContainer.moveSpecifiedOverride(0, 1);
+		associationOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("address", associationOverrides.next().getName());
+		assertEquals("address2", associationOverrides.next().getName());
+
+		assertEquals("address", entityResource.getAssociationOverrides().get(0).getName());
+		assertEquals("address2", entityResource.getAssociationOverrides().get(1).getName());
+	}
+
+	public void testUpdateSpecifiedAssociationOverrides() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		
+		entityResource.getAssociationOverrides().add(0, OrmFactory.eINSTANCE.createXmlAssociationOverride());
+		entityResource.getAssociationOverrides().get(0).setName("FOO");
+		entityResource.getAssociationOverrides().add(1, OrmFactory.eINSTANCE.createXmlAssociationOverride());
+		entityResource.getAssociationOverrides().get(1).setName("BAR");
+		entityResource.getAssociationOverrides().add(2, OrmFactory.eINSTANCE.createXmlAssociationOverride());
+		entityResource.getAssociationOverrides().get(2).setName("BAZ");
+			
+		ListIterator<OrmAssociationOverride> associationOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("FOO", associationOverrides.next().getName());
+		assertEquals("BAR", associationOverrides.next().getName());
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+		
+		entityResource.getAssociationOverrides().move(2, 0);
+		associationOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("BAR", associationOverrides.next().getName());
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertEquals("FOO", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+	
+		entityResource.getAssociationOverrides().move(0, 1);
+		associationOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertEquals("BAR", associationOverrides.next().getName());
+		assertEquals("FOO", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+	
+		entityResource.getAssociationOverrides().remove(1);
+		associationOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertEquals("FOO", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+	
+		entityResource.getAssociationOverrides().remove(1);
+		associationOverrides = overrideContainer.specifiedOverrides();
+		assertEquals("BAZ", associationOverrides.next().getName());
+		assertFalse(associationOverrides.hasNext());
+		
+		entityResource.getAssociationOverrides().remove(0);
+		associationOverrides = overrideContainer.specifiedOverrides();
+		assertFalse(associationOverrides.hasNext());
+	}
+
+	public void testAssociationOverrideIsVirtual() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "test.AnnotationTestTypeChild");
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEntity ormEntity = (OrmEntity) ormPersistentType.getMapping();
+		OrmAssociationOverrideContainer overrideContainer = ormEntity.getAssociationOverrideContainer();
+		
+		ListIterator<OrmVirtualAssociationOverride> virtualAssociationOverrides = overrideContainer.virtualOverrides();	
+		OrmVirtualAssociationOverride virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address2", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address3", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address4", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		assertFalse(virtualAssociationOverrides.hasNext());
+
+		overrideContainer.virtualOverrides().next().convertToSpecified();
+		AssociationOverride specifiedAssociationOverride = overrideContainer.specifiedOverrides().next();
+		assertFalse(specifiedAssociationOverride.isVirtual());
+		
+		
+		virtualAssociationOverrides = overrideContainer.virtualOverrides();	
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address2", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address3", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		
+		virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address4", virtualAssociationOverride.getName());
+		assertTrue(virtualAssociationOverride.isVirtual());
+		assertFalse(virtualAssociationOverrides.hasNext());
+	}
+
+	public void testNestedVirtualAttributeOverrides() throws Exception {
+		createTestMappedSuperclassCustomer();
+		createTestEntityLongTimeCustomer();
+		createTestEmbeddableAddress();
+		createTestEmbeddableZipCode();
+		
+		OrmPersistentType customerPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Customer");
+		OrmPersistentType longTimeCustomerPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".LongTimeCustomer");
+		OrmPersistentType addressPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		OrmPersistentType zipCodePersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".ZipCode");
+
+		OrmAttributeOverrideContainer attributeOverrideContainer = ((OrmEntity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		
+		assertEquals(6, attributeOverrideContainer.virtualOverridesSize());
+		ListIterator<OrmVirtualAttributeOverride> virtualAttributeOverrides = attributeOverrideContainer.virtualOverrides();
+		OrmVirtualAttributeOverride virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("name", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.street", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.city", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.zipCode.zip", virtualAttributeOverride.getName());
+		assertEquals("zip", virtualAttributeOverride.getColumn().getName());
+		assertEquals("LongTimeCustomer", virtualAttributeOverride.getColumn().getTable());		
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("plusfour", virtualAttributeOverride.getColumn().getName());
+		assertEquals("LongTimeCustomer", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals(null, virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(true, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(255, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(0, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, virtualAttributeOverride.getColumn().getScale());
+
+		
+		zipCodePersistentType.getAttributeNamed("plusfour").convertToSpecified();
+		BasicMapping plusFourMapping = (BasicMapping) zipCodePersistentType.getAttributeNamed("plusfour").getMapping();
+		plusFourMapping.getColumn().setSpecifiedName("BLAH");
+		plusFourMapping.getColumn().setSpecifiedTable("BLAH_TABLE");
+		plusFourMapping.getColumn().setColumnDefinition("COLUMN_DEFINITION");
+		plusFourMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		plusFourMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		plusFourMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		plusFourMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+
+		attributeOverrideContainer = ((OrmEntity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		//check the top-level embedded (Customer.address) attribute override to verify it is getting settings from the specified column on Zipcode.plusfour
+		virtualAttributeOverride = (OrmVirtualAttributeOverride) attributeOverrideContainer.getOverrideNamed("address.zipCode.plusfour");
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("BLAH", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BLAH_TABLE", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals("COLUMN_DEFINITION", virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(false, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(5, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(6, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, virtualAttributeOverride.getColumn().getScale());
+		
+		//set an attribute override on Address.zipCode embedded mapping
+		addressPersistentType.getAttributeNamed("zipCode").convertToSpecified();
+		AttributeOverride specifiedAttributeOverride = ((VirtualAttributeOverride) ((EmbeddedMapping) addressPersistentType.getAttributeNamed("zipCode").getMapping()).getAttributeOverrideContainer().getOverrideNamed("plusfour")).convertToSpecified();
+		specifiedAttributeOverride.getColumn().setSpecifiedName("BLAH_OVERRIDE");
+		specifiedAttributeOverride.getColumn().setSpecifiedTable("BLAH_TABLE_OVERRIDE");
+		specifiedAttributeOverride.getColumn().setColumnDefinition("COLUMN_DEFINITION_OVERRIDE");
+
+
+		attributeOverrideContainer = ((OrmEntity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		virtualAttributeOverride = (OrmVirtualAttributeOverride) attributeOverrideContainer.getOverrideNamed("address.zipCode.plusfour");
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("BLAH_OVERRIDE", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BLAH_TABLE_OVERRIDE", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals("COLUMN_DEFINITION_OVERRIDE", virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(true, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(255, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(0, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, virtualAttributeOverride.getColumn().getScale());
+		
+		specifiedAttributeOverride = virtualAttributeOverride.convertToSpecified();
+		assertEquals(false, specifiedAttributeOverride.isVirtual());
+		assertEquals("address.zipCode.plusfour", specifiedAttributeOverride.getName());
+		//TODO I have the default wrong in this case, but this was wrong before as well.  Need to fix this later
+//		assertEquals("plusfour", specifiedAttributeOverride.getColumn().getDefaultName());
+		assertEquals("BLAH_OVERRIDE", specifiedAttributeOverride.getColumn().getSpecifiedName());
+//		assertEquals("Customer", specifiedAttributeOverride.getColumn().getDefaultTable());	
+		assertEquals("BLAH_TABLE_OVERRIDE", specifiedAttributeOverride.getColumn().getSpecifiedTable());	
+		assertEquals("COLUMN_DEFINITION_OVERRIDE", specifiedAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, specifiedAttributeOverride.getColumn().isUnique());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isNullable());
+		assertEquals(255, specifiedAttributeOverride.getColumn().getLength());
+		assertEquals(0, specifiedAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, specifiedAttributeOverride.getColumn().getScale());
+	}
+
+	public void testNestedVirtualAttributeOverridesElementCollection() throws Exception {
+		createTestMappedSuperclassCustomerWithElementCollection();
+		createTestEntityLongTimeCustomer();
+		createTestEmbeddableAddress();
+		createTestEmbeddableZipCode();
+		
+		OrmPersistentType customerPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Customer");
+		OrmPersistentType longTimeCustomerPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".LongTimeCustomer");
+		OrmPersistentType addressPersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		OrmPersistentType zipCodePersistentType = getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".ZipCode");
+
+		customerPersistentType.getJavaPersistentType().getAttributeNamed("address").setMappingKey(MappingKeys2_0.ELEMENT_COLLECTION_ATTRIBUTE_MAPPING_KEY);
+		OrmAttributeOverrideContainer attributeOverrideContainer = ((OrmEntity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		
+		assertEquals(6, attributeOverrideContainer.virtualOverridesSize());
+		ListIterator<OrmVirtualAttributeOverride> virtualAttributeOverrides = attributeOverrideContainer.virtualOverrides();
+		OrmVirtualAttributeOverride virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("id", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("name", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.street", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.city", virtualAttributeOverride.getName());
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.zipCode.zip", virtualAttributeOverride.getName());
+		assertEquals("zip", virtualAttributeOverride.getColumn().getName());
+		assertEquals("LongTimeCustomer", virtualAttributeOverride.getColumn().getTable());		
+		virtualAttributeOverride = virtualAttributeOverrides.next();
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("plusfour", virtualAttributeOverride.getColumn().getName());
+		assertEquals("LongTimeCustomer", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals(null, virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(true, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(255, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(0, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, virtualAttributeOverride.getColumn().getScale());
+
+		
+		zipCodePersistentType.getAttributeNamed("plusfour").convertToSpecified();
+		BasicMapping plusFourMapping = (BasicMapping) zipCodePersistentType.getAttributeNamed("plusfour").getMapping();
+		plusFourMapping.getColumn().setSpecifiedName("BLAH");
+		plusFourMapping.getColumn().setSpecifiedTable("BLAH_TABLE");
+		plusFourMapping.getColumn().setColumnDefinition("COLUMN_DEFINITION");
+		plusFourMapping.getColumn().setSpecifiedInsertable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedUpdatable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedUnique(Boolean.TRUE);
+		plusFourMapping.getColumn().setSpecifiedNullable(Boolean.FALSE);
+		plusFourMapping.getColumn().setSpecifiedLength(Integer.valueOf(5));
+		plusFourMapping.getColumn().setSpecifiedPrecision(Integer.valueOf(6));
+		plusFourMapping.getColumn().setSpecifiedScale(Integer.valueOf(7));
+
+		attributeOverrideContainer = ((OrmEntity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		//check the top-level embedded (Customer.address) attribute override to verify it is getting settings from the specified column on Zipcode.plusfour
+		virtualAttributeOverride = (OrmVirtualAttributeOverride) attributeOverrideContainer.getOverrideNamed("address.zipCode.plusfour");
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("BLAH", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BLAH_TABLE", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals("COLUMN_DEFINITION", virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(false, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(false, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(5, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(6, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(7, virtualAttributeOverride.getColumn().getScale());
+		
+		//set an attribute override on Address.zipCode embedded mapping
+		addressPersistentType.getAttributeNamed("zipCode").convertToSpecified();
+		AttributeOverride specifiedAttributeOverride = ((VirtualAttributeOverride) ((EmbeddedMapping) addressPersistentType.getAttributeNamed("zipCode").getMapping()).getAttributeOverrideContainer().getOverrideNamed("plusfour")).convertToSpecified();
+		specifiedAttributeOverride.getColumn().setSpecifiedName("BLAH_OVERRIDE");
+		specifiedAttributeOverride.getColumn().setSpecifiedTable("BLAH_TABLE_OVERRIDE");
+		specifiedAttributeOverride.getColumn().setColumnDefinition("COLUMN_DEFINITION_OVERRIDE");
+
+
+		attributeOverrideContainer = ((OrmEntity) longTimeCustomerPersistentType.getMapping()).getAttributeOverrideContainer();
+		virtualAttributeOverride = (OrmVirtualAttributeOverride) attributeOverrideContainer.getOverrideNamed("address.zipCode.plusfour");
+		assertEquals("address.zipCode.plusfour", virtualAttributeOverride.getName());
+		assertEquals("BLAH_OVERRIDE", virtualAttributeOverride.getColumn().getName());
+		assertEquals("BLAH_TABLE_OVERRIDE", virtualAttributeOverride.getColumn().getTable());	
+		assertEquals("COLUMN_DEFINITION_OVERRIDE", virtualAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, virtualAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, virtualAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, virtualAttributeOverride.getColumn().isUnique());
+		assertEquals(true, virtualAttributeOverride.getColumn().isNullable());
+		assertEquals(255, virtualAttributeOverride.getColumn().getLength());
+		assertEquals(0, virtualAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, virtualAttributeOverride.getColumn().getScale());
+		
+		specifiedAttributeOverride = virtualAttributeOverride.convertToSpecified();
+		assertEquals(false, specifiedAttributeOverride.isVirtual());
+		assertEquals("address.zipCode.plusfour", specifiedAttributeOverride.getName());
+		//TODO I have the default wrong in this case, but this was wrong before as well.  Need to fix this later
+//		assertEquals("plusfour", specifiedAttributeOverride.getColumn().getDefaultName());
+		assertEquals("BLAH_OVERRIDE", specifiedAttributeOverride.getColumn().getSpecifiedName());
+//		assertEquals("Customer", specifiedAttributeOverride.getColumn().getDefaultTable());	
+		assertEquals("BLAH_TABLE_OVERRIDE", specifiedAttributeOverride.getColumn().getSpecifiedTable());	
+		assertEquals("COLUMN_DEFINITION_OVERRIDE", specifiedAttributeOverride.getColumn().getColumnDefinition());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isInsertable());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isUpdatable());
+		assertEquals(false, specifiedAttributeOverride.getColumn().isUnique());
+		assertEquals(true, specifiedAttributeOverride.getColumn().isNullable());
+		assertEquals(255, specifiedAttributeOverride.getColumn().getLength());
+		assertEquals(0, specifiedAttributeOverride.getColumn().getPrecision());
+		assertEquals(0, specifiedAttributeOverride.getColumn().getScale());
+	}
+	public void testNestedVirtualAssociationOverrides() throws Exception {
+		createTestMappedSuperclassCustomer();
+		createTestEntityLongTimeCustomer();
+		createTestEmbeddableAddress();
+		createTestEmbeddableZipCode();
+		
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Customer");
+		OrmPersistentType longTimeCustomerPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".LongTimeCustomer");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".ZipCode");
+
+		OrmAssociationOverrideContainer attributeOverrideContainer = ((OrmEntity) longTimeCustomerPersistentType.getMapping()).getAssociationOverrideContainer();
+		
+		assertEquals(1, attributeOverrideContainer.virtualOverridesSize());
+		ListIterator<OrmVirtualAssociationOverride> virtualAssociationOverrides = attributeOverrideContainer.virtualOverrides();
+		OrmVirtualAssociationOverride virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address.state", virtualAssociationOverride.getName());
+	}
+
+	public void testNestedVirtualAssociationOverridesElementCollection() throws Exception {
+		createTestMappedSuperclassCustomerWithElementCollection();
+		createTestEntityLongTimeCustomer();
+		createTestEmbeddableAddress();
+		createTestEmbeddableZipCode();
+		
+		getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Customer");
+		OrmPersistentType longTimeCustomerPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".LongTimeCustomer");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".ZipCode");
+
+		OrmAssociationOverrideContainer attributeOverrideContainer = ((OrmEntity) longTimeCustomerPersistentType.getMapping()).getAssociationOverrideContainer();
+		
+		assertEquals(1, attributeOverrideContainer.virtualOverridesSize());
+		ListIterator<OrmVirtualAssociationOverride> virtualAssociationOverrides = attributeOverrideContainer.virtualOverrides();
+		OrmVirtualAssociationOverride virtualAssociationOverride = virtualAssociationOverrides.next();
+		assertEquals("address.state", virtualAssociationOverride.getName());
+	}
+	
+	public void testSetSpecifiedCacheable() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable2_0 = ((CacheableHolder2_0) ormPersistentType.getMapping()).getCacheable();
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		assertEquals(null, cacheable2_0.getSpecifiedCacheable());
+		assertEquals(null, entityResource.getCacheable());
+		
+		cacheable2_0.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, cacheable2_0.getSpecifiedCacheable());
+		assertEquals(Boolean.FALSE, entityResource.getCacheable());
+		
+		cacheable2_0.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, cacheable2_0.getSpecifiedCacheable());
+		assertEquals(Boolean.TRUE, entityResource.getCacheable());
+		
+		cacheable2_0.setSpecifiedCacheable(null);
+		assertEquals(null, cacheable2_0.getSpecifiedCacheable());
+		assertEquals(null, entityResource.getCacheable());
+	}
+	
+	public void testGetSpecifiedCacheable() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) ormPersistentType.getMapping()).getCacheable();
+		XmlEntity entityResource = getXmlEntityMappings().getEntities().get(0);
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, entityResource.getCacheable());
+		
+		entityResource.setCacheable(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.TRUE, entityResource.getCacheable());
+
+		entityResource.setCacheable(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.FALSE, entityResource.getCacheable());
+		
+		entityResource.setCacheable(null);
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, entityResource.getCacheable());
+	}
+	
+	public void testIsDefaultCacheable() throws Exception {
+		createTestEntity();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) ormPersistentType.getMapping()).getCacheable();
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		assertEquals(SharedCacheMode.DISABLE_SELECTIVE, persistenceUnit2_0.getSharedCacheMode());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ALL);
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.UNSPECIFIED);
+		assertEquals(true, cacheable.isDefaultCacheable());
+	}
+	
+	public void testIsDefaultCacheableFromSuperType() throws Exception {
+		createTestEntity();
+		createTestSubType();
+		OrmPersistentType subOrmPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_SUB_TYPE_NAME);
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEntity subEntity = (EclipseLinkEntity) subOrmPersistentType.getMapping();
+		EclipseLinkEntity entity = (EclipseLinkEntity) ormPersistentType.getMapping();
+		Cacheable2_0 subCacheable = ((CacheableHolder2_0) subEntity).getCacheable();
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) entity).getCacheable();
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(null);
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+				
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		cacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	}
+	
+	public void testIsDefaultCacheableFromJava() throws Exception {
+		createTestEntity();
+		createTestSubType();
+		OrmPersistentType subOrmPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_SUB_TYPE_NAME);
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 subCacheable = ((CacheableHolder2_0) subOrmPersistentType.getMapping()).getCacheable();
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) ormPersistentType.getMapping()).getCacheable();
+		
+		Cacheable2_0 javaCacheable = ((CacheableHolder2_0) ormPersistentType.getJavaPersistentType().getMapping()).getCacheable();
+		javaCacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+				
+		javaCacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		javaCacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		javaCacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+	}
+	
+	public void testIsDefaultCacheableFromMappedSuperClass() throws Exception {
+		createTestMappedSuperclass();
+		createTestSubType();
+		OrmPersistentType subOrmPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_SUB_TYPE_NAME);
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkEntity subEntity = (EclipseLinkEntity) subOrmPersistentType.getMapping();
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		Cacheable2_0 subCacheable = ((CacheableHolder2_0) subEntity).getCacheable();
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) mappedSuperclass).getCacheable();
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(null);
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+				
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		cacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmManyToManyMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmManyToManyMappingTests.java
new file mode 100644
index 0000000..c41b1c3
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmManyToManyMappingTests.java
@@ -0,0 +1,963 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.Column;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.ManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyColumn;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManyToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cascade2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrderColumn2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.Orderable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaManyToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmManyToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlManyToMany;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkManyToManyMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0OrmManyToManyMappingTests
+	extends EclipseLink2_0OrmContextModelTestCase
+{
+	public EclipseLink2_0OrmManyToManyMappingTests(String name) {
+		super(name);
+	}
+	
+
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+				sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	private void createTestTargetEntityAddressWithElementCollection() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ELEMENT_COLLECTION);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);
+				sb.append("    private java.util.Collection<State> state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+	
+	private ICompilationUnit createTestEntityWithValidManyToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);				
+				sb.append("    private java.util.Collection<Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithValidMapManyToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);				
+				sb.append("    private java.util.Map<String, Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithValidNonGenericMapManyToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);				
+				sb.append("    private java.util.Map addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}	
+	
+	private void createTestEmbeddableState() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("State").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter);
+	}
+	
+	private ICompilationUnit createTestEntityManyToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_MANY, JPA.FETCH_TYPE, JPA.CASCADE_TYPE, JPA.ORDER_BY, EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToMany(fetch=FetchType.EAGER, targetEntity=Address.class, cascade={CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH})");
+				sb.append(CR);
+				sb.append("    @OrderBy(\"city\"");
+				sb.append(CR);
+				sb.append("    @JoinFetch(JoinFetchType.INNER)");
+				sb.append(CR);
+				sb.append("    private java.util.Collection<Address> address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}
+
+	public void testCandidateMappedByAttributeNames() throws Exception {
+		createTestEntityWithValidManyToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "addresses");
+
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ReadOnlyPersistentAttribute persistentAttribute = ormPersistentType.attributes().next();
+		ManyToManyMapping manyToManyMapping = (ManyToManyMapping) persistentAttribute.getMapping();
+
+		Iterator<String> attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		manyToManyMapping.setSpecifiedTargetEntity("foo");
+		attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertFalse(attributeNames.hasNext());
+		
+		manyToManyMapping.setSpecifiedTargetEntity(null);
+		attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		AttributeMapping stateFooMapping = manyToManyMapping.getResolvedTargetEntity().resolveAttributeMapping("state.foo");
+		assertEquals("foo", stateFooMapping.getName());
+	}
+	
+	public void testCandidateMappedByAttributeNamesElementCollection() throws Exception {
+		createTestEntityWithValidManyToManyMapping();
+		createTestTargetEntityAddressWithElementCollection();
+		createTestEmbeddableState();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "addresses");
+
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ReadOnlyPersistentAttribute persistentAttribute = ormPersistentType.attributes().next();
+		ManyToManyMapping manyToManyMapping = (ManyToManyMapping) persistentAttribute.getMapping();
+
+		Iterator<String> attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		manyToManyMapping.setSpecifiedTargetEntity("foo");
+		attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertFalse(attributeNames.hasNext());
+		
+		manyToManyMapping.setSpecifiedTargetEntity(null);
+		attributeNames = 
+			manyToManyMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		AttributeMapping stateFooMapping = manyToManyMapping.getResolvedTargetEntity().resolveAttributeMapping("state.foo");
+		assertEquals("foo", stateFooMapping.getName());
+	}
+	
+	public void testUpdateMapKey() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "manyToManyMapping");
+		OrmManyToManyMapping ormManyToManyMapping = (OrmManyToManyMapping) ormPersistentAttribute.getMapping();
+		XmlManyToMany manyToMany = getXmlEntityMappings().getEntities().get(0).getAttributes().getManyToManys().get(0);
+		
+		assertNull(ormManyToManyMapping.getSpecifiedMapKey());
+		assertNull(manyToMany.getMapKey());
+		
+		//set mapKey in the resource model, verify context model does not change
+		manyToMany.setMapKey(OrmFactory.eINSTANCE.createMapKey());
+		assertNull(ormManyToManyMapping.getSpecifiedMapKey());
+		assertNotNull(manyToMany.getMapKey());
+				
+		//set mapKey name in the resource model, verify context model updated
+		manyToMany.getMapKey().setName("myMapKey");
+		assertEquals("myMapKey", ormManyToManyMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", manyToMany.getMapKey().getName());
+		
+		//set mapKey name to null in the resource model
+		manyToMany.getMapKey().setName(null);
+		assertNull(ormManyToManyMapping.getSpecifiedMapKey());
+		assertNull(manyToMany.getMapKey().getName());
+		
+		manyToMany.getMapKey().setName("myMapKey");
+		manyToMany.setMapKey(null);
+		assertNull(ormManyToManyMapping.getSpecifiedMapKey());
+		assertNull(manyToMany.getMapKey());
+	}
+	
+	public void testUpdateVirtualMapKey() throws Exception {
+		createTestEntityWithValidMapManyToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+
+		ManyToManyMapping virtualManyToManyMapping = (ManyToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaManyToManyMapping javaManyToManyMapping = (JavaManyToManyMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		assertNull(virtualManyToManyMapping.getSpecifiedMapKey());
+		assertNull(virtualManyToManyMapping.getMapKey());
+		assertFalse(virtualManyToManyMapping.isPkMapKey());
+		assertFalse(virtualManyToManyMapping.isCustomMapKey());
+		assertTrue(virtualManyToManyMapping.isNoMapKey());
+		
+		//set pk mapKey in the java, verify virtual orm mapping updates
+		javaManyToManyMapping.setPkMapKey(true);
+		assertEquals("id", virtualManyToManyMapping.getMapKey());
+		assertTrue(virtualManyToManyMapping.isPkMapKey());
+		assertFalse(virtualManyToManyMapping.isCustomMapKey());
+		assertFalse(virtualManyToManyMapping.isNoMapKey());
+		
+		
+		//set custom specified mapKey in the java, verify virtual orm mapping updates
+		javaManyToManyMapping.setCustomMapKey(true);
+		javaManyToManyMapping.setSpecifiedMapKey("city");
+		assertEquals("city", virtualManyToManyMapping.getSpecifiedMapKey());
+		assertEquals("city", virtualManyToManyMapping.getMapKey());
+		assertFalse(virtualManyToManyMapping.isPkMapKey());
+		assertTrue(virtualManyToManyMapping.isCustomMapKey());
+		assertFalse(virtualManyToManyMapping.isNoMapKey());
+	}
+	
+	public void testModifyMapKey() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "manyToManyMapping");
+		OrmManyToManyMapping ormManyToManyMapping = (OrmManyToManyMapping) ormPersistentAttribute.getMapping();
+		XmlManyToMany manyToMany = getXmlEntityMappings().getEntities().get(0).getAttributes().getManyToManys().get(0);
+		
+		assertNull(ormManyToManyMapping.getSpecifiedMapKey());
+		assertNull(manyToMany.getMapKey());
+					
+		//set mapKey  in the context model, verify resource model updated
+		ormManyToManyMapping.setSpecifiedMapKey("myMapKey");
+		assertEquals("myMapKey", ormManyToManyMapping.getSpecifiedMapKey());
+		assertEquals("myMapKey", manyToMany.getMapKey().getName());
+	
+		//set mapKey to null in the context model
+		ormManyToManyMapping.setSpecifiedMapKey(null);
+		assertNull(ormManyToManyMapping.getSpecifiedMapKey());
+		assertNull(manyToMany.getMapKey().getName());
+	}
+
+	public void testCandidateMapKeyNames() throws Exception {
+		createTestEntityWithValidMapManyToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		
+		ManyToManyMapping virtualManyToManyMapping = (ManyToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = 
+			virtualManyToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.foo", mapKeyNames.next());
+		assertEquals("state.address", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+	}
+	
+	public void testCandidateMapKeyNames2() throws Exception {
+		createTestEntityWithValidNonGenericMapManyToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		
+		ManyToManyMapping virtualManyToManyMapping = (ManyToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaManyToManyMapping javaManyToManyMapping = (JavaManyToManyMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = virtualManyToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		javaManyToManyMapping.setSpecifiedTargetEntity("test.Address");
+		mapKeyNames = virtualManyToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.foo", mapKeyNames.next());
+		assertEquals("state.address", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		ormPersistentType.getAttributeNamed("addresses").convertToSpecified();
+		OrmManyToManyMapping specifiedManyToManyMapping = (OrmManyToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		mapKeyNames = specifiedManyToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		specifiedManyToManyMapping.setSpecifiedTargetEntity("test.Address");
+		mapKeyNames = specifiedManyToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.foo", mapKeyNames.next());
+		assertEquals("state.address", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		specifiedManyToManyMapping.setSpecifiedTargetEntity("String");
+		mapKeyNames = specifiedManyToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+	}
+	
+	public void testUpdateMapKeyClass() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "manyToManyMapping");
+		OrmManyToManyMapping2_0 ormManyToManyMapping = (OrmManyToManyMapping2_0) ormPersistentAttribute.getMapping();
+		XmlManyToMany manyToMany = getXmlEntityMappings().getEntities().get(0).getAttributes().getManyToManys().get(0);
+		
+		assertNull(ormManyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(manyToMany.getMapKeyClass());
+		
+		//set mapKey in the resource model, verify context model does not change
+		manyToMany.setMapKeyClass(OrmFactory.eINSTANCE.createXmlClassReference());
+		assertNull(ormManyToManyMapping.getSpecifiedMapKeyClass());
+		assertNotNull(manyToMany.getMapKeyClass());
+				
+		//set mapKey name in the resource model, verify context model updated
+		manyToMany.getMapKeyClass().setClassName("String");
+		assertEquals("String", ormManyToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("String", manyToMany.getMapKeyClass().getClassName());
+		
+		//set mapKey name to null in the resource model
+		manyToMany.getMapKeyClass().setClassName(null);
+		assertNull(ormManyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(manyToMany.getMapKeyClass().getClassName());
+		
+		manyToMany.getMapKeyClass().setClassName("String");
+		manyToMany.setMapKeyClass(null);
+		assertNull(ormManyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(manyToMany.getMapKeyClass());
+	}
+	
+	public void testUpdateVirtualMapKeyClass() throws Exception {
+		createTestEntityWithValidMapManyToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+
+		ManyToManyMapping2_0 virtualManyToManyMapping = (ManyToManyMapping2_0) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaManyToManyMapping2_0 javaManyToManyMapping = (JavaManyToManyMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		assertEquals("java.lang.String", virtualManyToManyMapping.getMapKeyClass());
+		assertNull(virtualManyToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("java.lang.String", virtualManyToManyMapping.getDefaultMapKeyClass());
+		
+		//set pk mapKey in the java, verify virtual orm mapping updates
+		javaManyToManyMapping.setSpecifiedMapKeyClass("Integer");
+		assertEquals("Integer", virtualManyToManyMapping.getMapKeyClass());
+		assertEquals("Integer", virtualManyToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("java.lang.String", virtualManyToManyMapping.getDefaultMapKeyClass());
+	}
+	
+	public void testModifyMapKeyClass() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "manyToManyMapping");
+		OrmManyToManyMapping2_0 ormManyToManyMapping = (OrmManyToManyMapping2_0) ormPersistentAttribute.getMapping();
+		XmlManyToMany manyToMany = getXmlEntityMappings().getEntities().get(0).getAttributes().getManyToManys().get(0);
+		
+		assertNull(ormManyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(manyToMany.getMapKeyClass());
+					
+		//set mapKey  in the context model, verify resource model updated
+		ormManyToManyMapping.setSpecifiedMapKeyClass("String");
+		assertEquals("String", ormManyToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("String", manyToMany.getMapKeyClass().getClassName());
+	
+		//set mapKey to null in the context model
+		ormManyToManyMapping.setSpecifiedMapKeyClass(null);
+		assertNull(ormManyToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(manyToMany.getMapKeyClass());
+	}
+
+	public void testOrderColumnDefaults() throws Exception {
+		createTestEntityPrintQueue();
+		createTestEntityPrintJob();
+
+		OrmPersistentType printQueuePersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".PrintQueue");
+		OrmPersistentAttribute jobsPersistentAttribute = printQueuePersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "jobs");
+		OrmManyToManyMapping jobsMapping = (OrmManyToManyMapping) jobsPersistentAttribute.getMapping();
+		jobsMapping.getRelationship().setStrategyToMappedBy();
+		jobsMapping.getRelationship().getMappedByStrategy().setMappedByAttribute("queues");
+
+		OrmPersistentType printJobPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".PrintJob");
+		OrmPersistentAttribute queuesPersistentAttribute = printJobPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "queues");
+		OrmManyToManyMapping queuesMapping = (OrmManyToManyMapping) queuesPersistentAttribute.getMapping();
+
+		getOrmXmlResource().save(null);
+		Orderable2_0 jobsOrderable = ((Orderable2_0) jobsMapping.getOrderable());
+		OrderColumn2_0 jobsOrderColumn = jobsOrderable.getOrderColumn();
+		assertEquals(false, jobsOrderable.isOrderColumnOrdering());
+		assertEquals(true, jobsOrderable.isNoOrdering());
+		Orderable2_0 queuesOrderable = ((Orderable2_0) queuesMapping.getOrderable());
+		OrderColumn2_0 queuesOrderColumn = queuesOrderable.getOrderColumn();
+		assertEquals(false, queuesOrderable.isOrderColumnOrdering());
+		assertEquals(true, queuesOrderable.isNoOrdering());
+
+		
+		jobsOrderable.setOrderColumnOrdering(true);
+		jobsOrderColumn = jobsOrderable.getOrderColumn();
+		assertEquals(true, jobsOrderable.isOrderColumnOrdering());
+		assertEquals(null, jobsOrderColumn.getSpecifiedName());
+		assertEquals("jobs_ORDER", jobsOrderColumn.getDefaultName());
+		assertEquals("PrintJob_PrintQueue", jobsOrderColumn.getTable());
+		queuesOrderable.setOrderColumnOrdering(true);
+		queuesOrderColumn = queuesOrderable.getOrderColumn();
+		assertEquals(true, queuesOrderable.isOrderColumnOrdering());
+		assertEquals(null, queuesOrderColumn.getSpecifiedName());
+		assertEquals("queues_ORDER", queuesOrderColumn.getDefaultName());
+		assertEquals("PrintJob_PrintQueue", queuesOrderColumn.getTable());
+		
+		jobsOrderColumn.setSpecifiedName("FOO");
+		assertEquals("FOO", jobsOrderColumn.getSpecifiedName());
+		assertEquals("jobs_ORDER", jobsOrderColumn.getDefaultName());
+		assertEquals("PrintJob_PrintQueue", jobsOrderColumn.getTable());
+		queuesOrderColumn.setSpecifiedName("BAR");
+		assertEquals("BAR", queuesOrderColumn.getSpecifiedName());
+		assertEquals("queues_ORDER", queuesOrderColumn.getDefaultName());
+		assertEquals("PrintJob_PrintQueue", queuesOrderColumn.getTable());
+		
+		
+		((Entity) printJobPersistentType.getMapping()).getTable().setSpecifiedName("MY_TABLE");
+		assertEquals("MY_TABLE_PrintQueue", jobsOrderColumn.getTable());
+		assertEquals("MY_TABLE_PrintQueue", queuesOrderColumn.getTable());
+		
+		((Entity) printQueuePersistentType.getMapping()).getTable().setSpecifiedName("OTHER_TABLE");
+		assertEquals("MY_TABLE_OTHER_TABLE", jobsOrderColumn.getTable());
+		assertEquals("MY_TABLE_OTHER_TABLE", queuesOrderColumn.getTable());
+		
+		queuesMapping.getRelationship().getJoinTableStrategy().getJoinTable().setSpecifiedName("MY_JOIN_TABLE");
+		assertEquals("MY_JOIN_TABLE", jobsOrderColumn.getTable());
+		assertEquals("MY_JOIN_TABLE", queuesOrderColumn.getTable());
+	}
+	
+	public void testVirtualOrderColumn() throws Exception {
+		createTestEntityPrintQueue();
+		createTestEntityPrintJob();
+
+		OrmPersistentType printQueuePersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".PrintQueue");
+		OrmPersistentAttribute jobsPersistentAttribute = printQueuePersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "jobs");
+		OrmManyToManyMapping jobsMapping = (OrmManyToManyMapping) jobsPersistentAttribute.getMapping();
+
+		OrmPersistentType printJobPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".PrintJob");
+		OrmPersistentAttribute queuesPersistentAttribute = printJobPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "queues");
+		OrmManyToManyMapping queuesMapping = (OrmManyToManyMapping) queuesPersistentAttribute.getMapping();
+
+		Orderable2_0 jobsOrderable = ((Orderable2_0) jobsMapping.getOrderable());
+		assertEquals(false, jobsOrderable.isOrderColumnOrdering());
+		assertEquals(true, jobsOrderable.isNoOrdering());
+		Orderable2_0 queuesOrderable = ((Orderable2_0) queuesMapping.getOrderable());
+		assertEquals(false, queuesOrderable.isOrderColumnOrdering());
+		assertEquals(true, queuesOrderable.isNoOrdering());
+		
+		JavaManyToManyMapping javaJobsManyToManyMapping = (JavaManyToManyMapping) jobsPersistentAttribute.getJavaPersistentAttribute().getMapping();
+		((Orderable2_0) javaJobsManyToManyMapping.getOrderable()).setOrderColumnOrdering(true);
+				
+		assertEquals(false, jobsOrderable.isOrderColumnOrdering());
+		assertEquals(true, jobsOrderable.isNoOrdering());
+		assertEquals(false, queuesOrderable.isOrderColumnOrdering());
+		assertEquals(true, queuesOrderable.isNoOrdering());
+
+		jobsPersistentAttribute.convertToVirtual();		
+		OrmReadOnlyPersistentAttribute jobsPersistentAttribute2 = printQueuePersistentType.getAttributeNamed("jobs");
+		ManyToManyMapping virtualJobsMapping = (ManyToManyMapping) jobsPersistentAttribute2.getMapping();
+		jobsOrderable = ((Orderable2_0) virtualJobsMapping.getOrderable());
+		assertEquals(true, jobsOrderable.isOrderColumnOrdering());
+		assertEquals(false, jobsOrderable.isNoOrdering());
+		assertEquals("PrintJob_PrintQueue", jobsOrderable.getOrderColumn().getTable());
+		assertEquals("jobs_ORDER", jobsOrderable.getOrderColumn().getName());
+		queuesPersistentAttribute.convertToVirtual();		
+		OrmReadOnlyPersistentAttribute queuesPersistentAttribute2 = printJobPersistentType.getAttributeNamed("queues");
+		ManyToManyMapping virtualQueuesMapping = (ManyToManyMapping) queuesPersistentAttribute2.getMapping();
+		queuesOrderable = ((Orderable2_0) virtualQueuesMapping.getOrderable());
+		assertEquals(true, queuesOrderable.isOrderColumnOrdering());
+		assertEquals(false, queuesOrderable.isNoOrdering());
+		assertEquals("PrintJob_PrintQueue", queuesOrderable.getOrderColumn().getTable());
+		assertEquals("queues_ORDER", queuesOrderable.getOrderColumn().getName());
+		
+		((Orderable2_0) javaJobsManyToManyMapping.getOrderable()).getOrderColumn().setSpecifiedName("FOO");
+		assertEquals("PrintJob_PrintQueue", jobsOrderable.getOrderColumn().getTable());
+		assertEquals("FOO", jobsOrderable.getOrderColumn().getName());
+		assertEquals("PrintJob_PrintQueue", queuesOrderable.getOrderColumn().getTable());
+		assertEquals("queues_ORDER", queuesOrderable.getOrderColumn().getName());
+		
+		JavaManyToManyMapping javaQueuesManyToManyMapping = (JavaManyToManyMapping) queuesPersistentAttribute2.getJavaPersistentAttribute().getMapping();
+		javaQueuesManyToManyMapping.getRelationship().getJoinTableStrategy().getJoinTable().setSpecifiedName("JOIN_TABLE");
+		assertEquals("JOIN_TABLE", jobsOrderable.getOrderColumn().getTable());
+		assertEquals("FOO", jobsOrderable.getOrderColumn().getName());
+		assertEquals("JOIN_TABLE", queuesOrderable.getOrderColumn().getTable());
+		assertEquals("queues_ORDER", queuesOrderable.getOrderColumn().getName());
+	}
+	
+	private void createTestEntityPrintQueue() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MANY_TO_MANY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ORDER_COLUMN);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PrintQueue").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany(mappedBy=\"queues\")").append(CR);
+				sb.append("    @OrderColumn").append(CR);
+				sb.append("    private java.util.List<test.PrintJob> jobs;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PrintQueue.java", sourceWriter);
+	}
+	
+	private void createTestEntityPrintJob() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MANY_TO_MANY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ORDER_COLUMN);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PrintJob").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToMany").append(CR);
+				sb.append("    @OrderColumn").append(CR);
+				sb.append("    private java.util.List<test.PrintQueue> queues;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PrintJob.java", sourceWriter);
+	}
+
+	public void testVirtualMapKeyColumnDefaults() throws Exception {
+		createTestEntityWithValidMapManyToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		//virtual attribute in orm.xml, java attribute has no value Column annotation
+		OrmReadOnlyPersistentAttribute addressesPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ManyToManyMapping2_0 addressesVirtualMapping = (ManyToManyMapping2_0) addressesPersistentAttribute.getMapping();		
+		Column virtualColumn = addressesVirtualMapping.getMapKeyColumn();
+		assertEquals("addresses_KEY", virtualColumn.getName());
+		assertEquals(TYPE_NAME + "_Address", virtualColumn.getTable());
+		assertEquals(null, virtualColumn.getColumnDefinition());
+		assertTrue(virtualColumn.isInsertable());
+		assertTrue(virtualColumn.isUpdatable());
+		assertTrue(virtualColumn.isNullable());
+		assertFalse(virtualColumn.isUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, virtualColumn.getLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, virtualColumn.getPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, virtualColumn.getScale());
+
+		//set Column annotation in Java
+		JavaManyToManyMapping2_0 javaManyToManyMapping = (JavaManyToManyMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedName("FOO");		
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedTable("FOO_TABLE");
+		javaManyToManyMapping.getMapKeyColumn().setColumnDefinition("COLUMN_DEFINITION");
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedInsertable(Boolean.FALSE);	
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedUpdatable(Boolean.FALSE);	
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedNullable(Boolean.FALSE);	
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedUnique(Boolean.TRUE);	
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedLength(Integer.valueOf(45));
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedPrecision(Integer.valueOf(46));
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedScale(Integer.valueOf(47));
+
+		assertEquals("FOO", virtualColumn.getSpecifiedName());
+		assertEquals("FOO_TABLE", virtualColumn.getSpecifiedTable());
+		assertEquals("COLUMN_DEFINITION", virtualColumn.getColumnDefinition());
+		assertEquals(Boolean.FALSE, virtualColumn.getSpecifiedInsertable());
+		assertEquals(Boolean.FALSE, virtualColumn.getSpecifiedUpdatable());
+		assertEquals(Boolean.FALSE, virtualColumn.getSpecifiedNullable());
+		assertEquals(Boolean.TRUE, virtualColumn.getSpecifiedUnique());
+		assertEquals(Integer.valueOf(45), virtualColumn.getSpecifiedLength());
+		assertEquals(Integer.valueOf(46), virtualColumn.getSpecifiedPrecision());
+		assertEquals(Integer.valueOf(47), virtualColumn.getSpecifiedScale());
+
+
+		//set metadata-complete, orm.xml virtual column ignores java column annotation
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		addressesPersistentAttribute = ormPersistentType.getAttributeNamed("addresses");
+		//becomes a 1-m by default
+		OneToManyMapping2_0 addressesMapping = (OneToManyMapping2_0) addressesPersistentAttribute.getMapping();		
+		virtualColumn = addressesMapping.getMapKeyColumn();
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, addressesPersistentAttribute.getMappingKey());
+
+		assertEquals("addresses_KEY", virtualColumn.getName());
+		assertEquals(TYPE_NAME + "_Address", virtualColumn.getTable());
+		assertEquals(null, virtualColumn.getColumnDefinition());
+		assertTrue(virtualColumn.isInsertable());
+		assertTrue(virtualColumn.isUpdatable());
+		assertTrue(virtualColumn.isNullable());
+		assertFalse(virtualColumn.isUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, virtualColumn.getLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, virtualColumn.getPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, virtualColumn.getScale());
+	}
+	
+	public void testNullMapKeyColumnDefaults() throws Exception {
+		createTestEntityWithValidMapManyToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		OrmPersistentAttribute addressesPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "addresses");
+
+		OrmManyToManyMapping2_0 addressesVirtualMapping = (OrmManyToManyMapping2_0) addressesPersistentAttribute.getMapping();		
+		Column ormColumn = addressesVirtualMapping.getMapKeyColumn();
+
+		//set Column annotation in Java
+		JavaManyToManyMapping2_0 javaManyToManyMapping = (JavaManyToManyMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedName("FOO");		
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedTable("FOO_TABLE");
+		javaManyToManyMapping.getMapKeyColumn().setColumnDefinition("COLUMN_DEFINITION");
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedInsertable(Boolean.FALSE);	
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedUpdatable(Boolean.FALSE);	
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedNullable(Boolean.FALSE);	
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedUnique(Boolean.TRUE);	
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedLength(Integer.valueOf(45));
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedPrecision(Integer.valueOf(46));
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedScale(Integer.valueOf(47));
+
+
+		assertEquals("addresses_KEY", ormColumn.getDefaultName());
+		assertEquals(TYPE_NAME + "_Address", ormColumn.getDefaultTable());
+		assertEquals(true, ormColumn.isDefaultInsertable());
+		assertEquals(true, ormColumn.isDefaultUpdatable());
+		assertEquals(true, ormColumn.isDefaultNullable());
+		assertEquals(false, ormColumn.isDefaultUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, ormColumn.getDefaultLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, ormColumn.getDefaultPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, ormColumn.getDefaultScale());
+		assertNull(ormColumn.getSpecifiedName());
+		assertNull(ormColumn.getSpecifiedTable());
+		assertNull(ormColumn.getColumnDefinition());
+		assertNull(ormColumn.getSpecifiedInsertable());
+		assertNull(ormColumn.getSpecifiedUpdatable());
+		assertNull(ormColumn.getSpecifiedNullable());
+		assertNull(ormColumn.getSpecifiedUnique());
+		assertNull(ormColumn.getSpecifiedLength());
+		assertNull(ormColumn.getSpecifiedPrecision());
+		assertNull(ormColumn.getSpecifiedScale());
+	}
+
+	public void testVirtualMapKeyColumnTable() throws Exception {
+		createTestEntityWithValidMapManyToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		//virtual attribute in orm.xml, java attribute has no Column annotation
+		OrmReadOnlyPersistentAttribute addressesPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		ManyToManyMapping2_0 addressesVirtualMapping = (ManyToManyMapping2_0) addressesPersistentAttribute.getMapping();	
+		Column ormColumn = addressesVirtualMapping.getMapKeyColumn();
+
+		assertEquals(TYPE_NAME + "_Address", ormColumn.getTable());
+
+		//entity table changes the join table default name
+		((OrmEntity) ormPersistentType.getMapping()).getTable().setSpecifiedName("ORM_TABLE");
+		assertEquals("ORM_TABLE_Address", ormColumn.getTable());
+
+		//set Column table element in Java
+		JavaManyToManyMapping2_0 javaManyToManyMapping = (JavaManyToManyMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaManyToManyMapping.getRelationship().getJoinTableStrategy().getJoinTable().setSpecifiedName("JAVA_JOIN_TABLE");
+		assertEquals("JAVA_JOIN_TABLE", ormColumn.getTable());
+		javaManyToManyMapping.getMapKeyColumn().setSpecifiedTable("JAVA_TABLE");	
+		assertEquals("JAVA_TABLE", ormColumn.getTable());
+
+		//make name persistent attribute not virtual
+		addressesPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY, "addresses");
+		addressesVirtualMapping = (OrmManyToManyMapping2_0) addressesPersistentAttribute.getMapping();	
+		ormColumn = addressesVirtualMapping.getMapKeyColumn();
+		assertNull(ormColumn.getSpecifiedTable());
+		assertEquals("ORM_TABLE_Address", ormColumn.getDefaultTable());
+	}
+
+	public void testVirtualMappingMetadataCompleteFalse() throws Exception {
+		createTestEntityManyToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.virtualAttributes().next();
+
+		ManyToManyMapping virtualManyToManyMapping = (ManyToManyMapping) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualManyToManyMapping.getName());
+		assertEquals(FetchType.EAGER, virtualManyToManyMapping.getSpecifiedFetch());
+		assertEquals("Address", virtualManyToManyMapping.getSpecifiedTargetEntity());
+		assertNull(virtualManyToManyMapping.getRelationship().
+			getMappedByStrategy().getMappedByAttribute());
+
+		Cascade2_0 cascade = (Cascade2_0) virtualManyToManyMapping.getCascade();
+		assertTrue(cascade.isAll());
+		assertTrue(cascade.isMerge());
+		assertTrue(cascade.isPersist());
+		assertTrue(cascade.isRemove());
+		assertTrue(cascade.isRefresh());
+		assertTrue(cascade.isDetach());
+
+		assertTrue(virtualManyToManyMapping.getOrderable().isCustomOrdering());
+		assertEquals("city", virtualManyToManyMapping.getOrderable().getSpecifiedOrderBy());
+
+		assertEquals(EclipseLinkJoinFetchType.INNER, ((EclipseLinkJoinFetchMapping) virtualManyToManyMapping).getJoinFetch().getValue());
+	}
+
+	public void testVirtualMappingMetadataCompleteTrue() throws Exception {
+		createTestEntityManyToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, virtualPersistentAttribute.getMappingKey());
+		assertTrue(virtualPersistentAttribute.isVirtual());
+
+		virtualPersistentAttribute.convertToSpecified(MappingKeys.MANY_TO_MANY_ATTRIBUTE_MAPPING_KEY);
+		OrmPersistentAttribute ormPersistentAttribute= ormPersistentType.specifiedAttributes().next();
+
+		OrmEclipseLinkManyToManyMapping ormManyToManyMapping = (OrmEclipseLinkManyToManyMapping) ormPersistentAttribute.getMapping();	
+		assertEquals("address", ormManyToManyMapping.getName());
+		assertEquals(FetchType.LAZY, ormManyToManyMapping.getFetch());
+		assertEquals("test.Address", ormManyToManyMapping.getTargetEntity());
+		assertNull(ormManyToManyMapping.getRelationship().getMappedByStrategy().getMappedByAttribute());
+
+		Cascade2_0 cascade = (Cascade2_0) ormManyToManyMapping.getCascade();
+		assertFalse(cascade.isAll());
+		assertFalse(cascade.isMerge());
+		assertFalse(cascade.isPersist());
+		assertFalse(cascade.isRemove());
+		assertFalse(cascade.isRefresh());
+		assertFalse(cascade.isDetach());
+
+		assertTrue(ormManyToManyMapping.getOrderable().isNoOrdering());
+		assertEquals(null, ormManyToManyMapping.getOrderable().getSpecifiedOrderBy());
+
+		assertEquals(null, ormManyToManyMapping.getJoinFetch().getValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmMappedSuperclassTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmMappedSuperclassTests.java
new file mode 100644
index 0000000..aa99ba0
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmMappedSuperclassTests.java
@@ -0,0 +1,2375 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import java.util.Iterator;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cacheable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.CacheableHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.PersistenceUnit2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.SharedCacheMode;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCacheCoordinationType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCacheType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCaching;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkExistenceType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkMappedSuperclass;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkCaching;
+import org.eclipse.jpt.jpa.eclipselink.core.context.java.JavaEclipseLinkMappedSuperclass;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkConverterContainer;
+import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkMappedSuperclass;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlChangeTrackingType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlMappedSuperclass;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlObjectTypeConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlStructConverter;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTypeConverter;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0OrmMappedSuperclassTests extends EclipseLink2_0OrmContextModelTestCase
+{
+	protected static final String SUB_TYPE_NAME = "AnnotationTestTypeChild";
+	protected static final String FULLY_QUALIFIED_SUB_TYPE_NAME = PACKAGE_NAME + "." + SUB_TYPE_NAME;
+
+	public EclipseLink2_0OrmMappedSuperclassTests(String name) {
+		super(name);
+	}
+	
+	
+	private ICompilationUnit createTestMappedSuperclassForReadOnly() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.READ_ONLY);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclassForCustomizer() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.CUSTOMIZER);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclassForChangeTracking() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS, EclipseLink.CHANGE_TRACKING);
+			}
+			
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestMappedSuperclass() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+
+	private void createTestMappedSuperclassSubType() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MAPPED_SUPERCLASS);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@MappedSuperclass");
+				sb.append(CR);
+				sb.append("public class ").append("AnnotationTestTypeChild").append(" ");
+				sb.append("extends " + TYPE_NAME + " ");
+				sb.append("{}").append(CR);
+			}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "AnnotationTestTypeChild.java", sourceWriter);
+	}
+
+	private ICompilationUnit createTestMappedSuperclassForConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestMappedSuperclassForTypeConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestMappedSuperclassForObjectTypeConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+
+	private ICompilationUnit createTestMappedSuperclassForStructConverters() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.MAPPED_SUPERCLASS);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@MappedSuperclass").append(CR);
+			}
+		});
+	}
+	
+	public void testUpdateReadOnly() throws Exception {
+		createTestMappedSuperclassForReadOnly();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkMappedSuperclass javaContextMappedSuperclass = (JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to false, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to true, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// clear xml read only, set java read only to true, check defaults
+		
+		resourceMappedSuperclass.setReadOnly(null);
+		javaContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(Boolean.TRUE);
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertTrue(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertTrue(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+
+		// set xml read only to false, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getReadOnly());
+		assertTrue(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to true, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getReadOnly());
+		assertTrue(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// clear xml read only, set java read only to false, check defaults
+		
+		resourceMappedSuperclass.setReadOnly(null);
+		javaContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(Boolean.FALSE);
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to false, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set xml read only to true, check override
+		
+		resourceMappedSuperclass.setReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(javaContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+	}
+	
+	public void testModifyReadOnly() throws Exception {
+		createTestMappedSuperclassForReadOnly();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set context read only to true, check resource
+		
+		ormContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getReadOnly());
+		assertTrue(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.TRUE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set context read only to false, check resource
+		
+		ormContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertEquals(Boolean.FALSE, ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());
+		
+		// set context read only to null, check resource
+		
+		ormContextMappedSuperclass.getReadOnly().setSpecifiedReadOnly(null);
+		
+		assertNull(resourceMappedSuperclass.getReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isReadOnly());
+		assertFalse(ormContextMappedSuperclass.getReadOnly().isDefaultReadOnly());
+		assertNull(ormContextMappedSuperclass.getReadOnly().getSpecifiedReadOnly());	
+	}
+	
+	public void testUpdateCustomizerClass() throws Exception {
+		createTestMappedSuperclassForCustomizer();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkMappedSuperclass javaContextMappedSuperclass = (JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getCustomizer());
+		assertNull(javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// set xml customizer, check defaults
+		resourceMappedSuperclass.setCustomizer(OrmFactory.eINSTANCE.createXmlClassReference());
+		assertNull(resourceMappedSuperclass.getCustomizer().getClassName());
+		assertNull(javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+		
+		// set xml customizer class, check override
+		
+		resourceMappedSuperclass.getCustomizer().setClassName("foo");
+		
+		assertEquals("foo", resourceMappedSuperclass.getCustomizer().getClassName());
+		assertNull(javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// clear xml customizer class, set java customizer class, check defaults
+		
+		resourceMappedSuperclass.getCustomizer().setClassName(null);
+		javaContextMappedSuperclass.getCustomizer().setSpecifiedCustomizerClass("bar");
+		
+		assertNull(resourceMappedSuperclass.getCustomizer().getClassName());
+		assertEquals("bar", javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceMappedSuperclass.getCustomizer().getClassName());
+		assertEquals("bar", javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		// set xml customizer class, check override
+		
+		resourceMappedSuperclass.getCustomizer().setClassName("foo");
+		
+		assertEquals("foo", resourceMappedSuperclass.getCustomizer().getClassName());
+		assertEquals("bar", javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertEquals("bar", ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+		//set xml customizer null
+		javaContextMappedSuperclass.getCustomizer().setSpecifiedCustomizerClass(null);
+		resourceMappedSuperclass.setCustomizer(null);
+		assertNull(resourceMappedSuperclass.getCustomizer());
+		assertNull(javaContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+
+	}
+	
+	public void testModifyCustomizerClass() throws Exception {
+		createTestMappedSuperclassForCustomizer();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getCustomizer());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+		
+		// set context customizer, check resource
+		
+		ormContextMappedSuperclass.getCustomizer().setSpecifiedCustomizerClass("foo");
+		
+		assertEquals("foo", resourceMappedSuperclass.getCustomizer().getClassName());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertEquals("foo", ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+				
+		// set context customizer to null, check resource
+		
+		ormContextMappedSuperclass.getCustomizer().setSpecifiedCustomizerClass(null);
+		
+		assertNull(resourceMappedSuperclass.getCustomizer());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getDefaultCustomizerClass());
+		assertNull(ormContextMappedSuperclass.getCustomizer().getSpecifiedCustomizerClass());
+	}
+	
+	public void testUpdateChangeTracking() throws Exception {
+		createTestMappedSuperclassForChangeTracking();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkMappedSuperclass javaContextMappedSuperclass = (JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to ATTRIBUTE, check context
+		
+		resourceMappedSuperclass.setChangeTracking(EclipseLinkOrmFactory.eINSTANCE.createXmlChangeTracking());
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(XmlChangeTrackingType.ATTRIBUTE, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to OBJECT, check context
+		
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to DEFERRED, check context
+		
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.DEFERRED);
+		
+		assertEquals(XmlChangeTrackingType.DEFERRED, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set xml type to AUTO, check context
+		
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.AUTO);
+		
+		assertEquals(XmlChangeTrackingType.AUTO, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// clear xml change tracking, set java change tracking, check defaults
+		
+		resourceMappedSuperclass.setChangeTracking(null);
+		javaContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// unset metadataComplete, set xml change tracking to OBJECT, check context
+		
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		resourceMappedSuperclass.setChangeTracking(EclipseLinkOrmFactory.eINSTANCE.createXmlChangeTracking());
+		resourceMappedSuperclass.getChangeTracking().setType(XmlChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, javaContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+	}
+	
+	public void testModifyChangeTracking() throws Exception  {
+		createTestMappedSuperclassForChangeTracking();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+		
+		// set context change tracking to ATTRIBUTE, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.ATTRIBUTE);
+		
+		assertEquals(XmlChangeTrackingType.ATTRIBUTE, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.ATTRIBUTE, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to OBJECT, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.OBJECT);
+		
+		assertEquals(XmlChangeTrackingType.OBJECT, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.OBJECT, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to DEFERRED, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.DEFERRED);
+		
+		assertEquals(XmlChangeTrackingType.DEFERRED, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.DEFERRED, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to AUTO, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(EclipseLinkChangeTrackingType.AUTO);
+		
+		assertEquals(XmlChangeTrackingType.AUTO, resourceMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+				
+		// set context change tracking to null, check resource
+		
+		ormContextMappedSuperclass.getChangeTracking().setSpecifiedType(null);
+		
+		assertNull(resourceMappedSuperclass.getChangeTracking());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getType());
+		assertEquals(EclipseLinkChangeTrackingType.AUTO, ormContextMappedSuperclass.getChangeTracking().getDefaultType());
+		assertNull(ormContextMappedSuperclass.getChangeTracking().getSpecifiedType());
+	}
+	
+	public void testUpdateCacheType() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+
+		
+		// set xml cache type, check settings
+		resourceMappedSuperclass.getCache().setType(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.FULL);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.FULL, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getSpecifiedType());
+
+			
+		// set java cache type, check defaults
+		
+		javaContextCaching.setSpecifiedType(EclipseLinkCacheType.WEAK);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.FULL, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(EclipseLinkCacheType.FULL, ormContextCaching.getSpecifiedType());
+
+		// clear xml cache type, check defaults
+		resourceMappedSuperclass.getCache().setType(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.WEAK, javaContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyCacheType() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+		
+		// set context cache type, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedType(EclipseLinkCacheType.HARD_WEAK);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheType.HARD_WEAK, resourceMappedSuperclass.getCache().getType());
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(EclipseLinkCacheType.HARD_WEAK, ormContextCaching.getSpecifiedType());
+				
+		// set context customizer to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedType(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getType());
+		assertEquals(EclipseLinkCacheType.SOFT_WEAK, ormContextCaching.getDefaultType());
+		assertEquals(null, ormContextCaching.getSpecifiedType());
+	}
+
+	public void testUpdateCacheCoordinationType() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+
+		
+		// set xml cache type, check settings
+		resourceMappedSuperclass.getCache().setCoordinationType(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getSpecifiedCoordinationType());
+
+			
+		// set java cache type, check defaults
+		
+		javaContextCaching.setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.INVALIDATE_CHANGED_OBJECTS, ormContextCaching.getSpecifiedCoordinationType());
+
+		// clear xml cache type, check defaults
+		resourceMappedSuperclass.getCache().setCoordinationType(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, javaContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyCacheCoordinationType() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+		
+		// set context cache coordination type, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedCoordinationType(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, resourceMappedSuperclass.getCache().getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES, ormContextCaching.getSpecifiedCoordinationType());
+				
+		// set context coordination type to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedCoordinationType(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getCoordinationType());
+		assertEquals(EclipseLinkCacheCoordinationType.SEND_OBJECT_CHANGES, ormContextCaching.getDefaultCoordinationType());
+		assertEquals(null, ormContextCaching.getSpecifiedCoordinationType());
+	}
+
+	
+	public void testUpdateCacheSize() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass xmlMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, xmlMappedSuperclass.getCache());
+		assertEquals(100, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+		
+		// set xml cache, check defaults
+		xmlMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, xmlMappedSuperclass.getCache().getSize());
+		assertEquals(100, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+
+		
+		// set xml cache size, check settings
+		xmlMappedSuperclass.getCache().setSize(new Integer(105));
+		assertEquals(new Integer(105), xmlMappedSuperclass.getCache().getSize());
+		assertEquals(100, javaContextCaching.getSize());
+		assertEquals(105, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(new Integer(105), ormContextCaching.getSpecifiedSize());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedSize(new Integer(50));
+		
+		assertEquals(new Integer(105), xmlMappedSuperclass.getCache().getSize());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(105, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(new Integer(105), ormContextCaching.getSpecifiedSize());
+
+		// clear xml cache size, check defaults
+		xmlMappedSuperclass.getCache().setSize(null);
+
+		assertEquals(null, xmlMappedSuperclass.getCache().getSize());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+	
+		
+		// clear xml cache, check defaults
+		xmlMappedSuperclass.setCache(null);
+
+		assertEquals(null, xmlMappedSuperclass.getCache());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(50, ormContextCaching.getSize());
+		assertEquals(50, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, xmlMappedSuperclass.getCache());
+		assertEquals(50, javaContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyCacheSize() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedSize(new Integer(50));
+		assertEquals(new Integer(50), resourceMappedSuperclass.getCache().getSize());
+		assertEquals(50, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(new Integer(50), ormContextCaching.getSpecifiedSize());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedSize(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(100, ormContextCaching.getSize());
+		assertEquals(100, ormContextCaching.getDefaultSize());
+		assertEquals(null, ormContextCaching.getSpecifiedSize());
+	}
+
+	public void testUpdateCacheAlwaysRefresh() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(false, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		
+		// set xml cache always refresh, check settings
+		resourceMappedSuperclass.getCache().setAlwaysRefresh(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(false, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+			
+		// set java cache always refresh, check defaults
+		
+		javaContextCaching.setSpecifiedAlwaysRefresh(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		// set xml cache always refresh to false
+		resourceMappedSuperclass.getCache().setAlwaysRefresh(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		// clear xml cache always refresh, check defaults
+		resourceMappedSuperclass.getCache().setAlwaysRefresh(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	}
+	
+	public void testModifyCacheAlwaysRefresh() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedAlwaysRefresh(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getAlwaysRefresh());
+		assertEquals(true, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedAlwaysRefresh());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedAlwaysRefresh(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isAlwaysRefresh());
+		assertEquals(false, ormContextCaching.isDefaultAlwaysRefresh());
+		assertEquals(null, ormContextCaching.getSpecifiedAlwaysRefresh());
+	}
+	
+	public void testUpdateCacheRefreshOnlyIfNewer() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(false, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		
+		// set xml cache size, check settings
+		resourceMappedSuperclass.getCache().setRefreshOnlyIfNewer(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(false, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedRefreshOnlyIfNewer(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		// set xml cache always refresh to false
+		resourceMappedSuperclass.getCache().setRefreshOnlyIfNewer(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		// clear xml cache always refresh, check defaults
+		resourceMappedSuperclass.getCache().setRefreshOnlyIfNewer(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	}
+	
+	public void testModifyCacheRefreshOnlyIfNewer() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedRefreshOnlyIfNewer(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getRefreshOnlyIfNewer());
+		assertEquals(true, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedRefreshOnlyIfNewer(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isRefreshOnlyIfNewer());
+		assertEquals(false, ormContextCaching.isDefaultRefreshOnlyIfNewer());
+		assertEquals(null, ormContextCaching.getSpecifiedRefreshOnlyIfNewer());
+	}
+	
+	public void testUpdateCacheDisableHits() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(false, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+
+		
+		// set xml cache size, check settings
+		resourceMappedSuperclass.getCache().setDisableHits(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(false, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedDisableHits());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedDisableHits(Boolean.TRUE);
+		
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedDisableHits());
+
+		// set xml cache always refresh to false
+		resourceMappedSuperclass.getCache().setDisableHits(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedDisableHits());
+
+		// clear xml cache always refresh, check defaults
+		resourceMappedSuperclass.getCache().setDisableHits(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(true, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	}
+	
+	public void testModifyCacheDisableHits() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedDisableHits(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getDisableHits());
+		assertEquals(true, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedDisableHits());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedDisableHits(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, ormContextCaching.isDisableHits());
+		assertEquals(false, ormContextCaching.isDefaultDisableHits());
+		assertEquals(null, ormContextCaching.getSpecifiedDisableHits());
+	}
+	
+	public void testUpdateCacheShared() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+		
+		// set xml cache, check defaults
+		resourceMappedSuperclass.setCache(EclipseLinkOrmFactory.eINSTANCE.createXmlCache());
+		assertEquals(null, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(true, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+
+		
+		// set xml cache size, check settings
+		resourceMappedSuperclass.getCache().setShared(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(true, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedShared());
+
+			
+		// set java cache size, check defaults
+		
+		javaContextCaching.setSpecifiedShared(Boolean.FALSE);
+		
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedShared());
+
+		// set xml cache always refresh to false
+		resourceMappedSuperclass.getCache().setShared(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.TRUE, ormContextCaching.getSpecifiedShared());
+
+		// clear xml cache always refresh, check defaults
+		resourceMappedSuperclass.getCache().setShared(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	
+		
+		// clear xml cache, check defaults
+		resourceMappedSuperclass.setCache(null);
+
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+
+		
+		// set metadataComplete back to null, check defaults from java
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(false, javaContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(false, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	}
+	
+	public void testModifyCacheShared() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+		
+		// set context cache size, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedShared(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMappedSuperclass.getCache().getShared());
+		assertEquals(false, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(Boolean.FALSE, ormContextCaching.getSpecifiedShared());
+				
+		// set context cache size to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedShared(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getCache());
+		assertEquals(true, ormContextCaching.isShared());
+		assertEquals(true, ormContextCaching.isDefaultShared());
+		assertEquals(null, ormContextCaching.getSpecifiedShared());
+	}
+	
+	public void testUpdateExistenceChecking() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		JavaEclipseLinkCaching javaContextCaching = ((JavaEclipseLinkMappedSuperclass) ormPersistentType.getJavaPersistentType().getMapping()).getCaching();
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+
+
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+		
+		// set xml existence checking, check settings
+		resourceMappedSuperclass.setExistenceChecking(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+
+			
+		// set java cache existence checking, check defaults
+		
+		javaContextCaching.setSpecifiedExistenceType(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE);
+		
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+
+		// clear xml existence checking, check defaults
+		resourceMappedSuperclass.setExistenceChecking(null);
+
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());	
+		
+		// set metadataComplete to True, check defaults not from java
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(Boolean.TRUE);
+		
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_NON_EXISTENCE, javaContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+
+		ormContextMappedSuperclass.setSpecifiedMetadataComplete(null);
+	}
+	
+	public void testModifyExistenceChecking() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		EclipseLinkCaching ormContextCaching = ormContextMappedSuperclass.getCaching();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		// check defaults
+		
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+		
+		// set context cache existence checking, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedExistenceType(EclipseLinkExistenceType.ASSUME_EXISTENCE);
+		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.ExistenceType.ASSUME_EXISTENCE, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(EclipseLinkExistenceType.ASSUME_EXISTENCE, ormContextCaching.getSpecifiedExistenceType());
+				
+		// set context existence checking to null, check resource
+		
+		ormContextMappedSuperclass.getCaching().setSpecifiedExistenceType(null);
+		
+		assertEquals(null, resourceMappedSuperclass.getExistenceChecking());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getExistenceType());
+		assertEquals(EclipseLinkExistenceType.CHECK_DATABASE, ormContextCaching.getDefaultExistenceType());
+		assertEquals(null, ormContextCaching.getSpecifiedExistenceType());
+	}
+	public void testUpdateCustomConverters() throws Exception {
+		createTestMappedSuperclassForConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlConverter resourceConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceMappedSuperclass.getConverters().add(resourceConverter);
+		resourceConverter.setClassName("Foo");
+		resourceConverter.setName("myConverter");
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlConverter resourceConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
+		resourceMappedSuperclass.getConverters().add(0, resourceConverter2);
+		resourceConverter2.setClassName("Foo2");
+		resourceConverter2.setName("myConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceMappedSuperclass.getConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getConverters().remove(resourceConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyCustomConverters() throws Exception {
+		createTestMappedSuperclassForConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter.setConverterClass("Foo");
+		contextConverter.setName("myConverter");
+		
+		assertEquals(1, resourceMappedSuperclass.getConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceMappedSuperclass.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ListIterator<EclipseLinkCustomConverter> ormContextConverters = ormContextConverterHolder.customConverters();
+		EclipseLinkCustomConverter ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkCustomConverter contextConverter2 = ormContextConverterHolder.addCustomConverter(0);
+		contextConverter2.setConverterClass("Foo2");
+		contextConverter2.setName("myConverter2");
+		
+		assertEquals(2, resourceMappedSuperclass.getConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceMappedSuperclass.getConverters().get(0).getName());
+		assertEquals("Foo", resourceMappedSuperclass.getConverters().get(1).getClassName());
+		assertEquals("myConverter", resourceMappedSuperclass.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveCustomConverter(0, 1);
+		
+		assertEquals(2, resourceMappedSuperclass.getConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getConverters().get(0).getClassName());
+		assertEquals("myConverter", resourceMappedSuperclass.getConverters().get(0).getName());
+		assertEquals("Foo2", resourceMappedSuperclass.getConverters().get(1).getClassName());
+		assertEquals("myConverter2", resourceMappedSuperclass.getConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo", ormContextConverter.getConverterClass());
+		assertEquals("myConverter", ormContextConverter.getName());
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(0);
+		
+		assertEquals(1, resourceMappedSuperclass.getConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getConverters().get(0).getClassName());
+		assertEquals("myConverter2", resourceMappedSuperclass.getConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.customConvertersSize());
+		ormContextConverters = ormContextConverterHolder.customConverters();
+		ormContextConverter = ormContextConverters.next();
+		assertEquals("Foo2", ormContextConverter.getConverterClass());
+		assertEquals("myConverter2", ormContextConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeCustomConverter(contextConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.customConvertersSize());
+		assertFalse(ormContextConverterHolder.customConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateTypeConverters() throws Exception {
+		createTestMappedSuperclassForTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceMappedSuperclass.getTypeConverters().add(resourceTypeConverter);
+		resourceTypeConverter.setDataType("Foo");
+		resourceTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlTypeConverter resourceTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
+		resourceMappedSuperclass.getTypeConverters().add(0, resourceTypeConverter2);
+		resourceTypeConverter2.setDataType("Foo2");
+		resourceTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceMappedSuperclass.getTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getTypeConverters().remove(resourceTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyTypeConverters() throws Exception {
+		createTestMappedSuperclassForTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter.setDataType("Foo");
+		contextTypeConverter.setName("myTypeConverter");
+		
+		assertEquals(1, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceMappedSuperclass.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ListIterator<EclipseLinkTypeConverter> ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		EclipseLinkTypeConverter ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkTypeConverter contextTypeConverter2 = ormContextConverterHolder.addTypeConverter(0);
+		contextTypeConverter2.setDataType("Foo2");
+		contextTypeConverter2.setName("myTypeConverter2");
+		
+		assertEquals(2, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceMappedSuperclass.getTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceMappedSuperclass.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter", resourceMappedSuperclass.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveTypeConverter(0, 1);
+		
+		assertEquals(2, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter", resourceMappedSuperclass.getTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceMappedSuperclass.getTypeConverters().get(1).getDataType());
+		assertEquals("myTypeConverter2", resourceMappedSuperclass.getTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter", ormContextTypeConverter.getName());
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(0);
+		
+		assertEquals(1, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getTypeConverters().get(0).getDataType());
+		assertEquals("myTypeConverter2", resourceMappedSuperclass.getTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.typeConvertersSize());
+		ormContextTypeConverters = ormContextConverterHolder.typeConverters();
+		ormContextTypeConverter = ormContextTypeConverters.next();
+		assertEquals("Foo2", ormContextTypeConverter.getDataType());
+		assertEquals("myTypeConverter2", ormContextTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeTypeConverter(contextTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.typeConvertersSize());
+		assertFalse(ormContextConverterHolder.typeConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateObjectTypeConverters() throws Exception {
+		createTestMappedSuperclassForObjectTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceMappedSuperclass.getObjectTypeConverters().add(resourceObjectTypeConverter);
+		resourceObjectTypeConverter.setDataType("Foo");
+		resourceObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlObjectTypeConverter resourceObjectTypeConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
+		resourceMappedSuperclass.getObjectTypeConverters().add(0, resourceObjectTypeConverter2);
+		resourceObjectTypeConverter2.setDataType("Foo2");
+		resourceObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceMappedSuperclass.getObjectTypeConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getObjectTypeConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getObjectTypeConverters().remove(resourceObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyObjectTypeConverters() throws Exception {
+		createTestMappedSuperclassForObjectTypeConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter.setDataType("Foo");
+		contextObjectTypeConverter.setName("myObjectTypeConverter");
+		
+		assertEquals(1, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceMappedSuperclass.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ListIterator<EclipseLinkObjectTypeConverter> ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		EclipseLinkObjectTypeConverter ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkObjectTypeConverter contextObjectTypeConverter2 = ormContextConverterHolder.addObjectTypeConverter(0);
+		contextObjectTypeConverter2.setDataType("Foo2");
+		contextObjectTypeConverter2.setName("myObjectTypeConverter2");
+		
+		assertEquals(2, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceMappedSuperclass.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo", resourceMappedSuperclass.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter", resourceMappedSuperclass.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveObjectTypeConverter(0, 1);
+		
+		assertEquals(2, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter", resourceMappedSuperclass.getObjectTypeConverters().get(0).getName());
+		assertEquals("Foo2", resourceMappedSuperclass.getObjectTypeConverters().get(1).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceMappedSuperclass.getObjectTypeConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter", ormContextObjectTypeConverter.getName());
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(0);
+		
+		assertEquals(1, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getObjectTypeConverters().get(0).getDataType());
+		assertEquals("myObjectTypeConverter2", resourceMappedSuperclass.getObjectTypeConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.objectTypeConvertersSize());
+		ormContextObjectTypeConverters = ormContextConverterHolder.objectTypeConverters();
+		ormContextObjectTypeConverter = ormContextObjectTypeConverters.next();
+		assertEquals("Foo2", ormContextObjectTypeConverter.getDataType());
+		assertEquals("myObjectTypeConverter2", ormContextObjectTypeConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeObjectTypeConverter(contextObjectTypeConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.objectTypeConvertersSize());
+		assertFalse(ormContextConverterHolder.objectTypeConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getObjectTypeConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testUpdateStructConverters() throws Exception {
+		createTestMappedSuperclassForStructConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceMappedSuperclass.getStructConverters().add(resourceStructConverter);
+		resourceStructConverter.setConverter("Foo");
+		resourceStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the resource model, check context model
+		XmlStructConverter resourceStructConverter2 = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
+		resourceMappedSuperclass.getStructConverters().add(0, resourceStructConverter2);
+		resourceStructConverter2.setConverter("Foo2");
+		resourceStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the resource model, check context model
+		resourceMappedSuperclass.getStructConverters().move(0, 1);
+		
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getStructConverters().remove(0);
+		
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the resource model, check context model
+		resourceMappedSuperclass.getStructConverters().remove(resourceStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+
+	public void testModifyStructConverters() throws Exception {
+		createTestMappedSuperclassForStructConverters();
+		EclipseLinkPersistenceUnit persistenceUnit = getPersistenceUnit();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmEclipseLinkMappedSuperclass ormContextMappedSuperclass = (OrmEclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		OrmEclipseLinkConverterContainer ormContextConverterHolder = ormContextMappedSuperclass.getConverterContainer();
+		XmlMappedSuperclass resourceMappedSuperclass = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertEquals(0, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add a converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter.setConverterClass("Foo");
+		contextStructConverter.setName("myStructConverter");
+		
+		assertEquals(1, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceMappedSuperclass.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ListIterator<EclipseLinkStructConverter> ormContextStructConverters = ormContextConverterHolder.structConverters();
+		EclipseLinkStructConverter ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//add another converter to the context model, check resource model
+		EclipseLinkStructConverter contextStructConverter2 = ormContextConverterHolder.addStructConverter(0);
+		contextStructConverter2.setConverterClass("Foo2");
+		contextStructConverter2.setName("myStructConverter2");
+		
+		assertEquals(2, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceMappedSuperclass.getStructConverters().get(0).getName());
+		assertEquals("Foo", resourceMappedSuperclass.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter", resourceMappedSuperclass.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//move a converter in the context model, check resource model
+		ormContextConverterHolder.moveStructConverter(0, 1);
+		
+		assertEquals(2, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals("Foo", resourceMappedSuperclass.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter", resourceMappedSuperclass.getStructConverters().get(0).getName());
+		assertEquals("Foo2", resourceMappedSuperclass.getStructConverters().get(1).getConverter());
+		assertEquals("myStructConverter2", resourceMappedSuperclass.getStructConverters().get(1).getName());
+		assertEquals(2, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter", ormContextStructConverter.getName());
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(2, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(0);
+		
+		assertEquals(1, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals("Foo2", resourceMappedSuperclass.getStructConverters().get(0).getConverter());
+		assertEquals("myStructConverter2", resourceMappedSuperclass.getStructConverters().get(0).getName());
+		assertEquals(1, ormContextConverterHolder.structConvertersSize());
+		ormContextStructConverters = ormContextConverterHolder.structConverters();
+		ormContextStructConverter = ormContextStructConverters.next();
+		assertEquals("Foo2", ormContextStructConverter.getConverterClass());
+		assertEquals("myStructConverter2", ormContextStructConverter.getName());
+		assertEquals(1, CollectionTools.size(persistenceUnit.allConverters()));
+		
+		//remove a converter from the context model, check resource model
+		ormContextConverterHolder.removeStructConverter(contextStructConverter2);
+		
+		assertEquals(0, ormContextConverterHolder.structConvertersSize());
+		assertFalse(ormContextConverterHolder.structConverters().hasNext());
+		assertEquals(0, resourceMappedSuperclass.getStructConverters().size());
+		assertEquals(0, CollectionTools.size(persistenceUnit.allConverters()));
+	}
+	
+	public void testSetSpecifiedCacheable() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable2_0 = ((CacheableHolder2_0) ormPersistentType.getMapping()).getCacheable();
+		XmlMappedSuperclass mappedSuperclassResource = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		assertEquals(null, cacheable2_0.getSpecifiedCacheable());
+		assertEquals(null, mappedSuperclassResource.getCacheable());
+		
+		cacheable2_0.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, cacheable2_0.getSpecifiedCacheable());
+		assertEquals(Boolean.FALSE, mappedSuperclassResource.getCacheable());
+		
+		cacheable2_0.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, cacheable2_0.getSpecifiedCacheable());
+		assertEquals(Boolean.TRUE, mappedSuperclassResource.getCacheable());
+		
+		cacheable2_0.setSpecifiedCacheable(null);
+		assertEquals(null, cacheable2_0.getSpecifiedCacheable());
+		assertEquals(null, mappedSuperclassResource.getCacheable());
+	}
+	
+	public void testGetSpecifiedCacheable() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) ormPersistentType.getMapping()).getCacheable();
+		XmlMappedSuperclass mappedSuperclassResource = (XmlMappedSuperclass) getXmlEntityMappings().getMappedSuperclasses().get(0);
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, mappedSuperclassResource.getCacheable());
+		
+		mappedSuperclassResource.setCacheable(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.TRUE, mappedSuperclassResource.getCacheable());
+
+		mappedSuperclassResource.setCacheable(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, cacheable.getSpecifiedCacheable());
+		assertEquals(Boolean.FALSE, mappedSuperclassResource.getCacheable());
+		
+		mappedSuperclassResource.setCacheable(null);
+		assertEquals(null, cacheable.getSpecifiedCacheable());
+		assertEquals(null, mappedSuperclassResource.getCacheable());
+	}
+	
+	public void testIsDefaultCacheable() throws Exception {
+		createTestMappedSuperclass();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) ormPersistentType.getMapping()).getCacheable();
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		assertEquals(SharedCacheMode.DISABLE_SELECTIVE, persistenceUnit2_0.getSharedCacheMode());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ALL);
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, cacheable.isDefaultCacheable());
+
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.UNSPECIFIED);
+		assertEquals(true, cacheable.isDefaultCacheable());
+	}
+	
+	public void testIsDefaultCacheableFromSuperType() throws Exception {
+		createTestMappedSuperclass();
+		createTestMappedSuperclassSubType();
+		OrmPersistentType subOrmPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_SUB_TYPE_NAME);
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass subMappedSuperclass = (EclipseLinkMappedSuperclass) subOrmPersistentType.getMapping();
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		Cacheable2_0 subCacheable = ((CacheableHolder2_0) subMappedSuperclass).getCacheable();
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) mappedSuperclass).getCacheable();
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(null);
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+				
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		cacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	}
+	
+	public void testIsDefaultCacheableFromJava() throws Exception {
+		createTestMappedSuperclass();
+		createTestMappedSuperclassSubType();
+		OrmPersistentType subOrmPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_SUB_TYPE_NAME);
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		Cacheable2_0 subCacheable = ((CacheableHolder2_0) subOrmPersistentType.getMapping()).getCacheable();
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) ormPersistentType.getMapping()).getCacheable();
+		
+		Cacheable2_0 javaCacheable = ((CacheableHolder2_0) ormPersistentType.getJavaPersistentType().getMapping()).getCacheable();
+		javaCacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+				
+		javaCacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		javaCacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		javaCacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+	}
+	
+	public void testIsDefaultCacheableFromMappedSuperClass() throws Exception {
+		createTestMappedSuperclass();
+		createTestMappedSuperclassSubType();
+		OrmPersistentType subOrmPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_SUB_TYPE_NAME);
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		
+		EclipseLinkMappedSuperclass subMappedSuperclass = (EclipseLinkMappedSuperclass) subOrmPersistentType.getMapping();
+		EclipseLinkMappedSuperclass mappedSuperclass = (EclipseLinkMappedSuperclass) ormPersistentType.getMapping();
+		Cacheable2_0 subCacheable = ((CacheableHolder2_0) subMappedSuperclass).getCacheable();
+		Cacheable2_0 cacheable = ((CacheableHolder2_0) mappedSuperclass).getCacheable();
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		PersistenceUnit2_0 persistenceUnit2_0 = getPersistenceUnit();
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(null);
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.DISABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+				
+		cacheable.setSpecifiedCacheable(Boolean.FALSE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(true, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
+		assertEquals(false, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		cacheable.setSpecifiedCacheable(Boolean.TRUE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+		
+		persistenceUnit2_0.setSpecifiedSharedCacheMode(SharedCacheMode.NONE);
+		assertEquals(true, subCacheable.isDefaultCacheable());
+		assertEquals(false, cacheable.isDefaultCacheable());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmOneToManyMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmOneToManyMappingTests.java
new file mode 100644
index 0000000..5a08c3a
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmOneToManyMappingTests.java
@@ -0,0 +1,1076 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2011 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.Column;
+import org.eclipse.jpt.jpa.core.context.Entity;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.OneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyColumn;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.context.java.JavaOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmOneToManyMapping;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cascade2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToManyRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrderColumn2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.Orderable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOneToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmOneToManyMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmOrphanRemovable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmOrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.MapKeyColumn2_0Annotation;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentAttribute;
+import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlOneToMany;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkOneToManyMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm.OrmEclipseLinkOneToManyMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.eclipselink.core.v2_0.context.EclipseLinkOneToManyRelationship2_0;
+
+/**
+ *  EclipseLink2_0OrmOneToManyMappingTests
+ */
+@SuppressWarnings("nls")
+public class EclipseLink2_0OrmOneToManyMappingTests
+	extends EclipseLink2_0OrmContextModelTestCase
+{
+	public EclipseLink2_0OrmOneToManyMappingTests(String name) {
+		super(name);
+	}
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+				sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+	
+	private void createTestEntityWithValidOneToManyMapping() throws Exception {
+		this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private java.util.Collection<Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+		
+	private ICompilationUnit createTestEntityWithValidMapOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private java.util.Map<String, Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityWithValidNonGenericMapOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private java.util.Map addresses;").append(CR);			
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private void createTestEmbeddableState() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("State").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    private String abbr;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter);
+	}		
+	
+	private ICompilationUnit createTestEntityWithValidGenericMapOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+	
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany").append(CR);				
+				sb.append("    private java.util.Map<String, Address> addresses;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private ICompilationUnit createTestEntityOneToManyMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.FETCH_TYPE, JPA.CASCADE_TYPE, JPA.ORDER_BY, EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToMany(fetch=FetchType.EAGER, targetEntity=Address.class, orphanRemoval = true, cascade={CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH})");
+				sb.append(CR);
+				sb.append("    @OrderBy(\"city\"");
+				sb.append(CR);
+				sb.append("    @JoinFetch(JoinFetchType.INNER)");
+				sb.append(CR);
+				sb.append("    private java.util.Collection<Address> address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}	
+
+	private OrmOrphanRemovable2_0 getOrphanRemovalOf(OneToManyMapping2_0 oneToManyMapping) {
+		return ((OrmOrphanRemovalHolder2_0) oneToManyMapping).getOrphanRemoval();
+	}
+	
+	public void testUpdateSpecifiedOrphanRemoval() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToManyMapping");
+		OrmOneToManyMapping2_0 oneToManyMapping = (OrmOneToManyMapping2_0) ormPersistentAttribute.getMapping();
+		OrmOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToManyMapping);
+		XmlOneToMany oneToManyResource = getXmlEntityMappings().getEntities().get(0).getAttributes().getOneToManys().get(0);
+		
+		assertEquals(null, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertEquals(null, oneToManyResource.getOrphanRemoval());
+				
+		//set enumerated in the resource model, verify context model updated
+		oneToManyResource.setOrphanRemoval(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertEquals(Boolean.TRUE, oneToManyResource.getOrphanRemoval());
+	
+		oneToManyResource.setOrphanRemoval(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertEquals(Boolean.FALSE, oneToManyResource.getOrphanRemoval());
+	}
+	
+	public void testModifySpecifiedOrphanRemoval() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToManyMapping");
+		OrmOneToManyMapping2_0 oneToManyMapping = (OrmOneToManyMapping2_0) ormPersistentAttribute.getMapping();
+		OrmOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(oneToManyMapping);
+		XmlOneToMany oneToManyResource = getXmlEntityMappings().getEntities().get(0).getAttributes().getOneToManys().get(0);
+		
+		assertEquals(null, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertEquals(null, oneToManyResource.getOrphanRemoval());
+				
+		//set enumerated in the context model, verify resource model updated
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, oneToManyResource.getOrphanRemoval());
+		assertEquals(Boolean.TRUE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+	
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, oneToManyResource.getOrphanRemoval());
+		assertEquals(Boolean.FALSE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+	}
+	public void testUpdateVirtualMapKey() throws Exception {
+		createTestEntityWithValidMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME_ + "Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME_ + "State");
+
+		OneToManyMapping virtualOneToManyMapping = (OneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaOneToManyMapping javaOneToManyMapping = (JavaOneToManyMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		assertNull(virtualOneToManyMapping.getSpecifiedMapKey());
+		assertNull(virtualOneToManyMapping.getMapKey());
+		assertFalse(virtualOneToManyMapping.isPkMapKey());
+		assertFalse(virtualOneToManyMapping.isCustomMapKey());
+		assertTrue(virtualOneToManyMapping.isNoMapKey());
+		
+		//set pk mapKey in the java, verify virtual orm mapping updates
+		javaOneToManyMapping.setPkMapKey(true);
+		assertEquals("id", virtualOneToManyMapping.getMapKey());
+		assertTrue(virtualOneToManyMapping.isPkMapKey());
+		assertFalse(virtualOneToManyMapping.isCustomMapKey());
+		assertFalse(virtualOneToManyMapping.isNoMapKey());
+		
+		
+		//set custom specified mapKey in the java, verify virtual orm mapping updates
+		javaOneToManyMapping.setCustomMapKey(true);
+		javaOneToManyMapping.setSpecifiedMapKey("city");
+		assertEquals("city", virtualOneToManyMapping.getSpecifiedMapKey());
+		assertEquals("city", virtualOneToManyMapping.getMapKey());
+		assertFalse(virtualOneToManyMapping.isPkMapKey());
+		assertTrue(virtualOneToManyMapping.isCustomMapKey());
+		assertFalse(virtualOneToManyMapping.isNoMapKey());
+		
+		//set metadata complete and verify that the orm model ignores the java annotations
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		virtualOneToManyMapping = (OneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		assertEquals(null, virtualOneToManyMapping.getSpecifiedMapKey());
+		assertEquals(null, virtualOneToManyMapping.getMapKey());
+		assertFalse(virtualOneToManyMapping.isPkMapKey());
+		assertFalse(virtualOneToManyMapping.isCustomMapKey());
+		assertTrue(virtualOneToManyMapping.isNoMapKey());
+	}
+	
+	public void testCandidateMapKeyNames() throws Exception {
+		createTestEntityWithValidMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		
+		OneToManyMapping virtualOneToManyMapping = (OneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = 
+			virtualOneToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.name", mapKeyNames.next());
+		assertEquals("state.abbr", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+	}
+	
+	public void testCandidateMapKeyNames2() throws Exception {
+		createTestEntityWithValidNonGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		
+		OneToManyMapping virtualOneToManyMapping = (OneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaOneToManyMapping javaOneToManyMapping = (JavaOneToManyMapping) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+
+		Iterator<String> mapKeyNames = virtualOneToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		javaOneToManyMapping.setSpecifiedTargetEntity("test.Address");
+		mapKeyNames = virtualOneToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.name", mapKeyNames.next());
+		assertEquals("state.abbr", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		ormPersistentType.getAttributeNamed("addresses").convertToSpecified();
+		OrmOneToManyMapping ormOneToManyMapping = (OrmOneToManyMapping) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		mapKeyNames = ormOneToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+		
+		ormOneToManyMapping.setSpecifiedTargetEntity("test.Address");
+		mapKeyNames = ormOneToManyMapping.candidateMapKeyNames();
+		assertEquals("id", mapKeyNames.next());
+		assertEquals("city", mapKeyNames.next());
+		assertEquals("state", mapKeyNames.next());
+		assertEquals("state.name", mapKeyNames.next());
+		assertEquals("state.abbr", mapKeyNames.next());
+		assertEquals("zip", mapKeyNames.next());
+		assertFalse(mapKeyNames.hasNext());
+		
+		ormOneToManyMapping.setSpecifiedTargetEntity("String");
+		mapKeyNames = ormOneToManyMapping.candidateMapKeyNames();
+		assertEquals(false, mapKeyNames.hasNext());
+	}
+	
+	public void testUpdateMapKeyClass() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToManyMapping");
+		OrmOneToManyMapping2_0 ormOneToManyMapping = (OrmOneToManyMapping2_0) ormPersistentAttribute.getMapping();
+		XmlOneToMany oneToMany = getXmlEntityMappings().getEntities().get(0).getAttributes().getOneToManys().get(0);
+		
+		assertNull(ormOneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(oneToMany.getMapKeyClass());
+		
+		//set mapKey in the resource model, verify context model does not change
+		oneToMany.setMapKeyClass(OrmFactory.eINSTANCE.createXmlClassReference());
+		assertNull(ormOneToManyMapping.getSpecifiedMapKeyClass());
+		assertNotNull(oneToMany.getMapKeyClass());
+				
+		//set mapKey name in the resource model, verify context model updated
+		oneToMany.getMapKeyClass().setClassName("String");
+		assertEquals("String", ormOneToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("String", oneToMany.getMapKeyClass().getClassName());
+		
+		//set mapKey name to null in the resource model
+		oneToMany.getMapKeyClass().setClassName(null);
+		assertNull(ormOneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(oneToMany.getMapKeyClass().getClassName());
+		
+		oneToMany.getMapKeyClass().setClassName("String");
+		oneToMany.setMapKeyClass(null);
+		assertNull(ormOneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(oneToMany.getMapKeyClass());
+	}
+	
+	public void testUpdateVirtualMapKeyClass() throws Exception {
+		createTestEntityWithValidMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+
+		OneToManyMapping2_0 virtualOneToManyMapping = (OneToManyMapping2_0) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		JavaOneToManyMapping2_0 javaOneToManyMapping = (JavaOneToManyMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		assertNull(virtualOneToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("java.lang.String", virtualOneToManyMapping.getMapKeyClass());
+		assertEquals("java.lang.String", virtualOneToManyMapping.getDefaultMapKeyClass());
+		
+		//set pk mapKey in the java, verify virtual orm mapping updates
+		javaOneToManyMapping.setSpecifiedMapKeyClass("Integer");
+		assertEquals("Integer", virtualOneToManyMapping.getMapKeyClass());
+		assertEquals("Integer", virtualOneToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("java.lang.String", virtualOneToManyMapping.getDefaultMapKeyClass());
+		
+		
+		//set custom specified mapKey in the java, verify virtual orm mapping updates
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		virtualOneToManyMapping = (OneToManyMapping2_0) ormPersistentType.getAttributeNamed("addresses").getMapping();
+		assertEquals(null, virtualOneToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("java.lang.String", virtualOneToManyMapping.getMapKeyClass());
+		assertEquals("java.lang.String", virtualOneToManyMapping.getDefaultMapKeyClass());
+	}
+	
+	public void testModifyMapKeyClass() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "oneToManyMapping");
+		OrmOneToManyMapping2_0 ormOneToManyMapping = (OrmOneToManyMapping2_0) ormPersistentAttribute.getMapping();
+		XmlOneToMany oneToMany = getXmlEntityMappings().getEntities().get(0).getAttributes().getOneToManys().get(0);
+		
+		assertNull(ormOneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(oneToMany.getMapKeyClass());
+					
+		//set mapKey  in the context model, verify resource model updated
+		ormOneToManyMapping.setSpecifiedMapKeyClass("String");
+		assertEquals("String", ormOneToManyMapping.getSpecifiedMapKeyClass());
+		assertEquals("String", oneToMany.getMapKeyClass().getClassName());
+	
+		//set mapKey to null in the context model
+		ormOneToManyMapping.setSpecifiedMapKeyClass(null);
+		assertNull(ormOneToManyMapping.getSpecifiedMapKeyClass());
+		assertNull(oneToMany.getMapKeyClass());
+	}
+
+	public void testOrderColumnDefaults() throws Exception {
+		createTestEntityPrintQueue();
+		createTestEntityPrintJob();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".PrintQueue");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".PrintJob");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "jobs");
+		OrmOneToManyMapping oneToManyMapping = (OrmOneToManyMapping) ormPersistentAttribute.getMapping();
+		oneToManyMapping.getRelationship().setStrategyToMappedBy();
+		oneToManyMapping.getRelationship().getMappedByStrategy().setMappedByAttribute("queue");
+
+		Orderable2_0 orderable = ((Orderable2_0) oneToManyMapping.getOrderable());
+		assertEquals(false, orderable.isOrderColumnOrdering());
+		assertEquals(true, orderable.isNoOrdering());
+		
+		orderable.setOrderColumnOrdering(true);
+		OrderColumn2_0 orderColumn = orderable.getOrderColumn();
+		assertEquals(true, orderable.isOrderColumnOrdering());
+		assertEquals(null, orderColumn.getSpecifiedName());
+		assertEquals("jobs_ORDER", orderColumn.getDefaultName());
+		assertEquals("PrintJob", orderColumn.getTable());
+		
+		orderColumn.setSpecifiedName("FOO");
+		assertEquals("FOO", orderColumn.getSpecifiedName());
+		assertEquals("jobs_ORDER", orderColumn.getDefaultName());
+		assertEquals("PrintJob", orderColumn.getTable());
+		
+		OrmPersistentType printJobPersistentType = (OrmPersistentType) getPersistenceUnit().getPersistentType("test.PrintJob");
+		((Entity) printJobPersistentType.getMapping()).getTable().setSpecifiedName("MY_TABLE");
+
+		assertEquals("MY_TABLE", orderColumn.getTable());
+	}
+	
+	public void testVirtualOrderColumn() throws Exception {
+		createTestEntityPrintQueue();
+		createTestEntityPrintJob();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".PrintQueue");
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".PrintJob");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "jobs");
+		OrmOneToManyMapping oneToManyMapping = (OrmOneToManyMapping) ormPersistentAttribute.getMapping();
+
+		Orderable2_0 orderable = ((Orderable2_0) oneToManyMapping.getOrderable());
+		assertEquals(false, orderable.isOrderColumnOrdering());
+		assertEquals(true, orderable.isNoOrdering());
+		
+		JavaOneToManyMapping javaOneToManyMapping = (JavaOneToManyMapping) ormPersistentAttribute.getJavaPersistentAttribute().getMapping();
+		((Orderable2_0) javaOneToManyMapping.getOrderable()).setOrderColumnOrdering(true);
+				
+		assertEquals(false, orderable.isOrderColumnOrdering());
+		assertEquals(true, orderable.isNoOrdering());
+
+		ormPersistentAttribute.convertToVirtual();		
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("jobs");
+		OneToManyMapping virtualOneToManyMapping = (OneToManyMapping) ormPersistentAttribute2.getMapping();
+		orderable = ((Orderable2_0) virtualOneToManyMapping.getOrderable());
+		assertEquals(true, orderable.isOrderColumnOrdering());
+		assertEquals(false, orderable.isNoOrdering());
+		assertEquals("PrintJob", orderable.getOrderColumn().getTable());
+		assertEquals("jobs_ORDER", orderable.getOrderColumn().getName());
+		
+		((Orderable2_0) javaOneToManyMapping.getOrderable()).getOrderColumn().setSpecifiedName("FOO");
+		assertEquals("PrintJob", orderable.getOrderColumn().getTable());
+		assertEquals("FOO", orderable.getOrderColumn().getName());
+	}
+	
+	
+	private void createTestEntityPrintQueue() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ONE_TO_MANY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ORDER_COLUMN);
+					sb.append(";");
+					sb.append(CR);
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PrintQueue").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private String name;").append(CR);
+				sb.append(CR);
+				sb.append("    @OneToMany(mappedBy=\"queue\")").append(CR);
+				sb.append("    @OrderColumn").append(CR);
+				sb.append("    private java.util.List<PrintJob> jobs;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PrintQueue.java", sourceWriter);
+	}
+	
+	private void createTestEntityPrintJob() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.MANY_TO_ONE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("PrintJob").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    @ManyToOne").append(CR);
+				sb.append("    private PrintQueue queue;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "PrintJob.java", sourceWriter);
+	}
+
+	public void testVirtualMapKeyColumnDefaults() throws Exception {
+		createTestEntityWithValidMapOneToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		//virtual attribute in orm.xml, java attribute has no value Column annotation
+		OrmReadOnlyPersistentAttribute addressesPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		OneToManyMapping2_0 addressesVirtualMapping = (OneToManyMapping2_0) addressesPersistentAttribute.getMapping();		
+		Column ormColumn = addressesVirtualMapping.getMapKeyColumn();
+		assertEquals("addresses_KEY", ormColumn.getName());
+		assertEquals(TYPE_NAME + "_Address", ormColumn.getTable());
+		assertEquals(null, ormColumn.getColumnDefinition());
+		assertTrue(ormColumn.isInsertable());
+		assertTrue(ormColumn.isUpdatable());
+		assertTrue(ormColumn.isNullable());
+		assertFalse(ormColumn.isUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, ormColumn.getLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, ormColumn.getPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, ormColumn.getScale());
+
+		//set Column annotation in Java
+		JavaOneToManyMapping2_0 javaOneToManyMapping = (JavaOneToManyMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedName("FOO");		
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedTable("FOO_TABLE");
+		javaOneToManyMapping.getMapKeyColumn().setColumnDefinition("COLUMN_DEFINITION");
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedInsertable(Boolean.FALSE);	
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedUpdatable(Boolean.FALSE);	
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedNullable(Boolean.FALSE);	
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedUnique(Boolean.TRUE);	
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedLength(Integer.valueOf(45));
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedPrecision(Integer.valueOf(46));
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedScale(Integer.valueOf(47));
+
+		assertEquals("FOO", ormColumn.getSpecifiedName());
+		assertEquals("FOO_TABLE", ormColumn.getSpecifiedTable());
+		assertEquals("COLUMN_DEFINITION", ormColumn.getColumnDefinition());
+		assertEquals(Boolean.FALSE, ormColumn.getSpecifiedInsertable());
+		assertEquals(Boolean.FALSE, ormColumn.getSpecifiedUpdatable());
+		assertEquals(Boolean.FALSE, ormColumn.getSpecifiedNullable());
+		assertEquals(Boolean.TRUE, ormColumn.getSpecifiedUnique());
+		assertEquals(Integer.valueOf(45), ormColumn.getSpecifiedLength());
+		assertEquals(Integer.valueOf(46), ormColumn.getSpecifiedPrecision());
+		assertEquals(Integer.valueOf(47), ormColumn.getSpecifiedScale());
+
+
+		//set metadata-complete, orm.xml virtual column ignores java column annotation
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		addressesPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		OneToManyMapping2_0 addressesMapping = (OneToManyMapping2_0) addressesPersistentAttribute.getMapping();		
+		ormColumn = addressesMapping.getMapKeyColumn();
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, addressesPersistentAttribute.getMappingKey());
+
+		assertEquals("addresses_KEY", ormColumn.getName());
+		assertEquals(TYPE_NAME + "_Address", ormColumn.getTable());
+		assertEquals(null, ormColumn.getColumnDefinition());
+		assertTrue(ormColumn.isInsertable());
+		assertTrue(ormColumn.isUpdatable());
+		assertTrue(ormColumn.isNullable());
+		assertFalse(ormColumn.isUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, ormColumn.getLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, ormColumn.getPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, ormColumn.getScale());
+	}
+	
+	public void testNullMapKeyColumnDefaults() throws Exception {
+		createTestEntityWithValidMapOneToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		OrmPersistentAttribute addressesPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "addresses");
+
+		OrmOneToManyMapping2_0 addressesVirtualMapping = (OrmOneToManyMapping2_0) addressesPersistentAttribute.getMapping();		
+		Column ormColumn = addressesVirtualMapping.getMapKeyColumn();
+
+		//set Column annotation in Java
+		JavaOneToManyMapping2_0 javaOneToManyMapping = (JavaOneToManyMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedName("FOO");		
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedTable("FOO_TABLE");
+		javaOneToManyMapping.getMapKeyColumn().setColumnDefinition("COLUMN_DEFINITION");
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedInsertable(Boolean.FALSE);	
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedUpdatable(Boolean.FALSE);	
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedNullable(Boolean.FALSE);	
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedUnique(Boolean.TRUE);	
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedLength(Integer.valueOf(45));
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedPrecision(Integer.valueOf(46));
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedScale(Integer.valueOf(47));
+
+
+		assertEquals("addresses_KEY", ormColumn.getDefaultName());
+		assertEquals(TYPE_NAME + "_Address", ormColumn.getDefaultTable());
+		assertEquals(true, ormColumn.isDefaultInsertable());
+		assertEquals(true, ormColumn.isDefaultUpdatable());
+		assertEquals(true, ormColumn.isDefaultNullable());
+		assertEquals(false, ormColumn.isDefaultUnique());
+		assertEquals(ReadOnlyColumn.DEFAULT_LENGTH, ormColumn.getDefaultLength());
+		assertEquals(ReadOnlyColumn.DEFAULT_PRECISION, ormColumn.getDefaultPrecision());
+		assertEquals(ReadOnlyColumn.DEFAULT_SCALE, ormColumn.getDefaultScale());
+		assertNull(ormColumn.getSpecifiedName());
+		assertNull(ormColumn.getSpecifiedTable());
+		assertNull(ormColumn.getColumnDefinition());
+		assertNull(ormColumn.getSpecifiedInsertable());
+		assertNull(ormColumn.getSpecifiedUpdatable());
+		assertNull(ormColumn.getSpecifiedNullable());
+		assertNull(ormColumn.getSpecifiedUnique());
+		assertNull(ormColumn.getSpecifiedLength());
+		assertNull(ormColumn.getSpecifiedPrecision());
+		assertNull(ormColumn.getSpecifiedScale());
+	}
+
+	public void testVirtualMapKeyColumnTable() throws Exception {
+		createTestEntityWithValidMapOneToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		//virtual attribute in orm.xml, java attribute has no Column annotation
+		OrmReadOnlyPersistentAttribute addressesPersistentAttribute = ormPersistentType.virtualAttributes().next();
+		OneToManyMapping2_0 addressesVirtualMapping = (OneToManyMapping2_0) addressesPersistentAttribute.getMapping();	
+		Column ormColumn = addressesVirtualMapping.getMapKeyColumn();
+
+		assertEquals(TYPE_NAME + "_Address", ormColumn.getTable());
+
+		//entity table changes the join table default name
+		((OrmEntity) ormPersistentType.getMapping()).getTable().setSpecifiedName("ORM_TABLE");
+		assertEquals("ORM_TABLE_Address", ormColumn.getTable());
+
+		//set Column table element in Java
+		JavaOneToManyMapping2_0 javaOneToManyMapping = (JavaOneToManyMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("addresses").getMapping();
+		javaOneToManyMapping.getRelationship().getJoinTableStrategy().getJoinTable().setSpecifiedName("JAVA_JOIN_TABLE");
+		assertEquals("JAVA_JOIN_TABLE", ormColumn.getTable());
+		javaOneToManyMapping.getMapKeyColumn().setSpecifiedTable("JAVA_TABLE");	
+		assertEquals("JAVA_TABLE", ormColumn.getTable());
+
+		//make name persistent attribute not virtual
+		addressesPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, "addresses");
+		OrmOneToManyMapping2_0 addressesMapping = (OrmOneToManyMapping2_0) addressesPersistentAttribute.getMapping();	
+		ormColumn = addressesMapping.getMapKeyColumn();
+		assertNull(ormColumn.getSpecifiedTable());
+		assertEquals("ORM_TABLE_Address", ormColumn.getDefaultTable());
+	}
+
+	public void testModifyPredominantJoiningStrategy() throws Exception {
+		createTestEntityWithValidOneToManyMapping();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("addresses");
+		OrmEclipseLinkOneToManyMapping contextMapping = (OrmEclipseLinkOneToManyMapping) contextAttribute.getMapping();
+		EclipseLinkOneToManyRelationship2_0 rel = contextMapping.getRelationship();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlOneToMany resourceMapping = resourceEntity.getAttributes().getOneToManys().get(0);
+		
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToJoinColumn();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToMappedBy();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		rel.setStrategyToJoinTable();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+	}
+	
+	public void testUpdatePredominantJoiningStrategy() throws Exception {
+		createTestEntityWithValidOneToManyMapping();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("addresses");
+		OrmEclipseLinkOneToManyMapping contextMapping = (OrmEclipseLinkOneToManyMapping) contextAttribute.getMapping();
+		EclipseLinkOneToManyRelationship2_0 rel = contextMapping.getRelationship();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlOneToMany resourceMapping = resourceEntity.getAttributes().getOneToManys().get(0);
+		
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceMapping.setMappedBy("foo");
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceMapping.setJoinTable(OrmFactory.eINSTANCE.createXmlJoinTable());
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceMapping.getJoinColumns().add(OrmFactory.eINSTANCE.createXmlJoinColumn());
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertTrue(rel.strategyIsMappedBy());
+		
+		resourceMapping.setMappedBy(null);
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceMapping.setJoinTable(null);
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+		
+		resourceMapping.getJoinColumns().clear();
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertNull(resourceMapping.getMappedBy());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+		assertFalse(rel.strategyIsMappedBy());
+	}
+
+	public void testTargetForeignKeyJoinColumnStrategy() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentType ormTargetPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		//test virtual orm mapping, setting the join column on the java mapping
+		OrmReadOnlyPersistentAttribute persistentAttribute = ormPersistentType.getAttributeNamed("addresses");
+		OneToManyMapping2_0 virtualOneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		JavaOneToManyMapping2_0 javaOneToManyMapping = (JavaOneToManyMapping2_0) persistentAttribute.getJavaPersistentAttribute().getMapping();
+		((OneToManyRelationship2_0) javaOneToManyMapping.getRelationship()).setStrategyToJoinColumn();
+
+		JoinColumn joinColumn = ((OneToManyRelationship2_0) virtualOneToManyMapping.getRelationship()).getJoinColumnStrategy().specifiedJoinColumns().next();		
+		assertTrue(persistentAttribute.isVirtual());
+		assertEquals("addresses_id", joinColumn.getDefaultName());
+		assertEquals("Address", joinColumn.getDefaultTable());//target table name
+
+		JavaEntity addressEntity = (JavaEntity) ormTargetPersistentType.getJavaPersistentType().getMapping();
+		addressEntity.getTable().setSpecifiedName("ADDRESS_PRIMARY_TABLE");
+		assertEquals("ADDRESS_PRIMARY_TABLE", joinColumn.getDefaultTable());
+
+		//override the mapping in orm.xml
+		persistentAttribute.convertToSpecified();
+		persistentAttribute = ormPersistentType.getAttributeNamed("addresses");
+		OrmOneToManyMapping2_0 ormOneToManyMapping = (OrmOneToManyMapping2_0) persistentAttribute.getMapping();
+		assertFalse(persistentAttribute.isVirtual());
+		assertFalse(((OneToManyRelationship2_0) ormOneToManyMapping.getRelationship()).strategyIsJoinColumn());
+
+		((OneToManyRelationship2_0) ormOneToManyMapping.getRelationship()).setStrategyToJoinColumn();
+		joinColumn = ((OneToManyRelationship2_0) ormOneToManyMapping.getRelationship()).getJoinColumnStrategy().specifiedJoinColumns().next();		
+		assertFalse(persistentAttribute.isVirtual());
+		assertEquals("addresses_id", joinColumn.getDefaultName());
+		assertEquals("ADDRESS_PRIMARY_TABLE", joinColumn.getDefaultTable());//target table name
+
+		OrmEntity ormAddressEntity = (OrmEntity) ormTargetPersistentType.getMapping();
+		ormAddressEntity.getTable().setSpecifiedName("ORM_ADDRESS_PRIMARY_TABLE");
+		assertEquals("ORM_ADDRESS_PRIMARY_TABLE", joinColumn.getDefaultTable());
+
+		joinColumn.setSpecifiedName("FOO");
+		assertEquals("addresses_id", joinColumn.getDefaultName());
+		assertEquals("FOO", joinColumn.getSpecifiedName());
+		assertEquals("ORM_ADDRESS_PRIMARY_TABLE", joinColumn.getDefaultTable());
+	}
+
+	//target foreign key case
+	public void testGetMapKeyColumnJoinColumnStrategy() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentType ormTargetPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		//test virtual orm mapping, setting the join column on the java mapping
+		OrmReadOnlyPersistentAttribute persistentAttribute = ormPersistentType.getAttributeNamed("addresses");
+		OneToManyMapping2_0 virtualOneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		JavaOneToManyMapping2_0 javaOneToManyMapping = (JavaOneToManyMapping2_0) persistentAttribute.getJavaPersistentAttribute().getMapping();
+		((OneToManyRelationship2_0) javaOneToManyMapping.getRelationship()).setStrategyToJoinColumn();
+
+		assertTrue(persistentAttribute.isVirtual());
+		assertEquals("addresses_KEY", virtualOneToManyMapping.getMapKeyColumn().getName());
+		assertEquals("Address", virtualOneToManyMapping.getMapKeyColumn().getTable());//target table name
+
+		JavaEntity addressEntity = (JavaEntity) ormTargetPersistentType.getJavaPersistentType().getMapping();
+		addressEntity.getTable().setSpecifiedName("ADDRESS_PRIMARY_TABLE");
+		assertEquals("ADDRESS_PRIMARY_TABLE", virtualOneToManyMapping.getMapKeyColumn().getTable());
+
+		JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next();
+		MapKeyColumn2_0Annotation column = (MapKeyColumn2_0Annotation) attributeResource.addAnnotation(JPA2_0.MAP_KEY_COLUMN);
+		column.setName("foo");
+		getJpaProject().synchronizeContextModel();
+
+		assertEquals("foo", virtualOneToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("foo", virtualOneToManyMapping.getMapKeyColumn().getName());
+		assertEquals("addresses_KEY", virtualOneToManyMapping.getMapKeyColumn().getDefaultName());
+		assertEquals("ADDRESS_PRIMARY_TABLE", virtualOneToManyMapping.getMapKeyColumn().getDefaultTable());
+
+		//override the mapping in orm.xml
+		persistentAttribute.convertToSpecified();
+		persistentAttribute = ormPersistentType.getAttributeNamed("addresses");
+		OrmOneToManyMapping2_0 ormOneToManyMapping = (OrmOneToManyMapping2_0) persistentAttribute.getMapping();
+		assertFalse(persistentAttribute.isVirtual());
+		assertFalse(((OneToManyRelationship2_0) ormOneToManyMapping.getRelationship()).strategyIsJoinColumn());
+
+		((OneToManyRelationship2_0) ormOneToManyMapping.getRelationship()).setStrategyToJoinColumn();
+		assertEquals("addresses_KEY", ormOneToManyMapping.getMapKeyColumn().getName());
+		assertEquals("ADDRESS_PRIMARY_TABLE", ormOneToManyMapping.getMapKeyColumn().getTable());//target table name
+
+		OrmEntity ormAddressEntity = (OrmEntity) ormTargetPersistentType.getMapping();
+		ormAddressEntity.getTable().setSpecifiedName("ORM_ADDRESS_PRIMARY_TABLE");
+		assertEquals("addresses_KEY", ormOneToManyMapping.getMapKeyColumn().getName());
+		assertEquals("ORM_ADDRESS_PRIMARY_TABLE", ormOneToManyMapping.getMapKeyColumn().getTable());//target table name
+
+		ormOneToManyMapping.getMapKeyColumn().setSpecifiedName("FOO");
+		assertEquals("addresses_KEY", ormOneToManyMapping.getMapKeyColumn().getDefaultName());
+		assertEquals("FOO", ormOneToManyMapping.getMapKeyColumn().getSpecifiedName());
+		assertEquals("ORM_ADDRESS_PRIMARY_TABLE", ormOneToManyMapping.getMapKeyColumn().getDefaultTable());
+	}
+
+	//target foreign key case
+	public void testOrderColumnDefaultsJoinColumnStrategy() throws Exception {
+		createTestEntityWithValidGenericMapOneToManyMapping();
+		createTestTargetEntityAddress();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentType ormTargetPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		//test virtual orm mapping, setting the join column on the java mapping
+		OrmReadOnlyPersistentAttribute persistentAttribute = ormPersistentType.getAttributeNamed("addresses");
+		OneToManyMapping2_0 virtualOneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping();
+		JavaOneToManyMapping2_0 javaOneToManyMapping = (JavaOneToManyMapping2_0) persistentAttribute.getJavaPersistentAttribute().getMapping();
+		((OneToManyRelationship2_0) javaOneToManyMapping.getRelationship()).setStrategyToJoinColumn();
+		((Orderable2_0) javaOneToManyMapping.getOrderable()).setOrderColumnOrdering(true);
+		OrderColumn2_0 orderColumn = ((Orderable2_0) virtualOneToManyMapping.getOrderable()).getOrderColumn();
+
+		assertEquals("addresses_ORDER", orderColumn.getName());
+		assertEquals("Address", orderColumn.getTable());//target table name
+
+		JavaEntity addressEntity = (JavaEntity) ormTargetPersistentType.getJavaPersistentType().getMapping();
+		addressEntity.getTable().setSpecifiedName("ADDRESS_PRIMARY_TABLE");
+		assertEquals("ADDRESS_PRIMARY_TABLE", orderColumn.getTable());
+
+		//override the mapping in orm.xml
+		persistentAttribute.convertToSpecified();
+		persistentAttribute = ormPersistentType.getAttributeNamed("addresses");
+		OrmOneToManyMapping2_0 ormOneToManyMapping = (OrmOneToManyMapping2_0) persistentAttribute.getMapping();
+		assertFalse(persistentAttribute.isVirtual());
+		assertFalse(((OneToManyRelationship2_0) ormOneToManyMapping.getRelationship()).strategyIsJoinColumn());
+
+		((OneToManyRelationship2_0) ormOneToManyMapping.getRelationship()).setStrategyToJoinColumn();
+		assertFalse(((Orderable2_0) ormOneToManyMapping.getOrderable()).isOrderColumnOrdering());
+		((Orderable2_0) ormOneToManyMapping.getOrderable()).setOrderColumnOrdering(true);
+		orderColumn = ((Orderable2_0) ormOneToManyMapping.getOrderable()).getOrderColumn();
+
+		assertNull(orderColumn.getSpecifiedName());
+		assertEquals("addresses_ORDER", orderColumn.getName());
+		assertEquals("ADDRESS_PRIMARY_TABLE", orderColumn.getTable());//target table name
+
+		OrmEntity ormAddressEntity = (OrmEntity) ormTargetPersistentType.getMapping();
+		ormAddressEntity.getTable().setSpecifiedName("ORM_ADDRESS_PRIMARY_TABLE");
+		assertEquals("addresses_ORDER", orderColumn.getName());
+		assertEquals("ORM_ADDRESS_PRIMARY_TABLE", orderColumn.getTable());//target table name
+	}
+
+
+	public void testVirtualMappingMetadataCompleteFalse() throws Exception {
+		createTestEntityOneToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.virtualAttributes().next();
+
+		EclipseLinkOneToManyMapping virtualOneToManyMapping = (EclipseLinkOneToManyMapping) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualOneToManyMapping.getName());
+		assertEquals(FetchType.EAGER, virtualOneToManyMapping.getSpecifiedFetch());
+		assertEquals("Address", virtualOneToManyMapping.getSpecifiedTargetEntity());
+		assertNull(virtualOneToManyMapping.getRelationship().
+			getMappedByStrategy().getMappedByAttribute());
+
+		Cascade2_0 cascade = (Cascade2_0) virtualOneToManyMapping.getCascade();
+		assertTrue(cascade.isAll());
+		assertTrue(cascade.isMerge());
+		assertTrue(cascade.isPersist());
+		assertTrue(cascade.isRemove());
+		assertTrue(cascade.isRefresh());
+		assertTrue(cascade.isDetach());
+
+		assertTrue(virtualOneToManyMapping.getOrderable().isCustomOrdering());
+		assertEquals("city", virtualOneToManyMapping.getOrderable().getSpecifiedOrderBy());
+
+		assertTrue(((OrphanRemovalHolder2_0) virtualOneToManyMapping).getOrphanRemoval().isOrphanRemoval());
+		assertEquals(EclipseLinkJoinFetchType.INNER, virtualOneToManyMapping.getJoinFetch().getValue());
+	}
+
+	public void testVirtualMappingMetadataCompleteTrue() throws Exception {
+		createTestEntityOneToManyMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+
+		assertEquals(MappingKeys.ONE_TO_MANY_ATTRIBUTE_MAPPING_KEY, virtualPersistentAttribute.getMappingKey());
+
+		EclipseLinkOneToManyMapping virtualOneToManyMapping = (EclipseLinkOneToManyMapping) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualOneToManyMapping.getName());
+		assertEquals(FetchType.LAZY, virtualOneToManyMapping.getFetch());
+		assertEquals("test.Address", virtualOneToManyMapping.getTargetEntity());
+		assertNull(virtualOneToManyMapping.getRelationship().getMappedByStrategy().getMappedByAttribute());
+
+		Cascade2_0 cascade = (Cascade2_0) virtualOneToManyMapping.getCascade();
+		assertFalse(cascade.isAll());
+		assertFalse(cascade.isMerge());
+		assertFalse(cascade.isPersist());
+		assertFalse(cascade.isRemove());
+		assertFalse(cascade.isRefresh());
+		assertFalse(cascade.isDetach());
+
+		assertTrue(virtualOneToManyMapping.getOrderable().isNoOrdering());
+		assertEquals(null, virtualOneToManyMapping.getOrderable().getSpecifiedOrderBy());
+
+		assertFalse(((OrphanRemovalHolder2_0) virtualOneToManyMapping).getOrphanRemoval().isOrphanRemoval());
+		assertEquals(null, virtualOneToManyMapping.getJoinFetch().getValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmOneToOneMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmOneToOneMappingTests.java
new file mode 100644
index 0000000..a21b53d
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/EclipseLink2_0OrmOneToOneMappingTests.java
@@ -0,0 +1,910 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2011 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.AttributeMapping;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinTable;
+import org.eclipse.jpt.jpa.core.context.OneToOneMapping;
+import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.context.java.JavaJoinColumn;
+import org.eclipse.jpt.jpa.core.context.java.JavaJoinTable;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmJoinTable;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cascade2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OneToOneRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.OrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOneToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaOneToOneRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmManyToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmOneToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmOneToOneRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmOrphanRemovable2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmOrphanRemovalHolder2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlManyToOne;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlOneToOne;
+import org.eclipse.jpt.jpa.core.resource.orm.v2_0.XmlDerivedId_2_0;
+import org.eclipse.jpt.jpa.core.resource.orm.v2_0.XmlMapsId_2_0;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+import org.eclipse.jpt.jpa.eclipselink.core.v2_0.context.EclipseLinkOneToOneMapping2_0;
+
+@SuppressWarnings("nls")
+public class EclipseLink2_0OrmOneToOneMappingTests
+	extends EclipseLink2_0OrmContextModelTestCase
+{
+	public EclipseLink2_0OrmOneToOneMappingTests(String name) {
+		super(name);
+	}
+	
+	
+	private void createTestEntityWithIdDerivedIdentity() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne @Id").append(CR);				
+				sb.append("    private " + TYPE_NAME + " oneToOne;").append(CR);
+				sb.append(CR);				
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+	
+	private void createTestEntityWithMapsIdDerivedIdentity() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, JPA2_0.MAPS_ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne @MapsId").append(CR);				
+				sb.append("    private " + TYPE_NAME + " oneToOne;").append(CR);
+				sb.append(CR);				
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+	
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+				sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	private void createTestTargetEntityAddressWithElementCollection() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA2_0.ELEMENT_COLLECTION);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    @ElementCollection").append(CR);
+				sb.append("    private java.util.Collection<State> state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+	
+	private ICompilationUnit createTestEntityWithValidOneToOneMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne").append(CR);				
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private void createTestEmbeddableState() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.EMBEDDABLE);
+					sb.append(";");
+					sb.append(CR);
+				sb.append("@Embeddable");
+				sb.append(CR);
+				sb.append("public class ").append("State").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    private String foo;").append(CR);
+				sb.append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter);
+	}
+
+	private void createTestEntityWithOneToOneMapping() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@OneToOne").append(CR);
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+	
+	private ICompilationUnit createTestEntityOneToOneMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_ONE, JPA.JOIN_COLUMN, JPA.FETCH_TYPE, JPA.CASCADE_TYPE, EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE, EclipseLink.PRIVATE_OWNED);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @OneToOne(fetch=FetchType.LAZY, optional=false, targetEntity=Address.class, orphanRemoval = true, cascade={CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH})");
+				sb.append(CR);
+				sb.append("    @JoinColumn(name=\"MY_COLUMN\", referencedColumnName=\"MY_REFERENCED_COLUMN\", unique=true, nullable=false, insertable=false, updatable=false, columnDefinition=\"COLUMN_DEFINITION\", table=\"MY_TABLE\")");
+				sb.append(CR);
+				sb.append("    @JoinFetch(JoinFetchType.INNER)");
+				sb.append(CR);
+				sb.append("    @PrivateOwned)");
+				sb.append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}	
+	
+	public void testUpdateDerivedId() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("oneToOne");
+		OrmOneToOneMapping2_0 contextMapping = (OrmOneToOneMapping2_0) contextAttribute.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlDerivedId_2_0 resourceMapping = resourceEntity.getAttributes().getOneToOnes().get(0);
+		
+		assertNull(resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceMapping.setId(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceMapping.setId(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMapping.getId());
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceMapping.setId(null);
+		assertNull(resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+	}
+	
+	public void testSetDerivedId() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("oneToOne");
+		OrmOneToOneMapping2_0 contextMapping = (OrmOneToOneMapping2_0) contextAttribute.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlDerivedId_2_0 resourceMapping = resourceEntity.getAttributes().getOneToOnes().get(0);
+		
+		assertNull(resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().setValue(true);
+		assertEquals(Boolean.TRUE, resourceMapping.getId());
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().setValue(false);
+		assertNull(resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+	}
+	
+	public void testUpdateMapsId() throws Exception {
+		createTestEntityWithMapsIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("oneToOne");
+		OrmOneToOneMapping2_0 contextMapping = (OrmOneToOneMapping2_0) contextAttribute.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlMapsId_2_0 resourceMapping = resourceEntity.getAttributes().getOneToOnes().get(0);
+		
+		assertNull(resourceMapping.getMapsId());
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		resourceMapping.setMapsId("foo");
+		assertEquals("foo", resourceMapping.getMapsId());
+		assertEquals("foo", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		resourceMapping.setMapsId("bar");
+		assertEquals("bar", resourceMapping.getMapsId());
+		assertEquals("bar", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		resourceMapping.setMapsId(null);
+		assertNull(resourceMapping.getMapsId());
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+	
+	public void testSetMapsId() throws Exception {
+		createTestEntityWithMapsIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("oneToOne");
+		OrmOneToOneMapping2_0 contextMapping = (OrmOneToOneMapping2_0) contextAttribute.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlMapsId_2_0 resourceMapping = resourceEntity.getAttributes().getOneToOnes().get(0);
+		
+		assertNull(resourceMapping.getMapsId());
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue("foo");
+		assertEquals("foo", resourceMapping.getMapsId());
+		assertEquals("foo", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue("bar");
+		assertEquals("bar", resourceMapping.getMapsId());
+		assertEquals("bar", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue(null);
+		assertNull(resourceMapping.getMapsId());
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+	
+	public void testMorphMapping() throws Exception {
+		createTestEntityWithMapsIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute contextAttribute = (OrmPersistentAttribute) contextType.getAttributeNamed("oneToOne");
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		
+		XmlOneToOne resourceOneToOne = resourceEntity.getAttributes().getOneToOnes().get(0);
+		resourceOneToOne.setMapsId("foo");
+		assertNull(resourceOneToOne.getId());
+		assertFalse(((OrmOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertEquals("foo", resourceOneToOne.getMapsId());
+		assertEquals("foo", ((OrmOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextAttribute.setMappingKey(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		XmlManyToOne resourceManyToOne = resourceEntity.getAttributes().getManyToOnes().get(0);
+		assertNull(resourceManyToOne.getId());
+		assertFalse(((OrmManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertEquals("foo", resourceManyToOne.getMapsId());
+		assertEquals("foo", ((OrmManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextAttribute.setMappingKey(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		resourceOneToOne = resourceEntity.getAttributes().getOneToOnes().get(0);
+		assertNull(resourceOneToOne.getId());
+		assertFalse(((OrmOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertEquals("foo", resourceOneToOne.getMapsId());
+		assertEquals("foo", ((OrmOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+	
+	public void testCandidateMappedByAttributeNames() throws Exception {
+		createTestEntityWithValidOneToOneMapping();
+		createTestTargetEntityAddress();
+		createTestEmbeddableState();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "address");
+
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ReadOnlyPersistentAttribute persistentAttribute = ormPersistentType.attributes().next();
+		OneToOneMapping oneToOneMapping = (OneToOneMapping) persistentAttribute.getMapping();
+
+		Iterator<String> attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		oneToOneMapping.setSpecifiedTargetEntity("foo");
+		attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertFalse(attributeNames.hasNext());
+		
+		oneToOneMapping.setSpecifiedTargetEntity(null);
+		attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		AttributeMapping stateFooMapping = oneToOneMapping.getResolvedTargetEntity().resolveAttributeMapping("state.foo");
+		assertEquals("foo", stateFooMapping.getName());
+	}
+
+	public void testCandidateMappedByAttributeNamesElementCollection() throws Exception {
+		createTestEntityWithValidOneToOneMapping();
+		createTestTargetEntityAddressWithElementCollection();
+		createTestEmbeddableState();
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		getEntityMappings().addPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".State");
+		ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "address");
+
+		addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME);
+		addXmlClassRef(PACKAGE_NAME + ".Address");
+		addXmlClassRef(PACKAGE_NAME + ".State");
+		
+		ReadOnlyPersistentAttribute persistentAttribute = ormPersistentType.attributes().next();
+		OneToOneMapping oneToOneMapping = (OneToOneMapping) persistentAttribute.getMapping();
+
+		Iterator<String> attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		oneToOneMapping.setSpecifiedTargetEntity("foo");
+		attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertFalse(attributeNames.hasNext());
+		
+		oneToOneMapping.setSpecifiedTargetEntity(null);
+		attributeNames = 
+			oneToOneMapping.getRelationship().getMappedByStrategy().candidateMappedByAttributeNames();
+		assertEquals("id", attributeNames.next());
+		assertEquals("city", attributeNames.next());
+		assertEquals("state", attributeNames.next());
+		assertEquals("state.foo", attributeNames.next());
+		assertEquals("state.address", attributeNames.next());
+		assertEquals("zip", attributeNames.next());
+		assertFalse(attributeNames.hasNext());
+		
+		AttributeMapping stateFooMapping = oneToOneMapping.getResolvedTargetEntity().resolveAttributeMapping("state.foo");
+		assertEquals("foo", stateFooMapping.getName());
+	}
+
+	private OrmOrphanRemovable2_0 getOrphanRemovalOf(OneToOneMapping2_0 oneToOneMapping) {
+		return ((OrmOrphanRemovalHolder2_0) oneToOneMapping).getOrphanRemoval();
+	}
+	
+	public void testUpdateSpecifiedOrphanRemoval() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "oneToOneMapping");
+		OrmOneToOneMapping2_0 ormOneToOneMapping = (OrmOneToOneMapping2_0) ormPersistentAttribute.getMapping();
+		OrmOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(ormOneToOneMapping);
+		XmlOneToOne oneToOneResource = getXmlEntityMappings().getEntities().get(0).getAttributes().getOneToOnes().get(0);
+		
+		assertEquals(null, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertEquals(null, oneToOneResource.getOrphanRemoval());
+				
+		//set enumerated in the resource model, verify context model updated
+		oneToOneResource.setOrphanRemoval(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertEquals(Boolean.TRUE, oneToOneResource.getOrphanRemoval());
+	
+		oneToOneResource.setOrphanRemoval(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertEquals(Boolean.FALSE, oneToOneResource.getOrphanRemoval());
+	}
+	
+	public void testModifySpecifiedOrphanRemoval() throws Exception {
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo");
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "oneToOneMapping");
+		OrmOneToOneMapping2_0 ormOneToOneMapping = (OrmOneToOneMapping2_0) ormPersistentAttribute.getMapping();
+		OrmOrphanRemovable2_0 mappingsOrphanRemoval = this.getOrphanRemovalOf(ormOneToOneMapping);
+		XmlOneToOne oneToOneResource = getXmlEntityMappings().getEntities().get(0).getAttributes().getOneToOnes().get(0);
+		
+		assertEquals(null, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+		assertEquals(null, oneToOneResource.getOrphanRemoval());
+
+		//set enumerated in the context model, verify resource model updated
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, oneToOneResource.getOrphanRemoval());
+		assertEquals(Boolean.TRUE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+	
+		mappingsOrphanRemoval.setSpecifiedOrphanRemoval(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, oneToOneResource.getOrphanRemoval());
+		assertEquals(Boolean.FALSE, mappingsOrphanRemoval.getSpecifiedOrphanRemoval());
+	}
+
+	public void testVirtualJoinTable() throws Exception {
+		createTestEntityWithValidOneToOneMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+		JavaOneToOneMapping2_0 javaOneToOneMapping = ((JavaOneToOneMapping2_0) ormPersistentAttribute.getJavaPersistentAttribute().getMapping());
+		OneToOneMapping2_0 virtualOneToOneMapping = (OneToOneMapping2_0) ormPersistentAttribute.getMapping();
+		((OneToOneRelationship2_0) javaOneToOneMapping.getRelationship()).setStrategyToJoinTable();
+		JoinTable virtualJoinTable = ((OneToOneRelationship2_0) virtualOneToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertEquals(null, virtualJoinTable.getSpecifiedName());
+
+		createTestTargetEntityAddress();
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		assertEquals(TYPE_NAME + "_Address", virtualJoinTable.getName());
+		assertNull(virtualJoinTable.getSpecifiedCatalog());
+		assertNull(virtualJoinTable.getSpecifiedSchema());
+		assertEquals(0, virtualJoinTable.specifiedJoinColumnsSize());
+		assertEquals(0, virtualJoinTable.specifiedInverseJoinColumnsSize());
+		JoinColumn virtualJoinColumn = virtualJoinTable.getDefaultJoinColumn();
+		assertEquals(TYPE_NAME + "_Address", virtualJoinColumn.getDefaultTable());
+		assertEquals(TYPE_NAME + "_id", virtualJoinColumn.getDefaultName());
+		assertEquals("id", virtualJoinColumn.getDefaultReferencedColumnName());
+		JoinColumn virtualInverseOrmJoinColumn = virtualJoinTable.getDefaultInverseJoinColumn();
+		assertEquals(TYPE_NAME + "_Address", virtualInverseOrmJoinColumn.getDefaultTable());
+		assertEquals("address_id", virtualInverseOrmJoinColumn.getDefaultName());
+		assertEquals("id", virtualInverseOrmJoinColumn.getDefaultReferencedColumnName());
+
+		JavaJoinTable javaJoinTable = ((JavaOneToOneRelationship2_0) javaOneToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		javaJoinTable.setSpecifiedName("FOO");
+		javaJoinTable.setSpecifiedCatalog("CATALOG");
+		javaJoinTable.setSpecifiedSchema("SCHEMA");
+		JavaJoinColumn javaJoinColumn = javaJoinTable.addSpecifiedJoinColumn(0);
+		javaJoinColumn.setSpecifiedName("NAME");
+		javaJoinColumn.setSpecifiedReferencedColumnName("REFERENCED_NAME");
+		JavaJoinColumn inverseJavaJoinColumn = javaJoinTable.addSpecifiedInverseJoinColumn(0);
+		inverseJavaJoinColumn.setSpecifiedName("INVERSE_NAME");
+		inverseJavaJoinColumn.setSpecifiedReferencedColumnName("INVERSE_REFERENCED_NAME");
+
+		assertEquals("FOO", virtualJoinTable.getSpecifiedName());
+		assertEquals("CATALOG", virtualJoinTable.getSpecifiedCatalog());
+		assertEquals("SCHEMA", virtualJoinTable.getSpecifiedSchema());
+		assertEquals(1, virtualJoinTable.specifiedJoinColumnsSize());
+		assertEquals(1, virtualJoinTable.specifiedInverseJoinColumnsSize());
+		virtualJoinColumn = virtualJoinTable.specifiedJoinColumns().next();
+		assertEquals("NAME", virtualJoinColumn.getSpecifiedName());
+		assertEquals("REFERENCED_NAME", virtualJoinColumn.getSpecifiedReferencedColumnName());
+		virtualInverseOrmJoinColumn = virtualJoinTable.specifiedInverseJoinColumns().next();
+		assertEquals("INVERSE_NAME", virtualInverseOrmJoinColumn.getSpecifiedName());
+		assertEquals("INVERSE_REFERENCED_NAME", virtualInverseOrmJoinColumn.getSpecifiedReferencedColumnName());
+	}
+
+	public void testUpdateDefaultNameFromJavaTable() throws Exception {
+		createTestEntityWithValidOneToOneMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, "address");
+		OrmOneToOneMapping2_0 ormOneToOneMapping = (OrmOneToOneMapping2_0) ormPersistentAttribute.getMapping();
+		((OneToOneRelationship2_0) ormOneToOneMapping.getRelationship()).setStrategyToJoinTable();
+		OrmJoinTable ormJoinTable = ((OrmOneToOneRelationship2_0) ormOneToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		assertEquals(null, ormJoinTable.getDefaultName());
+
+		createTestTargetEntityAddress();
+		OrmPersistentType targetPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(TYPE_NAME + "_Address", ormJoinTable.getDefaultName());
+
+
+		((JavaEntity) targetPersistentType.getJavaPersistentType().getMapping()).getTable().setSpecifiedName("FOO");
+		assertEquals(TYPE_NAME + "_FOO", ormJoinTable.getDefaultName());
+
+		((JavaEntity) ormPersistentType.getJavaPersistentType().getMapping()).getTable().setSpecifiedName("BAR");
+		assertEquals("BAR_FOO", ormJoinTable.getDefaultName());
+
+		JavaOneToOneMapping2_0 javaOneToOneMapping = (JavaOneToOneMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("address").getMapping();
+		((OneToOneRelationship2_0) javaOneToOneMapping.getRelationship()).setStrategyToJoinTable();
+		((OneToOneRelationship2_0) javaOneToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable().setSpecifiedName("JAVA_JOIN_TABLE");
+
+		assertEquals("BAR_FOO", ormJoinTable.getDefaultName());
+
+
+		//set metadata-complete to true, will ignore java annotation settings
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		//ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(TYPE_NAME + "_Address", ormJoinTable.getDefaultName());
+
+
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(false);
+		//remove m-m mapping from the orm.xml file
+		ormPersistentAttribute.convertToVirtual();
+		//ormPersistentType.getMapping().setSpecifiedMetadataComplete(null);
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("address");
+		OneToOneMapping2_0 virtualOneToOneMapping = (OneToOneMapping2_0) ormPersistentAttribute2.getMapping();
+		JoinTable virtualJoinTable = ((OneToOneRelationship2_0) virtualOneToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		assertTrue(ormPersistentAttribute2.isVirtual());
+		assertEquals("JAVA_JOIN_TABLE", virtualJoinTable.getSpecifiedName());//specifiedName since this is a virtual mapping now
+
+		((OneToOneRelationship2_0) javaOneToOneMapping.getRelationship()).getJoinTableStrategy().removeStrategy();
+		virtualJoinTable = ((OneToOneRelationship2_0) virtualOneToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		assertNull(virtualJoinTable);
+		((OneToOneRelationship2_0) javaOneToOneMapping.getRelationship()).setStrategyToJoinTable();
+		virtualJoinTable = ((OneToOneRelationship2_0) virtualOneToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		assertEquals("BAR_FOO", virtualJoinTable.getName());
+		assertEquals("BAR_FOO", virtualJoinTable.getDefaultName());
+
+		((OrmEntity) ormPersistentType.getMapping()).getTable().setSpecifiedName("ORM_TABLE_NAME");
+		assertEquals("ORM_TABLE_NAME_FOO", virtualJoinTable.getDefaultName());
+
+		((OrmEntity) targetPersistentType.getMapping()).getTable().setSpecifiedName("ORM_TARGET");
+		assertEquals("ORM_TABLE_NAME_ORM_TARGET", virtualJoinTable.getDefaultName());
+	}
+
+	public void testModifyPredominantJoiningStrategy() throws Exception {
+		createTestEntityWithOneToOneMapping();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("id");
+		OrmOneToOneMapping2_0 contextMapping = (OrmOneToOneMapping2_0) contextAttribute.getMapping();
+		OrmOneToOneRelationship2_0 rel = (OrmOneToOneRelationship2_0) contextMapping.getRelationship();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlOneToOne resourceMapping = resourceEntity.getAttributes().getOneToOnes().get(0);
+
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertTrue(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNull(resourceMapping.getMappedBy());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToMappedBy();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertTrue(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToPrimaryKeyJoinColumn();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertFalse(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNull(resourceMapping.getMappedBy());
+		assertNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinTable();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertTrue(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNull(resourceMapping.getMappedBy());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertTrue(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinColumn();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertTrue(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNull(resourceMapping.getMappedBy());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());	
+		assertFalse(rel.strategyIsJoinTable());
+	}
+
+	public void testUpdatePredominantJoiningStrategy() throws Exception {
+		createTestEntityWithOneToOneMapping();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("id");
+		OrmOneToOneMapping2_0 contextMapping = (OrmOneToOneMapping2_0) contextAttribute.getMapping();
+		OrmOneToOneRelationship2_0 rel = (OrmOneToOneRelationship2_0) contextMapping.getRelationship();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlOneToOne resourceMapping = resourceEntity.getAttributes().getOneToOnes().get(0);
+
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertTrue(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNull(resourceMapping.getMappedBy());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.getPrimaryKeyJoinColumns().add(OrmFactory.eINSTANCE.createXmlPrimaryKeyJoinColumn());
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertFalse(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNull(resourceMapping.getMappedBy());
+		assertNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.getJoinColumns().add(OrmFactory.eINSTANCE.createXmlJoinColumn());
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertFalse(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNull(resourceMapping.getMappedBy());
+		assertNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.setMappedBy("foo");
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertFalse(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.setJoinTable(OrmFactory.eINSTANCE.createXmlJoinTable());
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertFalse(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.getPrimaryKeyJoinColumns().clear();
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertTrue(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.getJoinColumns().clear();
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertTrue(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getMappedBy());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertTrue(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.setMappedBy(null);
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertTrue(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNull(resourceMapping.getMappedBy());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertTrue(rel.strategyIsJoinTable());
+
+		resourceMapping.setJoinTable(null);
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertTrue(resourceMapping.getPrimaryKeyJoinColumns().isEmpty());
+		assertNull(resourceMapping.getMappedBy());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsPrimaryKeyJoinColumn());
+		assertFalse(rel.strategyIsMappedBy());
+		assertFalse(rel.strategyIsJoinTable());
+	}
+
+	public void testVirtualMappingMetadataCompleteFalse() throws Exception {
+		createTestEntityOneToOneMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.virtualAttributes().next();
+
+		EclipseLinkOneToOneMapping2_0 virtualOneToOneMapping = (EclipseLinkOneToOneMapping2_0) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualOneToOneMapping.getName());
+		assertEquals(FetchType.LAZY, virtualOneToOneMapping.getSpecifiedFetch());
+		assertEquals(Boolean.FALSE, virtualOneToOneMapping.getSpecifiedOptional());
+		assertEquals("Address", virtualOneToOneMapping.getSpecifiedTargetEntity());
+		assertNull(virtualOneToOneMapping.getRelationship().
+			getMappedByStrategy().getMappedByAttribute());
+
+		JoinColumn ormJoinColumn = 
+			virtualOneToOneMapping.getRelationship().getJoinColumnStrategy().specifiedJoinColumns().next();
+		assertEquals("MY_COLUMN", ormJoinColumn.getSpecifiedName());
+		assertEquals("MY_REFERENCED_COLUMN", ormJoinColumn.getSpecifiedReferencedColumnName());
+		assertEquals(Boolean.TRUE, ormJoinColumn.getSpecifiedUnique());
+		assertEquals(Boolean.FALSE, ormJoinColumn.getSpecifiedNullable());
+		assertEquals(Boolean.FALSE, ormJoinColumn.getSpecifiedInsertable());
+		assertEquals(Boolean.FALSE, ormJoinColumn.getSpecifiedUpdatable());
+		assertEquals("COLUMN_DEFINITION", ormJoinColumn.getColumnDefinition());
+		assertEquals("MY_TABLE", ormJoinColumn.getSpecifiedTable());
+
+		Cascade2_0 cascade = (Cascade2_0) virtualOneToOneMapping.getCascade();
+		assertTrue(cascade.isAll());
+		assertTrue(cascade.isMerge());
+		assertTrue(cascade.isPersist());
+		assertTrue(cascade.isRemove());
+		assertTrue(cascade.isRefresh());
+		assertTrue(cascade.isDetach());
+
+		assertEquals(EclipseLinkJoinFetchType.INNER, virtualOneToOneMapping.getJoinFetch().getValue());
+		assertTrue(virtualOneToOneMapping.getPrivateOwned().isPrivateOwned());
+
+		assertTrue(((OrphanRemovalHolder2_0) virtualOneToOneMapping).getOrphanRemoval().isOrphanRemoval());
+	}
+
+	public void testVirtualMappingMetadataCompleteTrue() throws Exception {
+		createTestEntityOneToOneMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, virtualPersistentAttribute.getMappingKey());
+		assertTrue(virtualPersistentAttribute.isVirtual());
+
+		EclipseLinkOneToOneMapping2_0 ormOneToOneMapping = (EclipseLinkOneToOneMapping2_0) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", ormOneToOneMapping.getName());
+		assertEquals(FetchType.EAGER, ormOneToOneMapping.getFetch());
+		assertEquals(true, ormOneToOneMapping.isOptional());
+		assertEquals("test.Address", ormOneToOneMapping.getTargetEntity());
+		assertNull(ormOneToOneMapping.getRelationship().getMappedByStrategy().getMappedByAttribute());
+
+		//TODO default join columns in xml one-to-one
+//		XmlJoinColumn ormJoinColumn = ormOneToOneMapping.specifiedJoinColumns().next();
+//		//TODO java default columns name in JavaSingleRelationshipMapping.JoinColumnOwner
+//		//assertEquals("address", ormJoinColumn.getSpecifiedName());
+//		//assertEquals("address", ormJoinColumn.getSpecifiedReferencedColumnName());
+//		assertEquals(Boolean.FALSE, ormJoinColumn.getSpecifiedUnique());
+//		assertEquals(Boolean.TRUE, ormJoinColumn.getSpecifiedNullable());
+//		assertEquals(Boolean.TRUE, ormJoinColumn.getSpecifiedInsertable());
+//		assertEquals(Boolean.TRUE, ormJoinColumn.getSpecifiedUpdatable());
+//		assertNull(ormJoinColumn.getColumnDefinition());
+//		assertEquals(TYPE_NAME, ormJoinColumn.getSpecifiedTable());
+
+		Cascade2_0 cascade = (Cascade2_0) ormOneToOneMapping.getCascade();
+		assertFalse(cascade.isAll());
+		assertFalse(cascade.isMerge());
+		assertFalse(cascade.isPersist());
+		assertFalse(cascade.isRemove());
+		assertFalse(cascade.isRefresh());
+		assertFalse(cascade.isDetach());
+
+		assertEquals(null, ormOneToOneMapping.getJoinFetch().getValue());
+		assertFalse(ormOneToOneMapping.getPrivateOwned().isPrivateOwned());
+
+		assertFalse(((OrphanRemovalHolder2_0) ormOneToOneMapping).getOrphanRemoval().isOrphanRemoval());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/Eclipselink2_0OrmManyToOneMappingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/Eclipselink2_0OrmManyToOneMappingTests.java
new file mode 100644
index 0000000..3200bdf
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/Eclipselink2_0OrmManyToOneMappingTests.java
@@ -0,0 +1,589 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import java.util.Iterator;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.jpa.core.MappingKeys;
+import org.eclipse.jpt.jpa.core.context.FetchType;
+import org.eclipse.jpt.jpa.core.context.JoinColumn;
+import org.eclipse.jpt.jpa.core.context.JoinTable;
+import org.eclipse.jpt.jpa.core.context.java.JavaEntity;
+import org.eclipse.jpt.jpa.core.context.java.JavaJoinColumn;
+import org.eclipse.jpt.jpa.core.context.java.JavaJoinTable;
+import org.eclipse.jpt.jpa.core.context.orm.OrmEntity;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmReadOnlyPersistentAttribute;
+import org.eclipse.jpt.jpa.core.jpa2.context.Cascade2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.ManyToOneRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaManyToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaManyToOneRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmManyToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmManyToOneRelationship2_0;
+import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmOneToOneMapping2_0;
+import org.eclipse.jpt.jpa.core.jpa2.resource.java.JPA2_0;
+import org.eclipse.jpt.jpa.core.resource.java.JPA;
+import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlEntity;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlManyToOne;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlOneToOne;
+import org.eclipse.jpt.jpa.core.resource.orm.v2_0.XmlDerivedId_2_0;
+import org.eclipse.jpt.jpa.core.resource.orm.v2_0.XmlMapsId_2_0;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchMapping;
+import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkJoinFetchType;
+import org.eclipse.jpt.jpa.eclipselink.core.resource.java.EclipseLink;
+
+@SuppressWarnings("nls")
+public class Eclipselink2_0OrmManyToOneMappingTests
+	extends EclipseLink2_0OrmContextModelTestCase
+{
+	public Eclipselink2_0OrmManyToOneMappingTests(String name) {
+		super(name);
+	}
+	
+	
+	private void createTestEntityWithIdDerivedIdentity() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToOne @Id").append(CR);				
+				sb.append("    private " + TYPE_NAME + " manyToOne;").append(CR);
+				sb.append(CR);				
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+	
+	private void createTestEntityWithMapsIdDerivedIdentity() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE, JPA2_0.MAPS_ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToOne @MapsId").append(CR);				
+				sb.append("    private " + TYPE_NAME + " manyToOne;").append(CR);
+				sb.append(CR);				
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+	
+	private ICompilationUnit createTestEntityWithValidManyToOneMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE, JPA.ID);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToOne").append(CR);				
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);				
+			}
+		});
+	}
+	
+	private void createTestTargetEntityAddress() throws Exception {
+		SourceWriter sourceWriter = new SourceWriter() {
+			public void appendSourceTo(StringBuilder sb) {
+				sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ENTITY);
+					sb.append(";");
+					sb.append(CR);
+					sb.append("import ");
+					sb.append(JPA.ID);
+					sb.append(";");
+					sb.append(CR);
+				sb.append(CR);
+				sb.append("@Entity");
+				sb.append(CR);
+				sb.append("public class ").append("Address").append(" ");
+				sb.append("{").append(CR);
+				sb.append(CR);
+				sb.append("    @Id").append(CR);
+				sb.append("    private int id;").append(CR);
+				sb.append(CR);
+				sb.append("    private String city;").append(CR);
+				sb.append(CR);
+				sb.append("    private State state;").append(CR);
+				sb.append(CR);
+				sb.append("    private int zip;").append(CR);
+				sb.append(CR);
+				sb.append("}").append(CR);
+		}
+		};
+		this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter);
+	}
+
+	private void createTestEntityWithManyToOneMapping() throws Exception {
+		createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity").append(CR);
+			}
+			
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append("@ManyToOne").append(CR);
+			}
+		});
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		for (OrmReadOnlyPersistentAttribute each : CollectionTools.iterable(ormPersistentType.attributes())) {
+			each.convertToSpecified();
+		}
+	}
+	
+	private ICompilationUnit createTestEntityManyToOneMapping() throws Exception {
+		return this.createTestType(new DefaultAnnotationWriter() {
+			@Override
+			public Iterator<String> imports() {
+				return new ArrayIterator<String>(JPA.ENTITY, JPA.MANY_TO_ONE, JPA.JOIN_COLUMN, JPA.FETCH_TYPE, JPA.CASCADE_TYPE, EclipseLink.JOIN_FETCH, EclipseLink.JOIN_FETCH_TYPE);
+			}
+			@Override
+			public void appendTypeAnnotationTo(StringBuilder sb) {
+				sb.append("@Entity");
+			}
+
+			@Override
+			public void appendIdFieldAnnotationTo(StringBuilder sb) {
+				sb.append(CR);
+				sb.append("    @ManyToOne(fetch=FetchType.LAZY, optional=false, targetEntity=Address.class, cascade={CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH})");
+				sb.append(CR);
+				sb.append("    @JoinColumn(name=\"MY_COLUMN\", referencedColumnName=\"MY_REFERENCED_COLUMN\", unique=true, nullable=false, insertable=false, updatable=false, columnDefinition=\"COLUMN_DEFINITION\", table=\"MY_TABLE\")");
+				sb.append(CR);
+				sb.append("    @JoinFetch(JoinFetchType.INNER)");
+				sb.append(CR);
+				sb.append("    private Address address;").append(CR);
+				sb.append(CR);
+				sb.append("    @Id");				
+			}
+		});
+	}	
+
+	public void testUpdateDerivedId() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("manyToOne");
+		OrmManyToOneMapping2_0 contextMapping = (OrmManyToOneMapping2_0) contextAttribute.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlDerivedId_2_0 resourceMapping = resourceEntity.getAttributes().getManyToOnes().get(0);
+		
+		assertNull(resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceMapping.setId(Boolean.FALSE);
+		assertEquals(Boolean.FALSE, resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceMapping.setId(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceMapping.getId());
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		resourceMapping.setId(null);
+		assertNull(resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+	}
+	
+	public void testSetDerivedId() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("manyToOne");
+		OrmManyToOneMapping2_0 contextMapping = (OrmManyToOneMapping2_0) contextAttribute.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlDerivedId_2_0 resourceMapping = resourceEntity.getAttributes().getManyToOnes().get(0);
+		
+		assertNull(resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().setValue(true);
+		assertEquals(Boolean.TRUE, resourceMapping.getId());
+		assertTrue(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		
+		contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().setValue(false);
+		assertNull(resourceMapping.getId());
+		assertFalse(contextMapping.getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+	}
+	
+	public void testUpdateMapsId() throws Exception {
+		createTestEntityWithMapsIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("manyToOne");
+		OrmManyToOneMapping2_0 contextMapping = (OrmManyToOneMapping2_0) contextAttribute.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlMapsId_2_0 resourceMapping = resourceEntity.getAttributes().getManyToOnes().get(0);
+		
+		assertNull(resourceMapping.getMapsId());
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		resourceMapping.setMapsId("foo");
+		assertEquals("foo", resourceMapping.getMapsId());
+		assertEquals("foo", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		resourceMapping.setMapsId("bar");
+		assertEquals("bar", resourceMapping.getMapsId());
+		assertEquals("bar", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		resourceMapping.setMapsId(null);
+		assertNull(resourceMapping.getMapsId());
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+	
+	public void testSetMapsId() throws Exception {
+		createTestEntityWithMapsIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("manyToOne");
+		OrmManyToOneMapping2_0 contextMapping = (OrmManyToOneMapping2_0) contextAttribute.getMapping();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlMapsId_2_0 resourceMapping = resourceEntity.getAttributes().getManyToOnes().get(0);
+		
+		assertNull(resourceMapping.getMapsId());
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue("foo");
+		assertEquals("foo", resourceMapping.getMapsId());
+		assertEquals("foo", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue("bar");
+		assertEquals("bar", resourceMapping.getMapsId());
+		assertEquals("bar", contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().setSpecifiedValue(null);
+		assertNull(resourceMapping.getMapsId());
+		assertNull(contextMapping.getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+	
+	public void testMorphMapping() throws Exception {
+		createTestEntityWithIdDerivedIdentity();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmPersistentAttribute contextAttribute = (OrmPersistentAttribute) contextType.getAttributeNamed("manyToOne");
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		
+		XmlManyToOne resourceManyToOne = resourceEntity.getAttributes().getManyToOnes().get(0);
+		resourceManyToOne.setId(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceManyToOne.getId());
+		assertTrue(((OrmManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertNull(resourceManyToOne.getMapsId());
+		assertNull(((OrmManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+		
+		contextAttribute.setMappingKey(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		XmlOneToOne resourceOneToOne = resourceEntity.getAttributes().getOneToOnes().get(0);
+		assertEquals(Boolean.TRUE, resourceOneToOne.getId());
+		assertTrue(((OrmOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertNull(resourceOneToOne.getMapsId());
+		assertNull(((OrmOneToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+
+		contextAttribute.setMappingKey(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		resourceManyToOne.setId(Boolean.TRUE);
+		assertEquals(Boolean.TRUE, resourceManyToOne.getId());
+		assertTrue(((OrmManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getIdDerivedIdentityStrategy().getValue());
+		assertNull(resourceManyToOne.getMapsId());
+		assertNull(((OrmManyToOneMapping2_0) contextAttribute.getMapping()).
+				getDerivedIdentity().getMapsIdDerivedIdentityStrategy().getSpecifiedValue());
+	}
+
+	public void testVirtualJoinTable() throws Exception {
+		createTestEntityWithValidManyToOneMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+		JavaManyToOneMapping2_0 javaManyToOneMapping = ((JavaManyToOneMapping2_0) ormPersistentAttribute.getJavaPersistentAttribute().getMapping());
+		ManyToOneMapping2_0 virtualManyToOneMapping = (ManyToOneMapping2_0) ormPersistentAttribute.getMapping();
+		((ManyToOneRelationship2_0) javaManyToOneMapping.getRelationship()).setStrategyToJoinTable();
+		JoinTable ormJoinTable = ((ManyToOneRelationship2_0) virtualManyToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+
+		assertTrue(ormPersistentAttribute.isVirtual());
+		assertEquals(null, ormJoinTable.getSpecifiedName());
+
+		createTestTargetEntityAddress();
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+
+		assertEquals(TYPE_NAME + "_Address", ormJoinTable.getName());
+		assertNull(ormJoinTable.getSpecifiedCatalog());
+		assertNull(ormJoinTable.getSpecifiedSchema());
+		assertEquals(0, ormJoinTable.specifiedJoinColumnsSize());
+		assertEquals(0, ormJoinTable.specifiedInverseJoinColumnsSize());
+		JoinColumn ormJoinColumn = ormJoinTable.getDefaultJoinColumn();
+		assertEquals(TYPE_NAME + "_Address", ormJoinColumn.getDefaultTable());
+		assertEquals(TYPE_NAME + "_id", ormJoinColumn.getDefaultName());
+		assertEquals("id", ormJoinColumn.getDefaultReferencedColumnName());
+		JoinColumn inverseOrmJoinColumn = ormJoinTable.getDefaultInverseJoinColumn();
+		assertEquals(TYPE_NAME + "_Address", inverseOrmJoinColumn.getDefaultTable());
+		assertEquals("address_id", inverseOrmJoinColumn.getDefaultName());
+		assertEquals("id", inverseOrmJoinColumn.getDefaultReferencedColumnName());
+
+		JavaJoinTable javaJoinTable = ((JavaManyToOneRelationship2_0) javaManyToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		javaJoinTable.setSpecifiedName("FOO");
+		javaJoinTable.setSpecifiedCatalog("CATALOG");
+		javaJoinTable.setSpecifiedSchema("SCHEMA");
+		JavaJoinColumn javaJoinColumn = javaJoinTable.addSpecifiedJoinColumn(0);
+		javaJoinColumn.setSpecifiedName("NAME");
+		javaJoinColumn.setSpecifiedReferencedColumnName("REFERENCED_NAME");
+		JavaJoinColumn inverseJavaJoinColumn = javaJoinTable.addSpecifiedInverseJoinColumn(0);
+		inverseJavaJoinColumn.setSpecifiedName("INVERSE_NAME");
+		inverseJavaJoinColumn.setSpecifiedReferencedColumnName("INVERSE_REFERENCED_NAME");
+
+		assertEquals("FOO", ormJoinTable.getSpecifiedName());
+		assertEquals("CATALOG", ormJoinTable.getSpecifiedCatalog());
+		assertEquals("SCHEMA", ormJoinTable.getSpecifiedSchema());
+		assertEquals(1, ormJoinTable.specifiedJoinColumnsSize());
+		assertEquals(1, ormJoinTable.specifiedInverseJoinColumnsSize());
+		ormJoinColumn = ormJoinTable.specifiedJoinColumns().next();
+		assertEquals("NAME", ormJoinColumn.getSpecifiedName());
+		assertEquals("REFERENCED_NAME", ormJoinColumn.getSpecifiedReferencedColumnName());
+		inverseOrmJoinColumn = ormJoinTable.specifiedInverseJoinColumns().next();
+		assertEquals("INVERSE_NAME", inverseOrmJoinColumn.getSpecifiedName());
+		assertEquals("INVERSE_REFERENCED_NAME", inverseOrmJoinColumn.getSpecifiedReferencedColumnName());
+	}
+
+	public void testUpdateDefaultNameFromJavaTable() throws Exception {
+		createTestEntityWithValidManyToOneMapping();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedAttribute(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY, "address");
+		OrmManyToOneMapping2_0 ormManyToOneMapping = (OrmManyToOneMapping2_0) ormPersistentAttribute.getMapping();
+		((ManyToOneRelationship2_0) ormManyToOneMapping.getRelationship()).setStrategyToJoinTable();
+		JoinTable ormJoinTable = ((OrmManyToOneRelationship2_0) ormManyToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		assertEquals(null, ormJoinTable.getDefaultName());
+
+		createTestTargetEntityAddress();
+		OrmPersistentType targetPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(TYPE_NAME + "_Address", ormJoinTable.getDefaultName());
+
+
+		((JavaEntity) targetPersistentType.getJavaPersistentType().getMapping()).getTable().setSpecifiedName("FOO");
+		assertEquals(TYPE_NAME + "_FOO", ormJoinTable.getDefaultName());
+
+		((JavaEntity) ormPersistentType.getJavaPersistentType().getMapping()).getTable().setSpecifiedName("BAR");
+		assertEquals("BAR_FOO", ormJoinTable.getDefaultName());
+
+		JavaManyToOneMapping2_0 javaManyToOneMapping = (JavaManyToOneMapping2_0) ormPersistentType.getJavaPersistentType().getAttributeNamed("address").getMapping();
+		((ManyToOneRelationship2_0) javaManyToOneMapping.getRelationship()).setStrategyToJoinTable();
+		((ManyToOneRelationship2_0) javaManyToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable().setSpecifiedName("JAVA_JOIN_TABLE");
+
+		assertEquals("BAR_FOO", ormJoinTable.getDefaultName());
+
+
+		//set metadata-complete to true, will ignore java annotation settings
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(true);
+		//ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(TYPE_NAME + "_Address", ormJoinTable.getDefaultName());
+
+
+		getEntityMappings().getPersistenceUnitMetadata().setXmlMappingMetadataComplete(false);
+		//remove m-m mapping from the orm.xml file
+		ormPersistentAttribute.convertToVirtual();
+		//ormPersistentType.getMapping().setSpecifiedMetadataComplete(null);
+		OrmReadOnlyPersistentAttribute ormPersistentAttribute2 = ormPersistentType.getAttributeNamed("address");
+		ManyToOneMapping2_0 virtualManyToOneMapping = (ManyToOneMapping2_0) ormPersistentAttribute2.getMapping();
+		ormJoinTable = ((ManyToOneRelationship2_0) virtualManyToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		assertTrue(ormPersistentAttribute2.isVirtual());
+		assertEquals("JAVA_JOIN_TABLE", ormJoinTable.getSpecifiedName());//specifiedName since this is a virtual mapping now
+
+		((ManyToOneRelationship2_0) javaManyToOneMapping.getRelationship()).getJoinTableStrategy().removeStrategy();
+		ormJoinTable = ((ManyToOneRelationship2_0) virtualManyToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		assertNull(ormJoinTable);
+		((ManyToOneRelationship2_0) javaManyToOneMapping.getRelationship()).setStrategyToJoinTable();
+		ormJoinTable = ((ManyToOneRelationship2_0) virtualManyToOneMapping.getRelationship()).getJoinTableStrategy().getJoinTable();
+		assertEquals("BAR_FOO", ormJoinTable.getName());
+		assertEquals("BAR_FOO", ormJoinTable.getDefaultName());
+
+		((OrmEntity) ormPersistentType.getMapping()).getTable().setSpecifiedName("ORM_TABLE_NAME");
+		assertEquals("ORM_TABLE_NAME_FOO", ormJoinTable.getDefaultName());
+
+		((OrmEntity) targetPersistentType.getMapping()).getTable().setSpecifiedName("ORM_TARGET");
+		assertEquals("ORM_TABLE_NAME_ORM_TARGET", ormJoinTable.getDefaultName());
+	}
+
+	public void testModifyPredominantJoiningStrategy() throws Exception {
+		createTestEntityWithManyToOneMapping();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("id");
+		OrmManyToOneMapping2_0 contextMapping = (OrmManyToOneMapping2_0) contextAttribute.getMapping();
+		OrmManyToOneRelationship2_0 rel = (OrmManyToOneRelationship2_0) contextMapping.getRelationship();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlManyToOne resourceMapping = resourceEntity.getAttributes().getManyToOnes().get(0);
+
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinColumn();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinTable();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+
+		rel.setStrategyToJoinColumn();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+	}
+
+	public void testUpdatePredominantJoiningStrategy() throws Exception {
+		createTestEntityWithManyToOneMapping();
+		OrmPersistentType contextType = getEntityMappings().getPersistentType(FULLY_QUALIFIED_TYPE_NAME);
+		OrmReadOnlyPersistentAttribute contextAttribute = contextType.getAttributeNamed("id");
+		OrmManyToOneMapping2_0 contextMapping = (OrmManyToOneMapping2_0) contextAttribute.getMapping();
+		OrmManyToOneRelationship2_0 rel = (OrmManyToOneRelationship2_0) contextMapping.getRelationship();
+		XmlEntity resourceEntity = (XmlEntity) contextType.getMapping().getXmlTypeMapping();
+		XmlManyToOne resourceMapping = resourceEntity.getAttributes().getManyToOnes().get(0);
+
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.getJoinColumns().add(OrmFactory.eINSTANCE.createXmlJoinColumn());
+		getJpaProject().synchronizeContextModel();
+		assertFalse(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.getJoinColumns().clear();
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNull(resourceMapping.getJoinTable());
+		assertTrue(rel.strategyIsJoinColumn());
+		assertFalse(rel.strategyIsJoinTable());
+
+		resourceMapping.setJoinTable(OrmFactory.eINSTANCE.createXmlJoinTable());
+		getJpaProject().synchronizeContextModel();
+		assertTrue(resourceMapping.getJoinColumns().isEmpty());
+		assertNotNull(resourceMapping.getJoinTable());
+		assertFalse(rel.strategyIsJoinColumn());
+		assertTrue(rel.strategyIsJoinTable());
+	}
+
+	public void testVirtualMappingMetadataCompleteFalse() throws Exception {
+		createTestEntityManyToOneMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.virtualAttributes().next();
+
+		ManyToOneMapping2_0 virtualManyToOneMapping = (ManyToOneMapping2_0) virtualPersistentAttribute.getMapping();	
+		assertEquals("address", virtualManyToOneMapping.getName());
+		assertEquals(FetchType.LAZY, virtualManyToOneMapping.getSpecifiedFetch());
+		assertEquals(Boolean.FALSE, virtualManyToOneMapping.getSpecifiedOptional());
+		assertEquals("Address", virtualManyToOneMapping.getSpecifiedTargetEntity());
+
+		JoinColumn virtualJoinColumn = virtualManyToOneMapping.getRelationship().getJoinColumnStrategy().specifiedJoinColumns().next();
+		assertEquals("MY_COLUMN", virtualJoinColumn.getSpecifiedName());
+		assertEquals("MY_REFERENCED_COLUMN", virtualJoinColumn.getSpecifiedReferencedColumnName());
+		assertEquals(Boolean.TRUE, virtualJoinColumn.getSpecifiedUnique());
+		assertEquals(Boolean.FALSE, virtualJoinColumn.getSpecifiedNullable());
+		assertEquals(Boolean.FALSE, virtualJoinColumn.getSpecifiedInsertable());
+		assertEquals(Boolean.FALSE, virtualJoinColumn.getSpecifiedUpdatable());
+		assertEquals("COLUMN_DEFINITION", virtualJoinColumn.getColumnDefinition());
+		assertEquals("MY_TABLE", virtualJoinColumn.getSpecifiedTable());
+
+		Cascade2_0 cascade = (Cascade2_0) virtualManyToOneMapping.getCascade();
+		assertTrue(cascade.isAll());
+		assertTrue(cascade.isMerge());
+		assertTrue(cascade.isPersist());
+		assertTrue(cascade.isRemove());
+		assertTrue(cascade.isRefresh());
+		assertTrue(cascade.isDetach());
+
+		assertEquals(EclipseLinkJoinFetchType.INNER, ((EclipseLinkJoinFetchMapping) virtualManyToOneMapping).getJoinFetch().getValue());
+	}
+
+	public void testVirtualMappingMetadataCompleteTrue() throws Exception {
+		createTestEntityManyToOneMapping();
+		createTestTargetEntityAddress();
+
+		OrmPersistentType ormPersistentType = getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME);
+		getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address");
+		ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE);
+		assertEquals(3, ormPersistentType.virtualAttributesSize());		
+		OrmReadOnlyPersistentAttribute virtualPersistentAttribute = ormPersistentType.getAttributeNamed("address");
+
+		assertEquals(MappingKeys.ONE_TO_ONE_ATTRIBUTE_MAPPING_KEY, virtualPersistentAttribute.getMappingKey());
+		assertTrue(virtualPersistentAttribute.isVirtual());
+
+		virtualPersistentAttribute.convertToSpecified(MappingKeys.MANY_TO_ONE_ATTRIBUTE_MAPPING_KEY);
+		OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.specifiedAttributes().next();
+
+		OrmManyToOneMapping2_0 ormManyToOneMapping = (OrmManyToOneMapping2_0) ormPersistentAttribute.getMapping();	
+		assertEquals("address", ormManyToOneMapping.getName());
+		assertEquals(FetchType.EAGER, ormManyToOneMapping.getDefaultFetch());
+		assertEquals(true, ormManyToOneMapping.isDefaultOptional());
+		assertEquals("test.Address", ormManyToOneMapping.getDefaultTargetEntity());
+
+		Cascade2_0 cascade = (Cascade2_0) ormManyToOneMapping.getCascade();
+		assertFalse(cascade.isAll());
+		assertFalse(cascade.isMerge());
+		assertFalse(cascade.isPersist());
+		assertFalse(cascade.isRemove());
+		assertFalse(cascade.isRefresh());
+		assertFalse(cascade.isDetach());
+
+		assertEquals(null, ((EclipseLinkJoinFetchMapping) ormManyToOneMapping).getJoinFetch().getValue());
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/JptEclipseLink2_0OrmContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/JptEclipseLink2_0OrmContextModelTests.java
new file mode 100644
index 0000000..afc9505
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/orm/JptEclipseLink2_0OrmContextModelTests.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.orm;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class JptEclipseLink2_0OrmContextModelTests extends TestCase
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLink2_0OrmContextModelTests.class.getName());
+		suite.addTestSuite(EclipseLink2_0OrmCollectionTableTests.class);
+		suite.addTestSuite(EclipseLink2_0OrmElementCollectionMappingTests.class);
+		suite.addTestSuite(EclipseLink2_0OrmEntityTests.class);
+		suite.addTestSuite(EclipseLink2_0OrmManyToManyMappingTests.class);
+		suite.addTestSuite(Eclipselink2_0OrmManyToOneMappingTests.class);
+		suite.addTestSuite(EclipseLink2_0OrmMappedSuperclassTests.class);
+		suite.addTestSuite(EclipseLink2_0OrmOneToOneMappingTests.class);
+		suite.addTestSuite(EclipseLink2_0OrmOneToManyMappingTests.class);
+		return suite;
+	}
+
+	private JptEclipseLink2_0OrmContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0ConnectionTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0ConnectionTests.java
new file mode 100644
index 0000000..82c0271
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0ConnectionTests.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+* Copyright (c) 2009 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.persistence;
+
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.core.jpa2.context.persistence.connection.JpaConnection2_0;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.connection.Connection;
+import org.eclipse.jpt.jpa.eclipselink.core.v2_0.context.persistence.connection.Connection2_0;
+
+/**
+ *  EclipseLink2_0ConnectionTests
+ */
+public class EclipseLink2_0ConnectionTests extends EclipseLink2_0PersistenceUnitTestCase
+{
+	private Connection2_0 connection;
+
+	public static final String NATIVE_SQL_KEY = Connection.ECLIPSELINK_NATIVE_SQL;
+	public static final Boolean NATIVE_SQL_TEST_VALUE = false;
+	public static final Boolean NATIVE_SQL_TEST_VALUE_2 = ! NATIVE_SQL_TEST_VALUE;
+	
+	public static final String DRIVER_KEY = JpaConnection2_0.PERSISTENCE_JDBC_DRIVER;
+	public static final String DRIVER_TEST_VALUE = "connection.driver";
+	public static final String DRIVER_TEST_VALUE_2 = "connection.driver.2";
+	public static final String LEGACY_DRIVER_KEY = Connection.ECLIPSELINK_DRIVER;
+	public static final String LEGACY_DRIVER_TEST_VALUE = "legacy.connection.driver";
+	
+	public static final String URL_KEY = JpaConnection2_0.PERSISTENCE_JDBC_URL;
+	public static final String URL_TEST_VALUE = "test";
+	public static final String URL_TEST_VALUE_2 = "test_2";
+	public static final String LEGACY_URL_KEY = Connection.ECLIPSELINK_URL;
+	public static final String LEGACY_URL_TEST_VALUE = "legacy.connection.url";
+
+	public static final String USER_KEY = JpaConnection2_0.PERSISTENCE_JDBC_USER;
+	public static final String USER_TEST_VALUE = "test";
+	public static final String USER_TEST_VALUE_2 = "test_2";
+	public static final String LEGACY_USER_KEY = Connection.ECLIPSELINK_USER;
+	public static final String LEGACY_USER_TEST_VALUE = "legacy.connection.user";
+
+	public static final String PASSWORD_KEY = JpaConnection2_0.PERSISTENCE_JDBC_PASSWORD;
+	public static final String PASSWORD_TEST_VALUE = "test";
+	public static final String PASSWORD_TEST_VALUE_2 = "test_2";
+	public static final String LEGACY_PASSWORD_KEY = Connection.ECLIPSELINK_PASSWORD;
+	public static final String LEGACY_PASSWORD_TEST_VALUE = "legacy.connection.password";
+
+	public EclipseLink2_0ConnectionTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.connection = (Connection2_0) this.subject.getConnection();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+		
+		this.connection.addPropertyChangeListener(Connection.DRIVER_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.URL_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.USER_PROPERTY, propertyChangeListener);
+		this.connection.addPropertyChangeListener(Connection.PASSWORD_PROPERTY, propertyChangeListener);
+		
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PU properties before testing.
+	 */
+	@Override
+	protected void populatePu() {
+		this.modelPropertiesSizeOriginal = 8; // EclipseLink properties
+		this.propertiesTotal = this.modelPropertiesSizeOriginal + 1; // 4 misc properties
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		// Initializes EclipseLink properties
+		this.persistenceUnitSetProperty("misc.property.1", "value.1");
+		this.persistenceUnitSetProperty(LEGACY_DRIVER_KEY, LEGACY_DRIVER_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(DRIVER_KEY, DRIVER_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(LEGACY_URL_KEY, LEGACY_URL_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(URL_KEY, URL_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(LEGACY_USER_KEY, LEGACY_USER_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(USER_KEY, USER_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(LEGACY_PASSWORD_KEY, LEGACY_PASSWORD_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(PASSWORD_KEY, PASSWORD_TEST_VALUE.toString());
+		
+		return;
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.connection;
+	}
+
+	// ********** get/set property **********
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		Object modelValue = null;
+
+		if (propertyName.equals(Connection.DRIVER_PROPERTY))
+			modelValue = this.connection.getDriver();
+		else if (propertyName.equals(Connection.URL_PROPERTY))
+			modelValue = this.connection.getUrl();
+		else if (propertyName.equals(Connection.USER_PROPERTY))
+			modelValue = this.connection.getUser();
+		else if (propertyName.equals(Connection.PASSWORD_PROPERTY))
+			modelValue = this.connection.getPassword();
+		else
+			this.throwMissingDefinition("getProperty", propertyName);
+		return modelValue;
+	}
+
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		if (propertyName.equals(Connection.DRIVER_PROPERTY))
+			this.connection.setDriver((String) newValue);
+		else if (propertyName.equals(Connection.URL_PROPERTY))
+			this.connection.setUrl((String) newValue);
+		else if (propertyName.equals(Connection.USER_PROPERTY))
+			this.connection.setUser((String) newValue);
+		else if (propertyName.equals(Connection.PASSWORD_PROPERTY))
+			this.connection.setPassword((String) newValue);
+		else
+			this.throwMissingDefinition("setProperty", propertyName);
+	}
+	
+
+	// ********** Properties Name Migration tests **********
+	public void testDriverPropertyNameMigration() throws Exception {
+
+		// Verify legacy driver exists
+		assertTrue("Legacy driver not exists", this.propertyValueEquals(LEGACY_DRIVER_KEY, LEGACY_DRIVER_TEST_VALUE));
+		
+		// Verify driver read in
+		assertEquals("Incorrect driver read", this.connection.getDriver(), DRIVER_TEST_VALUE);
+
+		// Change driver value
+		this.connection.setDriver(DRIVER_TEST_VALUE_2);
+		// Verify driver value changed
+		assertEquals("Driver not set", this.connection.getDriver(), DRIVER_TEST_VALUE_2);
+		assertTrue("PersistenceUnit property not set", this.propertyValueEquals(DRIVER_KEY, DRIVER_TEST_VALUE_2));
+		
+		// Verify legacy entry has been deleted
+		this.verifyPuHasNotProperty(LEGACY_DRIVER_KEY,  "Legacy property has not been deleted");
+	}
+
+	public void testPropertiesNamesMigration() throws Exception {
+		// connection.initializeProperties() occurred before test.puPopulate() therefore
+		// we cannot test the case where there are legacy properties only exist in the xml
+		// Verify that User & Password exist in both forms
+		this.verifyPuHasProperty(USER_KEY,  "Property not exists");
+		this.verifyPuHasProperty(PASSWORD_KEY,  "Property not exists");
+		this.verifyPuHasProperty(LEGACY_USER_KEY,  "Legacy property not exists");
+		this.verifyPuHasProperty(LEGACY_PASSWORD_KEY,  "Legacy property not exists");
+		
+		// Change a property value to trigger migration routine
+		this.connection.setNativeSql(NATIVE_SQL_TEST_VALUE);
+		
+		// Verify that all legacy entry has been deleted
+		this.verifyPuHasNotProperty(LEGACY_DRIVER_KEY,  "Legacy property has not been deleted");
+		this.verifyPuHasNotProperty(LEGACY_URL_KEY,  "Legacy property has not been deleted");
+		this.verifyPuHasNotProperty(LEGACY_USER_KEY,  "Legacy property has not been deleted");
+		this.verifyPuHasNotProperty(LEGACY_PASSWORD_KEY,  "Legacy property has not been deleted");
+	}
+
+	
+	
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0LoggingTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0LoggingTests.java
new file mode 100644
index 0000000..92a3d69
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0LoggingTests.java
@@ -0,0 +1,430 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.persistence;
+
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.logging.LoggingLevel;
+import org.eclipse.jpt.jpa.eclipselink.core.v2_0.context.persistence.logging.Logging2_0;
+
+/**
+ *  EclipseLink2_0LoggingTests
+ */
+public class EclipseLink2_0LoggingTests extends EclipseLink2_0PersistenceUnitTestCase
+{
+	private Logging2_0 logging;
+
+	public static final String SQL_LOGGING_KEY = Logging2_0.ECLIPSELINK_SQL_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel SQL_LOGGING_TEST_VALUE = LoggingLevel.off;
+	public static final LoggingLevel SQL_LOGGING_TEST_VALUE_2 = LoggingLevel.severe;
+
+	public static final String TRANSACTION_LOGGING_KEY = Logging2_0.ECLIPSELINK_TRANSACTION_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel TRANSACTION_LOGGING_TEST_VALUE = LoggingLevel.warning;
+	public static final LoggingLevel TRANSACTION_LOGGING_TEST_VALUE_2 = LoggingLevel.info;
+
+	public static final String EVENT_LOGGING_KEY = Logging2_0.ECLIPSELINK_EVENT_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel EVENT_LOGGING_TEST_VALUE = LoggingLevel.config;
+	public static final LoggingLevel EVENT_LOGGING_TEST_VALUE_2 = LoggingLevel.fine;
+
+	public static final String CONNECTION_LOGGING_KEY = Logging2_0.ECLIPSELINK_CONNECTION_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel CONNECTION_LOGGING_TEST_VALUE = LoggingLevel.finer;
+	public static final LoggingLevel CONNECTION_LOGGING_TEST_VALUE_2 = LoggingLevel.finest;
+
+	public static final String QUERY_LOGGING_KEY = Logging2_0.ECLIPSELINK_QUERY_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel QUERY_LOGGING_TEST_VALUE = LoggingLevel.all;
+	public static final LoggingLevel QUERY_LOGGING_TEST_VALUE_2 = LoggingLevel.off;
+
+	public static final String CACHE_LOGGING_KEY = Logging2_0.ECLIPSELINK_CACHE_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel CACHE_LOGGING_TEST_VALUE = LoggingLevel.severe;
+	public static final LoggingLevel CACHE_LOGGING_TEST_VALUE_2 = LoggingLevel.warning;
+
+	public static final String PROPAGATION_LOGGING_KEY = Logging2_0.ECLIPSELINK_PROPAGATION_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel PROPAGATION_LOGGING_TEST_VALUE = LoggingLevel.info;
+	public static final LoggingLevel PROPAGATION_LOGGING_TEST_VALUE_2 = LoggingLevel.config;
+
+	public static final String SEQUENCING_LOGGING_KEY = Logging2_0.ECLIPSELINK_SEQUENCING_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel SEQUENCING_LOGGING_TEST_VALUE = LoggingLevel.fine;
+	public static final LoggingLevel SEQUENCING_LOGGING_TEST_VALUE_2 = LoggingLevel.finer;
+
+	public static final String EJB_LOGGING_KEY = Logging2_0.ECLIPSELINK_EJB_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel EJB_LOGGING_TEST_VALUE = LoggingLevel.finest;
+	public static final LoggingLevel EJB_LOGGING_TEST_VALUE_2 = LoggingLevel.all;
+
+	public static final String DMS_LOGGING_KEY = Logging2_0.ECLIPSELINK_DMS_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel DMS_LOGGING_TEST_VALUE = LoggingLevel.off;
+	public static final LoggingLevel DMS_LOGGING_TEST_VALUE_2 = LoggingLevel.severe;
+
+	public static final String EJB_OR_METADATA_LOGGING_KEY = Logging2_0.ECLIPSELINK_EJB_OR_METADATA_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel EJB_OR_METADATA_LOGGING_TEST_VALUE = LoggingLevel.warning;
+	public static final LoggingLevel EJB_OR_METADATA_LOGGING_TEST_VALUE_2 = LoggingLevel.info;
+
+	public static final String METAMODEL_LOGGING_KEY = Logging2_0.ECLIPSELINK_METAMODEL_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel METAMODEL_LOGGING_TEST_VALUE = LoggingLevel.config;
+	public static final LoggingLevel METAMODEL_LOGGING_TEST_VALUE_2 = LoggingLevel.fine;
+
+	public static final String WEAVER_LOGGING_KEY = Logging2_0.ECLIPSELINK_WEAVER_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel WEAVER_LOGGING_TEST_VALUE = LoggingLevel.finer;
+	public static final LoggingLevel WEAVER_LOGGING_TEST_VALUE_2 = LoggingLevel.finest;
+
+	public static final String PROPERTIES_LOGGING_KEY = Logging2_0.ECLIPSELINK_PROPERTIES_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel PROPERTIES_LOGGING_TEST_VALUE = LoggingLevel.all;
+	public static final LoggingLevel PROPERTIES_LOGGING_TEST_VALUE_2 = LoggingLevel.off;
+
+	public static final String SERVER_LOGGING_KEY = Logging2_0.ECLIPSELINK_SERVER_CATEGORY_LOGGING_LEVEL;
+	public static final LoggingLevel SERVER_LOGGING_TEST_VALUE = LoggingLevel.severe;
+	public static final LoggingLevel SERVER_LOGGING_TEST_VALUE_2 = LoggingLevel.warning;
+
+	// ********** constructors **********
+	public EclipseLink2_0LoggingTests(String name) {
+		super(name);
+	}
+
+	// ********** behavior **********
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.logging = (Logging2_0) this.subject.getLogging();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+
+		this.logging.addPropertyChangeListener(Logging2_0.SQL_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.TRANSACTION_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.EVENT_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.CONNECTION_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.QUERY_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.CACHE_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.PROPAGATION_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.SEQUENCING_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.EJB_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.DMS_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.EJB_OR_METADATA_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.METAMODEL_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.WEAVER_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.PROPERTIES_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+		this.logging.addPropertyChangeListener(Logging2_0.SERVER_CATEGORY_LOGGING_PROPERTY, propertyChangeListener);
+
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PersistenceUnit properties before testing.
+	 */
+	@Override
+	protected void populatePu() {
+		this.modelPropertiesSizeOriginal = 15; // PersistenceUnit properties
+		this.propertiesTotal = this.modelPropertiesSizeOriginal + 1; // 1 misc properties
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		// Initializes PersistenceUnit properties
+		this.persistenceUnitSetProperty("misc.property.1", "value.1");
+		this.persistenceUnitSetProperty(SQL_LOGGING_KEY, SQL_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(TRANSACTION_LOGGING_KEY, TRANSACTION_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(EVENT_LOGGING_KEY, EVENT_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(CONNECTION_LOGGING_KEY, CONNECTION_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(QUERY_LOGGING_KEY, QUERY_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(CACHE_LOGGING_KEY, CACHE_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(PROPAGATION_LOGGING_KEY, PROPAGATION_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(SEQUENCING_LOGGING_KEY, SEQUENCING_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(EJB_LOGGING_KEY, EJB_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(DMS_LOGGING_KEY, DMS_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(EJB_OR_METADATA_LOGGING_KEY, EJB_OR_METADATA_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(METAMODEL_LOGGING_KEY, METAMODEL_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(WEAVER_LOGGING_KEY, WEAVER_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(PROPERTIES_LOGGING_KEY, PROPERTIES_LOGGING_TEST_VALUE);
+		this.persistenceUnitSetProperty(SERVER_LOGGING_KEY, SERVER_LOGGING_TEST_VALUE);
+
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.logging;
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		
+		return this.logging.getLevel(propertyName);
+	}
+
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+
+		this.logging.setLevel(propertyName, (LoggingLevel) newValue);
+	}
+	
+	// ********** Sql Level tests **********
+	public void testSetSqlLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			SQL_LOGGING_KEY,
+			SQL_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			SQL_LOGGING_KEY,
+			SQL_LOGGING_TEST_VALUE,
+			SQL_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveSqlLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			SQL_LOGGING_KEY,
+			SQL_LOGGING_TEST_VALUE,
+			SQL_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Transaction Level tests **********
+	public void testSetTransactionLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			TRANSACTION_LOGGING_KEY,
+			TRANSACTION_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			TRANSACTION_LOGGING_KEY,
+			TRANSACTION_LOGGING_TEST_VALUE,
+			TRANSACTION_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveTransactionLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			TRANSACTION_LOGGING_KEY,
+			TRANSACTION_LOGGING_TEST_VALUE,
+			TRANSACTION_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Event Level tests **********
+	public void testSetEventLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			EVENT_LOGGING_KEY,
+			EVENT_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			EVENT_LOGGING_KEY,
+			EVENT_LOGGING_TEST_VALUE,
+			EVENT_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveEventLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			EVENT_LOGGING_KEY,
+			EVENT_LOGGING_TEST_VALUE,
+			EVENT_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Connection Level tests **********
+	public void testSetConnectionLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			CONNECTION_LOGGING_KEY,
+			CONNECTION_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			CONNECTION_LOGGING_KEY,
+			CONNECTION_LOGGING_TEST_VALUE,
+			CONNECTION_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveConnectionLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			CONNECTION_LOGGING_KEY,
+			CONNECTION_LOGGING_TEST_VALUE,
+			CONNECTION_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Query Level tests **********
+	public void testSetQueryLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			QUERY_LOGGING_KEY,
+			QUERY_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			QUERY_LOGGING_KEY,
+			QUERY_LOGGING_TEST_VALUE,
+			QUERY_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveQueryLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			QUERY_LOGGING_KEY,
+			QUERY_LOGGING_TEST_VALUE,
+			QUERY_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Cache Level tests **********
+	public void testSetCacheLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			CACHE_LOGGING_KEY,
+			CACHE_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			CACHE_LOGGING_KEY,
+			CACHE_LOGGING_TEST_VALUE,
+			CACHE_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveCacheLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			CACHE_LOGGING_KEY,
+			CACHE_LOGGING_TEST_VALUE,
+			CACHE_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Propagation Level tests **********
+	public void testSetPropagationLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			PROPAGATION_LOGGING_KEY,
+			PROPAGATION_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			PROPAGATION_LOGGING_KEY,
+			PROPAGATION_LOGGING_TEST_VALUE,
+			PROPAGATION_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemovePropagationLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			PROPAGATION_LOGGING_KEY,
+			PROPAGATION_LOGGING_TEST_VALUE,
+			PROPAGATION_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Sequencing Level tests **********
+	public void testSetSequencingLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			SEQUENCING_LOGGING_KEY,
+			SEQUENCING_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			SEQUENCING_LOGGING_KEY,
+			SEQUENCING_LOGGING_TEST_VALUE,
+			SEQUENCING_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveSequencingLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			SEQUENCING_LOGGING_KEY,
+			SEQUENCING_LOGGING_TEST_VALUE,
+			SEQUENCING_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** EJB Level tests **********
+	public void testSetEJBLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			EJB_LOGGING_KEY,
+			EJB_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			EJB_LOGGING_KEY,
+			EJB_LOGGING_TEST_VALUE,
+			EJB_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveEJBLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			EJB_LOGGING_KEY,
+			EJB_LOGGING_TEST_VALUE,
+			EJB_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** DMS Level tests **********
+	public void testSetDMSLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			DMS_LOGGING_KEY,
+			DMS_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			DMS_LOGGING_KEY,
+			DMS_LOGGING_TEST_VALUE,
+			DMS_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveDMSLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			DMS_LOGGING_KEY,
+			DMS_LOGGING_TEST_VALUE,
+			DMS_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** EJB or Metadata Level tests **********
+	public void testSetEJBOrMetadataLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			EJB_OR_METADATA_LOGGING_KEY,
+			EJB_OR_METADATA_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			EJB_OR_METADATA_LOGGING_KEY,
+			EJB_OR_METADATA_LOGGING_TEST_VALUE,
+			EJB_OR_METADATA_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveEJBOrMetadataLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			EJB_OR_METADATA_LOGGING_KEY,
+			EJB_OR_METADATA_LOGGING_TEST_VALUE,
+			EJB_OR_METADATA_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Metamodel Level tests **********
+	public void testSetMetamodelLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			METAMODEL_LOGGING_KEY,
+			METAMODEL_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			METAMODEL_LOGGING_KEY,
+			METAMODEL_LOGGING_TEST_VALUE,
+			METAMODEL_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveMetamodelLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			METAMODEL_LOGGING_KEY,
+			METAMODEL_LOGGING_TEST_VALUE,
+			METAMODEL_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Weaver Level tests **********
+	public void testSetWeaverLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			WEAVER_LOGGING_KEY,
+			WEAVER_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			WEAVER_LOGGING_KEY,
+			WEAVER_LOGGING_TEST_VALUE,
+			WEAVER_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveWeaverLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			WEAVER_LOGGING_KEY,
+			WEAVER_LOGGING_TEST_VALUE,
+			WEAVER_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Properties Level tests **********
+	public void testSetPropertiesLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			PROPERTIES_LOGGING_KEY,
+			PROPERTIES_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			PROPERTIES_LOGGING_KEY,
+			PROPERTIES_LOGGING_TEST_VALUE,
+			PROPERTIES_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemovePropertiesLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			PROPERTIES_LOGGING_KEY,
+			PROPERTIES_LOGGING_TEST_VALUE,
+			PROPERTIES_LOGGING_TEST_VALUE_2);
+	}
+	
+	// ********** Server Level tests **********
+	public void testSetServerLoggingLevel() throws Exception {
+		this.verifyModelInitialized(
+			SERVER_LOGGING_KEY,
+			SERVER_LOGGING_TEST_VALUE);
+		this.verifySetProperty(
+			SERVER_LOGGING_KEY,
+			SERVER_LOGGING_TEST_VALUE,
+			SERVER_LOGGING_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveServerLoggingLevel() throws Exception {
+		this.verifyAddRemoveProperty(
+			SERVER_LOGGING_KEY,
+			SERVER_LOGGING_TEST_VALUE,
+			SERVER_LOGGING_TEST_VALUE_2);
+	}
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0OptionsTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0OptionsTests.java
new file mode 100644
index 0000000..adfae7b
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0OptionsTests.java
@@ -0,0 +1,518 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.persistence;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.common.utility.model.event.ListAddEvent;
+import org.eclipse.jpt.common.utility.model.event.ListChangeEvent;
+import org.eclipse.jpt.common.utility.model.event.ListClearEvent;
+import org.eclipse.jpt.common.utility.model.event.ListMoveEvent;
+import org.eclipse.jpt.common.utility.model.event.ListRemoveEvent;
+import org.eclipse.jpt.common.utility.model.event.ListReplaceEvent;
+import org.eclipse.jpt.common.utility.model.listener.ListChangeListener;
+import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties;
+import org.eclipse.jpt.jpa.eclipselink.core.v2_0.context.persistence.options.Options2_0;
+
+/**
+ *  EclipseLinkOptions2_0Tests
+ */
+public class EclipseLink2_0OptionsTests extends EclipseLink2_0PersistenceUnitTestCase
+{
+	private Options2_0 options;
+	private ListChangeEvent prePersistEvent;
+	private ListChangeEvent preUpdateEvent;
+	private ListChangeEvent preRemoveEvent;
+
+	public static final String LOCK_TIMEOUT_KEY = Options2_0.PERSISTENCE_LOCK_TIMEOUT;
+	public static final Integer LOCK_TIMEOUT_TEST_VALUE = 100;
+	public static final Integer LOCK_TIMEOUT_TEST_VALUE_2 = 200;
+
+	public static final String QUERY_TIMEOUT_KEY = Options2_0.PERSISTENCE_QUERY_TIMEOUT;
+	public static final Integer QUERY_TIMEOUT_TEST_VALUE = 100;
+	public static final Integer QUERY_TIMEOUT_TEST_VALUE_2 = 200;
+	
+	public static final String VALIDATION_GROUP_PRE_PERSIST_KEY = Options2_0.PERSISTENCE_VALIDATION_GROUP_PRE_PERSIST;
+	public static final String VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE = "test_pre-persist_group";
+	public static final String VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE_2 = "test_2_pre-persist_group";
+	
+	public static final String VALIDATION_GROUP_PRE_UPDATE_KEY = Options2_0.PERSISTENCE_VALIDATION_GROUP_PRE_UPDATE;
+	public static final String VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE = "test_pre-update_group";
+	public static final String VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE_2 = "test_2_pre-update_group";
+	
+	public static final String VALIDATION_GROUP_PRE_REMOVE_KEY = Options2_0.PERSISTENCE_VALIDATION_GROUP_PRE_REMOVE;
+	public static final String VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE = "test_pre-remove_group";
+	public static final String VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE_2 = "test_2_pre-remove_group";
+
+	// ********** constructors **********
+	public EclipseLink2_0OptionsTests(String name) {
+		super(name);
+	}
+
+	// ********** behavior **********
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.options = (Options2_0) this.subject.getOptions();
+		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
+
+		this.options.addPropertyChangeListener(Options2_0.LOCK_TIMEOUT_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(Options2_0.QUERY_TIMEOUT_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY, propertyChangeListener);
+		this.options.addPropertyChangeListener(Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY, propertyChangeListener);
+
+		ListChangeListener validationGroupListChangeListener = this.buildValidationGroupListChangeListener();
+		this.options.addListChangeListener(Options2_0.VALIDATION_GROUP_PRE_PERSIST_LIST, validationGroupListChangeListener);
+		this.options.addListChangeListener(Options2_0.VALIDATION_GROUP_PRE_UPDATE_LIST, validationGroupListChangeListener);
+		this.options.addListChangeListener(Options2_0.VALIDATION_GROUP_PRE_REMOVE_LIST, validationGroupListChangeListener);
+		
+		this.clearEvent();
+	}
+
+	/**
+	 * Initializes directly the PersistenceUnit properties before testing.
+	 */
+	@Override
+	protected void populatePu() {
+		this.modelPropertiesSizeOriginal = 5; // PersistenceUnit properties
+		this.propertiesTotal = this.modelPropertiesSizeOriginal + 1; // 1 misc properties
+		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
+		
+		// Initializes PersistenceUnit properties
+		this.persistenceUnitSetProperty(LOCK_TIMEOUT_KEY, LOCK_TIMEOUT_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty(QUERY_TIMEOUT_KEY, QUERY_TIMEOUT_TEST_VALUE.toString());
+		this.persistenceUnitSetProperty("misc.property.3", "value.3");
+
+		this.persistenceUnitSetProperty(VALIDATION_GROUP_PRE_PERSIST_KEY, VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE);
+		this.persistenceUnitSetProperty(VALIDATION_GROUP_PRE_UPDATE_KEY, VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE);
+		this.persistenceUnitSetProperty(VALIDATION_GROUP_PRE_REMOVE_KEY, VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE);
+	}
+
+	@Override
+	protected PersistenceUnitProperties getModel() {
+		return this.options;
+	}
+
+	@Override
+	protected Object getProperty(String propertyName) throws NoSuchFieldException {
+		Object modelValue = null;
+		if (propertyName.equals(Options2_0.LOCK_TIMEOUT_PROPERTY))
+			modelValue = this.options.getLockTimeout();
+		else if (propertyName.equals(Options2_0.QUERY_TIMEOUT_PROPERTY))
+			modelValue = this.options.getQueryTimeout();
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY)) {
+			ListIterator<String> iterator = this.options.validationGroupPrePersists();
+			modelValue = this.getFirstElement(iterator);
+		}
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY)) {
+			ListIterator<String> iterator = this.options.validationGroupPreUpdates();
+			modelValue = this.getFirstElement(iterator);
+		}
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY)) {
+			ListIterator<String> iterator = this.options.validationGroupPreRemoves();
+			modelValue = this.getFirstElement(iterator);
+		}
+		else
+			this.throwMissingDefinition("getProperty", propertyName);
+		return modelValue;
+	}
+	
+	@Override
+	protected void setProperty(String propertyName, Object newValue) throws Exception {
+		if (propertyName.equals(Options2_0.LOCK_TIMEOUT_PROPERTY))
+			this.options.setLockTimeout((Integer) newValue);
+		else if (propertyName.equals(Options2_0.QUERY_TIMEOUT_PROPERTY))
+			this.options.setQueryTimeout((Integer) newValue);
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY))
+			this.options.addValidationGroupPrePersist((String) newValue);
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY))
+			this.options.addValidationGroupPreUpdate((String) newValue);
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY))
+			this.options.addValidationGroupPreRemove((String) newValue);
+		else
+			this.throwMissingDefinition("setProperty", propertyName);
+	}
+	
+	// ********** LockTimeout tests **********
+	public void testSetLockTimeout() throws Exception {
+		this.verifyModelInitialized(
+			LOCK_TIMEOUT_KEY,
+			LOCK_TIMEOUT_TEST_VALUE);
+		this.verifySetProperty(
+			LOCK_TIMEOUT_KEY,
+			LOCK_TIMEOUT_TEST_VALUE,
+			LOCK_TIMEOUT_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveLockTimeout() throws Exception {
+		this.verifyAddRemoveProperty(
+			LOCK_TIMEOUT_KEY,
+			LOCK_TIMEOUT_TEST_VALUE,
+			LOCK_TIMEOUT_TEST_VALUE_2);
+	}
+	
+	// ********** QueryTimeout tests **********
+	public void testSetQueryTimeout() throws Exception {
+		this.verifyModelInitialized(
+			QUERY_TIMEOUT_KEY,
+			QUERY_TIMEOUT_TEST_VALUE);
+		this.verifySetProperty(
+			QUERY_TIMEOUT_KEY,
+			QUERY_TIMEOUT_TEST_VALUE,
+			QUERY_TIMEOUT_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveQueryTimeout() throws Exception {
+		this.verifyAddRemoveProperty(
+			QUERY_TIMEOUT_KEY,
+			QUERY_TIMEOUT_TEST_VALUE,
+			QUERY_TIMEOUT_TEST_VALUE_2);
+	}
+
+	// ********** ValidationGroupPrePersist tests **********
+	public void testSetValidationGroupPrePersist() throws Exception {
+		this.verifyModelInitialized(
+			VALIDATION_GROUP_PRE_PERSIST_KEY,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE);
+		this.verifySetValidationGroupProperty(
+			Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY,
+			VALIDATION_GROUP_PRE_PERSIST_KEY,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveValidationGroupPrePersist() throws Exception {
+		this.verifyAddRemoveValidationGroupProperty(
+			Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY,
+			VALIDATION_GROUP_PRE_PERSIST_KEY,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE_2);
+	}
+
+	public void testAddValidationGroupPrePersistCompositeValue() throws Exception {
+		this.verifyAddCompositeValue(
+			Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY,
+			VALIDATION_GROUP_PRE_PERSIST_KEY,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE_2);
+	}
+
+	public void testRemoveValidationGroupPrePersistCompositeValue() throws Exception {
+		this.verifyRemoveCompositeValue(
+			Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY,
+			VALIDATION_GROUP_PRE_PERSIST_KEY,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE_2);
+	}
+
+	// ********** ValidationGroupPreUpdate tests **********
+	public void testSetValidationGroupPreUpdate() throws Exception {
+		this.verifyModelInitialized(
+			VALIDATION_GROUP_PRE_UPDATE_KEY,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE);
+		this.verifySetValidationGroupProperty(
+			Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY,
+			VALIDATION_GROUP_PRE_UPDATE_KEY,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveValidationGroupPreUpdate() throws Exception {
+		this.verifyAddRemoveValidationGroupProperty(
+			Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY,
+			VALIDATION_GROUP_PRE_UPDATE_KEY,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE_2);
+	}
+
+	public void testAddValidationGroupPreUpdateCompositeValue() throws Exception {
+		this.verifyAddCompositeValue(
+			Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY,
+			VALIDATION_GROUP_PRE_UPDATE_KEY,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE_2);
+	}
+
+	public void testRemoveValidationGroupPreUpdateCompositeValue() throws Exception {
+		this.verifyRemoveCompositeValue(
+			Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY,
+			VALIDATION_GROUP_PRE_UPDATE_KEY,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE_2);
+	}
+
+	// ********** ValidationGroupPreRemove tests **********
+	public void testSetValidationGroupPreRemove() throws Exception {
+		this.verifyModelInitialized(
+			VALIDATION_GROUP_PRE_REMOVE_KEY,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE);
+		this.verifySetValidationGroupProperty(
+			Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY,
+			VALIDATION_GROUP_PRE_REMOVE_KEY,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE_2);
+	}
+
+	public void testAddRemoveValidationGroupPreRemove() throws Exception {
+		this.verifyAddRemoveValidationGroupProperty(
+			Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY,
+			VALIDATION_GROUP_PRE_REMOVE_KEY,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE_2);
+	}
+
+	public void testAddValidationGroupPreRemoveCompositeValue() throws Exception {
+		this.verifyAddCompositeValue(
+			Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY,
+			VALIDATION_GROUP_PRE_REMOVE_KEY,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE_2);
+	}
+
+	public void testRemoveValidationGroupPreRemoveCompositeValue() throws Exception {
+		this.verifyRemoveCompositeValue(
+			Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY,
+			VALIDATION_GROUP_PRE_REMOVE_KEY,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE_2);
+	}
+
+	// ********** ValidationGroups list **********
+	public void testValidationGroupsList() throws Exception {
+		this.verifyListEvents(
+			Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY,
+			VALIDATION_GROUP_PRE_PERSIST_TEST_VALUE_2,
+			Options2_0.VALIDATION_GROUP_PRE_PERSIST_LIST);
+		
+		this.verifyListEvents(
+			Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY,
+			VALIDATION_GROUP_PRE_UPDATE_TEST_VALUE_2,
+			Options2_0.VALIDATION_GROUP_PRE_UPDATE_LIST);
+		
+		this.verifyListEvents(
+			Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY,
+			VALIDATION_GROUP_PRE_REMOVE_TEST_VALUE_2,
+			Options2_0.VALIDATION_GROUP_PRE_REMOVE_LIST);
+	}
+
+	// ********** override **********
+
+	@Override
+	protected void clearEvent() {
+		super.clearEvent();
+		this.prePersistEvent = null;
+		this.preUpdateEvent = null;
+		this.preRemoveEvent = null;
+	}
+
+	// ****** convenience methods *******
+
+	// ********** verify ValidationGroup property **********
+	protected void verifySetValidationGroupProperty(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		// Replace
+		this.persistenceUnitSetProperty(key, testValue2, true); 
+		this.propertiesTotal++;
+		this.verifyPutValidationGroupProperty(propertyName, testValue1);
+	}
+
+	@SuppressWarnings("unused")
+	protected void verifyAddRemoveValidationGroupProperty(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		assertTrue(this.validationGroupValueExists(propertyName, (String)testValue1));
+		// Remove
+		this.clearEvent();
+		--this.propertiesTotal;
+		--this.modelPropertiesSize;
+		this.getPersistenceUnit().removeProperty(key, (String)testValue1);
+		assertFalse(this.validationGroupValueExists(propertyName, (String)testValue1));
+		assertEquals(this.modelPropertiesSize, this.modelPropertiesSizeOriginal - 1);
+		
+		// Add original Property
+		++this.propertiesTotal;
+		++this.modelPropertiesSize;
+		this.persistenceUnitSetProperty(key, testValue1, true); 
+		this.verifyPutValidationGroupProperty(propertyName, testValue1);
+	}
+
+	protected void verifyAddCompositeValue(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		String stringTestValue1 = (String)testValue1;
+		String stringTestValue2 = (String)testValue2;
+		assertTrue(this.validationGroupValueExists(propertyName, stringTestValue1));
+		assertEquals(this.getValidationGroupSize(propertyName), 1);
+		this.addValidationGroupValue(propertyName, stringTestValue2);
+		assertEquals(this.getValidationGroupSize(propertyName), 2);
+
+		assertTrue(this.validationGroupValueExists(propertyName, stringTestValue1));
+		assertTrue(this.validationGroupValueExists(propertyName, stringTestValue2));
+
+		String propertyValue = this.getPersistenceUnit().getProperty(key).getValue();
+		assertTrue(propertyValue.indexOf(stringTestValue1) != -1);
+		assertTrue(propertyValue.indexOf(stringTestValue2) != -1);
+	}
+
+	protected void verifyRemoveCompositeValue(String propertyName, String key, Object testValue1, Object testValue2) throws Exception {
+		String stringTestValue1 = (String)testValue1;
+		String stringTestValue2 = (String)testValue2;
+		assertTrue(this.validationGroupValueExists(propertyName, stringTestValue1));
+		assertEquals(this.getValidationGroupSize(propertyName), 1);
+		this.addValidationGroupValue(propertyName, stringTestValue2);
+		assertEquals(this.getValidationGroupSize(propertyName), 2);
+
+		this.removeValidationGroupValue(propertyName, stringTestValue2);
+		assertEquals(this.getValidationGroupSize(propertyName), 1);
+		assertFalse(this.validationGroupValueExists(propertyName, stringTestValue2));
+		String propertyValue = this.getPersistenceUnit().getProperty(key).getValue();
+		assertTrue(propertyValue.indexOf(stringTestValue1) != -1);
+		assertTrue(propertyValue.indexOf(stringTestValue2) == -1);
+		
+		this.removeValidationGroupValue(propertyName, stringTestValue2);
+		assertEquals(this.getValidationGroupSize(propertyName), 1);
+		
+		this.removeValidationGroupValue(propertyName, stringTestValue1);
+		assertEquals(this.getValidationGroupSize(propertyName), 0);
+		assertFalse(this.validationGroupValueExists(propertyName, stringTestValue1));
+		
+		assertNull(this.getPersistenceUnit().getProperty(key));
+	}
+
+	protected void verifyListEvents(String propertyName, String testValue, String listName) throws Exception {
+		// add
+		this.clearEvent();
+		this.addValidationGroupValue(propertyName, testValue);
+		
+		// verify event received
+		assertNotNull("No Event Fired.", this.getEventFor(propertyName));
+		// verify event for the expected property
+		assertEquals("Wrong Event.", this.getEventFor(propertyName).getListName(), listName);
+
+		// remove
+		this.clearEvent();
+		
+		this.removeValidationGroupValue(propertyName, testValue);
+		// verify event received
+		assertNotNull("No Event Fired.", this.getEventFor(propertyName));
+		// verify event for the expected property
+		assertEquals("Wrong Event.", this.getEventFor(propertyName).getListName(), listName);
+	}
+	
+	protected void verifyPutValidationGroupProperty(String propertyName, Object expectedValue) throws Exception {
+		// verify event received
+		assertNotNull("No Event Fired.", this.getEventFor(propertyName));
+		// verify event value
+		assertTrue(this.validationGroupValueExists(propertyName, (String) expectedValue));
+		 return;
+	}
+	
+	// ********** internal method **********
+
+	private ListChangeListener buildValidationGroupListChangeListener() {
+		return new ListChangeListener() {
+			public void itemsAdded(ListAddEvent e) {
+				EclipseLink2_0OptionsTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void itemsRemoved(ListRemoveEvent e) {
+				EclipseLink2_0OptionsTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void itemsReplaced(ListReplaceEvent e) {
+				EclipseLink2_0OptionsTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void itemsMoved(ListMoveEvent e) {
+				EclipseLink2_0OptionsTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void listCleared(ListClearEvent e) {
+				EclipseLink2_0OptionsTests.this.throwUnsupportedOperationException(e);
+			}
+
+			public void listChanged(ListChangeEvent e) {
+				
+				EclipseLink2_0OptionsTests.this.validationGroupChanged(e);
+			}
+		};
+	}
+
+	private void validationGroupChanged(ListChangeEvent e) {
+		String listName = e.getListName();
+		
+		if (listName.equals(Options2_0.VALIDATION_GROUP_PRE_PERSIST_LIST))
+			this.prePersistEvent = e;
+		else if (listName.equals(Options2_0.VALIDATION_GROUP_PRE_UPDATE_LIST))
+			this.preUpdateEvent = e;
+		else if (listName.equals(Options2_0.VALIDATION_GROUP_PRE_REMOVE_LIST))
+			this.preRemoveEvent = e;
+		else
+			this.throwUnsupportedOperationException(e);
+	}
+
+	private void addValidationGroupValue(String propertyName, String propertyValue) throws NoSuchFieldException {
+		if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY))
+			this.options.addValidationGroupPrePersist(propertyValue);
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY))
+			this.options.addValidationGroupPreUpdate(propertyValue);
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY))
+			this.options.addValidationGroupPreRemove(propertyValue);
+		else
+			this.throwMissingDefinition("addValidationGroupValue", propertyName);
+	}
+
+	private void removeValidationGroupValue(String propertyName, String propertyValue) throws NoSuchFieldException {
+		if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY))
+			this.options.removeValidationGroupPrePersist(propertyValue);
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY))
+			this.options.removeValidationGroupPreUpdate(propertyValue);
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY))
+			this.options.removeValidationGroupPreRemove(propertyValue);
+		else
+			this.throwMissingDefinition("removeValidationGroupValue", propertyName);
+	}
+
+	private boolean validationGroupValueExists(String propertyName, String propertyValue) throws NoSuchFieldException {
+		boolean result = false;
+		if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY))
+			result = this.options.validationGroupPrePersistExists(propertyValue);
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY))
+			result = this.options.validationGroupPreUpdateExists(propertyValue);
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY))
+			result = this.options.validationGroupPreRemoveExists(propertyValue);
+		else
+			this.throwMissingDefinition("verifyValidationGroupValueExists", propertyName);
+		return result;
+	}
+
+	private int getValidationGroupSize(String propertyName) throws NoSuchFieldException {
+		int result = 0;
+		if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY))
+			result =  this.options.validationGroupPrePersistsSize();
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY))
+			result =  this.options.validationGroupPreUpdatesSize();
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY))
+			result =  this.options.validationGroupPreRemovesSize();
+		else
+			this.throwMissingDefinition("verifyValidationGroupSize", propertyName);
+		return result;
+	}
+	
+	private ListChangeEvent getEventFor(String propertyName) throws NoSuchFieldException {
+		ListChangeEvent event = null;
+		if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_PERSIST_PROPERTY))
+			event = this.prePersistEvent;
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_UPDATE_PROPERTY))
+			event = this.preUpdateEvent;
+		else if (propertyName.equals(Options2_0.VALIDATION_GROUP_PRE_REMOVE_PROPERTY))
+			event = this.preRemoveEvent;
+		else
+			this.throwMissingDefinition("getEventFor", propertyName);
+		return event;
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0PersistenceUnitTestCase.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0PersistenceUnitTestCase.java
new file mode 100644
index 0000000..e84d162
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/EclipseLink2_0PersistenceUnitTestCase.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.persistence;
+
+import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.JpaFacet;
+import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetDataModelProperties;
+import org.eclipse.jpt.jpa.core.tests.internal.context.persistence.PersistenceUnitTestCase;
+import org.eclipse.jpt.jpa.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
+import org.eclipse.jpt.jpa.eclipselink.core.platform.EclipseLinkPlatform;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ *  EclipseLink2_0PersistenceUnitTestCase
+ */
+public abstract class EclipseLink2_0PersistenceUnitTestCase extends PersistenceUnitTestCase
+{
+	protected EclipseLinkPersistenceUnit subject;
+
+	protected PropertyValueModel<EclipseLinkPersistenceUnit> subjectHolder;
+
+	// ********** constructors **********
+	protected EclipseLink2_0PersistenceUnitTestCase(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.subject = this.getPersistenceUnit();
+		this.subjectHolder = new SimplePropertyValueModel<EclipseLinkPersistenceUnit>(this.subject);
+		this.populatePu();
+	}
+
+	@Override
+	protected IDataModel buildJpaConfigDataModel() {
+		IDataModel dataModel = super.buildJpaConfigDataModel();
+		dataModel.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, JpaFacet.VERSION_2_0.getVersionString());	
+		dataModel.setProperty(JpaFacetDataModelProperties.PLATFORM, EclipseLinkPlatform.VERSION_2_0);
+		return dataModel;
+	}
+
+	@Override
+	protected EclipseLinkPersistenceUnit getPersistenceUnit() {
+		return (EclipseLinkPersistenceUnit) super.getPersistenceUnit();
+	}
+
+}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/JptEclipseLink2_0CorePersistenceContextModelTests.java b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/JptEclipseLink2_0CorePersistenceContextModelTests.java
new file mode 100644
index 0000000..167c8c2
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/src/org/eclipse/jpt/jpa/eclipselink/core/tests/internal/v2_0/context/persistence/JptEclipseLink2_0CorePersistenceContextModelTests.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+* Copyright (c) 2009, 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+* 
+* Contributors:
+*     Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.v2_0.context.persistence;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * decentralize test creation code
+ */
+public class JptEclipseLink2_0CorePersistenceContextModelTests
+{
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JptEclipseLink2_0CorePersistenceContextModelTests.class.getPackage().getName());
+
+		suite.addTestSuite(EclipseLink2_0ConnectionTests.class);
+		suite.addTestSuite(EclipseLink2_0LoggingTests.class);
+		suite.addTestSuite(EclipseLink2_0OptionsTests.class);
+		
+		return suite;
+	}
+
+	private JptEclipseLink2_0CorePersistenceContextModelTests() {
+		super();
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/test.xml b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/test.xml
new file mode 100644
index 0000000..9b3b5db
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.jpa.eclipselink.core.tests/test.xml
Binary files differ