New Temporal Tests project
- uses specific JDK with agent configured
- 96/96 tests pass
diff --git a/.gitignore b/.gitignore
index f762257..319506c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
 
 /Temporal Entity Example/classes
-/Temporal Tests
\ No newline at end of file
+/Temporal Tests/classes
\ No newline at end of file
diff --git a/Temporal Tests/.classpath b/Temporal Tests/.classpath
new file mode 100644
index 0000000..5f77a93
--- /dev/null
+++ b/Temporal Tests/.classpath
@@ -0,0 +1,9 @@
+<?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/jdk1.6.0_31 (EclipseLink 2.3.1 Agent)"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/Temporal Entity Example"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/EclipseLink 2.3.1"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="classes"/>
+</classpath>
diff --git a/Temporal Tests/.project b/Temporal Tests/.project
new file mode 100644
index 0000000..f9d677e
--- /dev/null
+++ b/Temporal Tests/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Temporal Tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/Temporal Tests/.settings/org.eclipse.jdt.core.prefs b/Temporal Tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8000cd6
--- /dev/null
+++ b/Temporal Tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/Temporal Tests/Temporal AllTests.launch b/Temporal Tests/Temporal AllTests.launch
new file mode 100644
index 0000000..f5008a0
--- /dev/null
+++ b/Temporal Tests/Temporal AllTests.launch
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<stringAttribute key="bad_container_name" value="\Temporal Tests\run-configs"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/Temporal Tests/src/tests/AllTests.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="tests.AllTests"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Temporal Tests"/>
+</launchConfiguration>
diff --git a/Temporal Tests/src/tests/AllTests.java b/Temporal Tests/src/tests/AllTests.java
new file mode 100644
index 0000000..1f0a617
--- /dev/null
+++ b/Temporal Tests/src/tests/AllTests.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+@RunWith(Suite.class)
+@SuiteClasses({ tests.internal.AllTests.class, 
+                FullPersonWithEditions.class, 
+                FuturePersonTests.class,
+                DeleteTests.class,
+                ProxyWrapperUpdateTests.class,
+                //ModifyCurrentTests.class})
+                //DeleteContinuityTests.class,
+                MultipleEditionQueries.class,
+                DuplicateInsertOnCreateMerge.class,
+                tests.editionsets.AllTests.class})
+public class AllTests {
+}
diff --git a/Temporal Tests/src/tests/BaseTestCase.java b/Temporal Tests/src/tests/BaseTestCase.java
new file mode 100644
index 0000000..0b79af1
--- /dev/null
+++ b/Temporal Tests/src/tests/BaseTestCase.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.eclipse.persistence.jpa.JpaHelper;
+import org.eclipse.persistence.sessions.server.Server;
+import org.eclipse.persistence.tools.schemaframework.SchemaManager;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.TestName;
+
+import temporal.TemporalEntityManager;
+import temporal.persistence.TemporalSchemaManager;
+
+/**
+ * 
+ * @author dclarke
+ * @Since EclipseLink 2.3.1
+ */
+public abstract class BaseTestCase {
+
+    private static EntityManagerFactory emf;
+
+    private TemporalEntityManager entityManager;
+
+    @Rule
+    public TestName testName = new TestName();
+
+    public EntityManagerFactory getEMF() {
+        if (emf == null) {
+            emf = Persistence.createEntityManagerFactory("example");
+
+            Server session = JpaHelper.getServerSession(emf);
+
+            SchemaManager sm = new TemporalSchemaManager(session);
+            // Cache SchemaManager so it can be verified in test cases
+            session.setProperty(SchemaManager.class.getName(), sm);
+            sm.replaceDefaultTables(false, true);
+            sm.replaceSequences();
+
+            // Populate test case example instances
+            TemporalEntityManager em = TemporalEntityManager.getInstance(emf.createEntityManager());
+            em.getTransaction().begin();
+            populate(em);
+            em.getTransaction().commit();
+            em.close();
+            System.out.println("\n--- CREATE EMF & POPULATE DONE ---\n");
+
+            closeEntityManager();
+        }
+        return emf;
+    }
+
+    public TemporalEntityManager getEntityManager() {
+        return getEntityManager(null);
+    }
+
+    public TemporalEntityManager getEntityManager(Long effectiveTime) {
+        if (this.entityManager == null || !this.entityManager.isOpen()) {
+            TemporalEntityManager em = TemporalEntityManager.getInstance(getEMF().createEntityManager());
+            em.setEffectiveTime(effectiveTime);
+            this.entityManager = em;
+        }
+        return this.entityManager;
+    }
+
+    public void populate(TemporalEntityManager em) {
+    }
+
+    @AfterClass
+    public static void closeEMF() {
+        if (emf != null && emf.isOpen()) {
+            emf.close();
+        }
+        emf = null;
+    }
+
+    @Before
+    public void logTestName() {
+        System.out.println("\n\nTEST: " + testName.getMethodName() + "\n");
+    }
+
+    /**
+     * After each test case ensure the {@link EntityManager} is closed and if a
+     * transaction is active roll it back first.
+     */
+    @After
+    public void closeEntityManager() {
+        if (this.entityManager != null && this.entityManager.isOpen()) {
+            if (this.entityManager.getTransaction().isActive()) {
+                this.entityManager.getTransaction().rollback();
+            }
+            this.entityManager.close();
+        }
+        this.entityManager = null;
+        if (emf != null && emf.isOpen()) {
+            JpaHelper.getServerSession(emf).getIdentityMapAccessor().initializeAllIdentityMaps();
+        }
+
+    }
+
+}
diff --git a/Temporal Tests/src/tests/CustomerScenarios.java b/Temporal Tests/src/tests/CustomerScenarios.java
new file mode 100644
index 0000000..ccf46f0
--- /dev/null
+++ b/Temporal Tests/src/tests/CustomerScenarios.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *      dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+
+package tests;
+
+import static example.PersonModelExample.T1;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T3;
+import static example.PersonModelExample.T4;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import model.Address;
+import model.Person;
+import model.Phone;
+import model.entities.AddressEntity;
+import model.entities.PhoneEntity;
+
+import org.junit.Test;
+
+import temporal.TemporalEntityManager;
+
+/**
+ * TODO
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class CustomerScenarios extends BaseTestCase {
+
+    @Test
+    public void createPersonAndAddressNow() {
+        TemporalEntityManager em = getEntityManager();
+        em.getTransaction().begin();
+
+        Person p = em.newEntity(Person.class);
+        p.setName("Now");
+        Address a = new AddressEntity("now", "now", "now");
+        p.setAddress(a);
+
+        em.persist(p);
+
+        em.getTransaction().commit();
+        em.clear();
+        em.getEntityManagerFactory().getCache().evictAll();
+        System.out.println("\nREAD:\n");
+
+        Person readP = em.find(Person.class, p.getId());
+
+        Assert.assertEquals(p.getName(), readP.getName());
+        Assert.assertEquals("now", readP.getAddress().getCity());
+    }
+
+    @Test
+    public void createPersonAndAddressFuture() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+
+        em.getTransaction().begin();
+
+        Person p = em.newEntity( Person.class);
+        p.setName("Future");
+        Address a = em.newEntity( Address.class);
+        a.setCity("t2");
+        p.setAddress(a);
+
+        em.persist(p);
+
+        em.getTransaction().commit();
+        em.clear();
+        em.getEntityManagerFactory().getCache().evictAll();
+        System.out.println("\nREAD:\n");
+
+        Person readP = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + p.getId(), Person.class).getSingleResult();
+
+        Assert.assertEquals(p.getName(), readP.getName());
+        Assert.assertEquals("t2", readP.getAddress().getCity());
+    }
+
+    @Test
+    public void createPersonInFutureWithOldAddress() {
+        TemporalEntityManager em = getEntityManager();
+        em.getTransaction().begin();
+        Address a = new AddressEntity("now", "now", "now");
+        em.persist(a);
+        em.flush();
+
+        em.setEffectiveTime(T2);
+
+        Person p = em.newEntity( Person.class);
+        p.setName("Future");
+        p.setAddress(a);
+
+        em.persist(p);
+
+        em.getTransaction().commit();
+        em.clear();
+        em.getEntityManagerFactory().getCache().evictAll();
+        System.out.println("\nREAD:\n");
+
+        em.setEffectiveTime(T1);
+
+        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.address.city = 'now'", Person.class).getResultList();
+        Assert.assertTrue(results.isEmpty());
+
+        em.setEffectiveTime(T2);
+        Person readP = em.createQuery("SELECT p FROM Person p JOIN FETCH p.address WHERE p.address.city = 'now'", Person.class).getSingleResult();
+
+        Assert.assertNotNull(readP);
+        Assert.assertNotNull(readP.getAddress());
+        Assert.assertEquals(p.getName(), readP.getName());
+        Assert.assertEquals("now", readP.getAddress().getCity());
+    }
+
+    @Test
+    public void createPersonInFutureWithOldPhone() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.getTransaction().begin();
+        Phone phone_BOT = new PhoneEntity("work", "000-000-0000");
+        em.persist(phone_BOT);
+        em.flush();
+
+        em.setEffectiveTime(T2);
+
+        Person p = em.newEntity( Person.class);
+        p.setName("Future");
+        em.persist(p);
+
+        em.setEffectiveTime(T3);
+
+        Phone phone_T3 = em.newEdition(phone_BOT);
+        phone_T3.setNumber("333-333-3333");
+        p.addPhone(phone_T3);
+        em.persist(phone_T3);
+        em.getTransaction().commit();
+        em.clear();
+        em.getEntityManagerFactory().getCache().evictAll();
+
+        System.out.println("\nREAD:\n");
+
+        em.setEffectiveTime(T1);
+        Person readP_T1 = em.find(Person.class, p.getId());
+        System.out.println("Read Person @ T1: " + readP_T1);
+
+        em.clear();
+        em.getEntityManagerFactory().getCache().evictAll();
+
+        em.setEffectiveTime(T2);
+        Person readP_T2 = em.find(Person.class, p.getId());
+        System.out.println("Read Person @ T2: " + readP_T2 + " Phone: " + readP_T2.getPhone("work"));
+        Phone readPhone_T2 = em.find(Phone.class, phone_BOT.getId());
+        System.out.println("Read Phone @ T2: " + readPhone_T2);
+
+        em.clear();
+        em.getEntityManagerFactory().getCache().evictAll();
+
+        em.setEffectiveTime(T3);
+        Person readP_T3 = em.find(Person.class, p.getId());
+        System.out.println("Read Person @ T3: " + readP_T3 + " Phone: " + readP_T3.getPhone("work"));
+
+        em.clear();
+        em.getEntityManagerFactory().getCache().evictAll();
+
+        em.setEffectiveTime(T4);
+        Person readP_T4 = em.find(Person.class, p.getId());
+        System.out.println("Read Person @ T4: " + readP_T4 + " Phone: " + readP_T4.getPhone("work"));
+
+    }
+
+    @Override
+    public void populate(TemporalEntityManager em) {
+    }
+
+}
diff --git a/Temporal Tests/src/tests/DeleteContinuityTests.java b/Temporal Tests/src/tests/DeleteContinuityTests.java
new file mode 100644
index 0000000..d5034ce
--- /dev/null
+++ b/Temporal Tests/src/tests/DeleteContinuityTests.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T4;
+import model.Address;
+import model.Person;
+import model.Phone;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import temporal.TemporalEntityManager;
+import example.PersonModelExample;
+
+/**
+ * TODO
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class DeleteContinuityTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Test
+    public void test() {
+        getSample();
+        Assert.fail("NOT YET IMPLEMENTED");
+    }
+
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nFullPersonWithEditions.populate:START");
+
+        example.populateHobbies(em);
+        em.persist(example.fullPerson);
+        em.flush();
+
+        System.out.println("\n> Create T2 Edition");
+        em.setEffectiveTime(T2);
+
+        Person fpEdition = em.find(Person.class, example.fullPerson.getId());
+        Person personEditionT2 = em.newEdition(fpEdition);
+        personEditionT2.setName("Jimmy");
+        Address aT2 = em.newEdition(example.fullPerson.getAddress());
+        aT2.setCity("Toronto");
+        aT2.setState("ON");
+        personEditionT2.setAddress(aT2);
+        Phone pT2 = em.newEdition(example.fullPerson.getPhone("Home"));
+        personEditionT2.addPhone(pT2);
+        pT2.setNumber("222-222-2222");
+        em.persist(personEditionT2.addHobby(example.hobbies.get("golf"), T2));
+        em.flush();
+
+        System.out.println("\n> Create T4 Edition");
+        em.setEffectiveTime(T4);
+
+        Person personEditionT4 = em.newEdition(personEditionT2);
+        personEditionT4.setName("James");
+        Address aT4 = em.newEdition(aT2);
+        aT4.setCity("San Francisco");
+        aT4.setState("CA");
+        personEditionT4.setAddress(aT4);
+        Phone pT4 = em.newEdition(pT2);
+        pT4.setNumber("444-444-4444");
+        personEditionT4.addPhone(pT4);
+        personEditionT4.removeHobby(example.hobbies.get(GOLF), T4, T4);
+        personEditionT4.addHobby(example.hobbies.get("running"), T4);
+        personEditionT4.addHobby(example.hobbies.get("skiing"), T4);
+        em.flush();
+
+        System.out.println("\nFullPersonWithEditions.populate::DONE");
+    }
+
+}
diff --git a/Temporal Tests/src/tests/DeleteTests.java b/Temporal Tests/src/tests/DeleteTests.java
new file mode 100644
index 0000000..51c0f43
--- /dev/null
+++ b/Temporal Tests/src/tests/DeleteTests.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import static example.PersonModelExample.T1;
+
+import javax.persistence.EntityManager;
+
+import model.Person;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+
+import temporal.EditionWrapperHelper;
+import temporal.TemporalEntityManager;
+import example.PersonModelExample;
+
+/**
+ * Tests to verify delete use cases. In this temporal usage delete is equivalent
+ * to setting the end date to a point in time in the future. Then any queries
+ * after that time result in no edition being returned.
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class DeleteTests extends BaseTestCase {
+
+    private static PersonModelExample examples = new PersonModelExample();
+
+    @Test
+    public void deleteCurrentSimple() {
+        TemporalEntityManager em = getEntityManager();
+        em.getTransaction().begin();
+        em.persist(examples.simplePerson);
+        em.getTransaction().commit();
+        closeEntityManager();
+        
+        em = getEntityManager();
+            
+        Assert.assertEquals(1,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());
+        Person p = em.createQuery("SELECT p FROM Person p", Person.class).getSingleResult();
+        
+        Assert.assertNotNull(p);
+        
+        em.getTransaction().begin();
+        em.remove(p);
+        em.getTransaction().commit();
+        
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());
+    }
+
+    @Test
+    public void deleteCurrentSimpleAtT1() {
+        TemporalEntityManager em = getEntityManager();
+        em.getTransaction().begin();
+        em.persist(examples.simplePerson);
+        em.getTransaction().commit();
+        closeEntityManager();
+        
+        em = getEntityManager();
+            
+        Assert.assertEquals(1,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());
+        Person p = em.createQuery("SELECT p FROM Person p", Person.class).getSingleResult();
+        
+        Assert.assertNotNull(p);
+        
+        em.getTransaction().begin();
+
+        Person pWrapper = EditionWrapperHelper.wrap(em, p);
+        pWrapper.getEffectivity().setEnd(T1);
+        
+        em.getTransaction().commit();
+        
+        Assert.assertEquals(1,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());
+
+        em.setEffectiveTime( T1);
+        
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
+        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());
+    }
+
+    @After
+    public void deleteAll() {
+        EntityManager em = TemporalEntityManager.getInstance(getEMF().createEntityManager());
+        em.getTransaction().begin();
+        em.createQuery("DELETE FROM PersonHobby ph").executeUpdate();
+        em.createQuery("DELETE FROM Hobby h").executeUpdate();
+        em.createNativeQuery("DELETE FROM TADDRESS").executeUpdate();
+        em.createNativeQuery("DELETE FROM TPERSON_NNAMES").executeUpdate();
+        em.createNativeQuery("UPDATE TPERSON SET CID = NULL").executeUpdate();
+        em.createNativeQuery("DELETE FROM TPERSON").executeUpdate();
+        em.createNativeQuery("DELETE FROM TPHONE").executeUpdate();
+        em.getTransaction().commit();
+        em.close();
+    }
+}
diff --git a/Temporal Tests/src/tests/DuplicateInsertOnCreateMerge.java b/Temporal Tests/src/tests/DuplicateInsertOnCreateMerge.java
new file mode 100644
index 0000000..1e4ee41
--- /dev/null
+++ b/Temporal Tests/src/tests/DuplicateInsertOnCreateMerge.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.RUN;
+import static example.PersonModelExample.SKI;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T4;
+import junit.framework.Assert;
+import model.Address;
+import model.Person;
+import model.Phone;
+
+import org.junit.Test;
+
+import temporal.TemporalEntityManager;
+import example.PersonModelExample;
+
+/**
+ * Test cases dealing with potential duplicate insert scenarios
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class DuplicateInsertOnCreateMerge extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nFullPersonWithEditions.populate:START");
+
+        example.populateHobbies(em);
+        em.persist(getSample());
+        em.flush();
+
+        System.out.println("\nFullPersonWithEditions.populate::DONE");
+    }
+
+    public Person createPersonEditionAtT2(TemporalEntityManager em) {
+        em.setEffectiveTime(T2);
+
+        Person fpEdition = em.find(Person.class, getSample().getId());
+        Person personEditionT2 = fpEdition;
+
+        if (personEditionT2.getEffectivity().getStart() != T2) {
+            personEditionT2 = em.newEdition(fpEdition);
+            personEditionT2.setName("Jimmy");
+            Address aT2 = em.newEdition(fpEdition.getAddress());
+            aT2.setCity("Toronto");
+            aT2.setState("ON");
+            personEditionT2.setAddress(aT2);
+            Phone originalPhone = fpEdition.getPhone("Home");
+
+            Phone pT2 = em.newEdition(originalPhone);
+            personEditionT2.addPhone(pT2);
+            pT2.setNumber("222-222-2222");
+            em.persist(personEditionT2.addHobby(example.hobbies.get(GOLF), T2));
+        } else {
+            personEditionT2.getAddress();
+            personEditionT2.getPhones().size();
+        }
+        return personEditionT2;
+    }
+
+    @Test
+    public void createPersonAtT2AndMerge() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+        em.getTransaction().begin();
+
+        Person personEditionT2 = createPersonEditionAtT2(em);
+
+        Assert.assertNotNull(personEditionT2);
+        Assert.assertEquals(T2, personEditionT2.getEffectivity().getStart());
+        Assert.assertNotNull(personEditionT2.getPhone("Home"));
+
+        em.merge(personEditionT2);
+
+        em.getTransaction().commit();
+
+        em.clear();
+        personEditionT2 = em.find(Person.class, getSample().getId());
+
+        Assert.assertNotNull(personEditionT2);
+        Assert.assertEquals(T2, personEditionT2.getEffectivity().getStart());
+        Phone pT2 = personEditionT2.getPhone("Home");
+        Assert.assertNotNull(pT2);
+    }
+
+    @Test
+    public void createPersonAtT4AndMerge() {
+        TemporalEntityManager em = getEntityManager();
+        em.getTransaction().begin();
+        Person personEditionT2 = createPersonEditionAtT2(em);
+        Assert.assertNotNull(personEditionT2);
+        Assert.assertEquals(T2, personEditionT2.getEffectivity().getStart());
+        Assert.assertNotNull(personEditionT2.getPhone("Home"));
+
+        em.setEffectiveTime(T4);
+
+        Person personEditionT4 = em.newEdition(personEditionT2);
+        personEditionT4.setName("James");
+        Address aT4 = em.newEdition(personEditionT4.getAddress());
+        aT4.setCity("San Francisco");
+        aT4.setState("CA");
+        personEditionT4.setAddress(aT4);
+        Phone pT4 = em.newEdition(personEditionT4.getPhone("Home"));
+        pT4.setNumber("444-444-4444");
+        personEditionT4.addPhone(pT4);
+        personEditionT4.removeHobby(example.hobbies.get(GOLF), T4, T4);
+        em.persist(personEditionT4.addHobby(example.hobbies.get(RUN), T4));
+        em.persist(personEditionT4.addHobby(example.hobbies.get(SKI), T4));
+
+        em.merge(personEditionT4);
+        em.getTransaction().commit();
+    }
+}
diff --git a/Temporal Tests/src/tests/FullPersonWithEditions.java b/Temporal Tests/src/tests/FullPersonWithEditions.java
new file mode 100644
index 0000000..79ddb2b
--- /dev/null
+++ b/Temporal Tests/src/tests/FullPersonWithEditions.java
@@ -0,0 +1,801 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.RUN;
+import static example.PersonModelExample.SKI;
+import static example.PersonModelExample.T1;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T3;
+import static example.PersonModelExample.T4;
+import static example.PersonModelExample.T5;
+import static temporal.Effectivity.BOT;
+import static temporal.Effectivity.EOT;
+
+import java.sql.Date;
+import java.util.List;
+
+import javax.persistence.NoResultException;
+import javax.persistence.TypedQuery;
+
+import model.Address;
+import model.Person;
+import model.Phone;
+import model.entities.PhoneEntity;
+
+import org.eclipse.persistence.jpa.JpaHelper;
+import org.eclipse.persistence.sessions.CopyGroup;
+import org.junit.Assert;
+import org.junit.Test;
+
+import temporal.BaseEntity;
+import temporal.EditionSet;
+import temporal.TemporalEntityManager;
+import temporal.TemporalHelper;
+import example.PersonModelExample;
+
+/**
+ * This test case performs current and edition queries on a simple
+ * Person-Address-Phones model both illustrating and verifying query operations.
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class FullPersonWithEditions extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nFullPersonWithEditions.populate:START");
+
+        example.populateHobbies(em);
+        em.persist(example.fullPerson);
+        em.flush();
+
+        System.out.println("\n> Create T2 Edition");
+        em.setEffectiveTime(T2);
+
+        Person fpEdition = em.find(Person.class, example.fullPerson.getId());
+        Person personEditionT2 = em.newEdition(fpEdition);
+
+        personEditionT2.setName("Jimmy");
+        Address aT2 = em.newEdition(example.fullPerson.getAddress());
+        aT2.setCity("Toronto");
+        aT2.setState("ON");
+        personEditionT2.setDateOfBirth(new Date(75, 1, 5));
+
+        personEditionT2.setAddress(aT2);
+        Phone pT2 = em.newEdition(example.fullPerson.getPhone("Home"));
+        personEditionT2.addPhone(pT2);
+        pT2.setNumber("222-222-2222");
+        Phone pWT2 = em.newEntity(PhoneEntity.class);
+        pWT2.setType("Work");
+        pWT2.setNumber("333-333-3333");
+        personEditionT2.addPhone(pWT2);
+
+        em.persist(personEditionT2.addHobby(example.hobbies.get(GOLF), T2));
+
+        // Assert.assertEquals(personEditionT2.getPhones().size() - 1,
+        // fpEdition.getPhones().size());
+        // Assert.assertEquals(personEditionT2.getPersonHobbies().size() - 1,
+        // fpEdition.getPersonHobbies().size());
+
+        em.flush();
+
+        System.out.println("\n> Create T4 Edition");
+        em.setEffectiveTime(T4);
+
+        Person personEditionT4 = em.newEdition(personEditionT2);
+        personEditionT4.setName("James");
+        Address aT4 = em.newEdition(aT2);
+        aT4.setCity("San Francisco");
+        aT4.setState("CA");
+        personEditionT4.setAddress(aT4);
+
+        Phone pT4 = em.newEdition(pT2);
+        pT4.setNumber("444-444-4444");
+        personEditionT4.addPhone(pT4);
+        pWT2.getEffectivity().setEnd(T4);
+        Phone pCT4 = em.newEntity(PhoneEntity.class);
+        pCT4.setType("Cell");
+        pCT4.setNumber("555-555-55555");
+        personEditionT4.addPhone(pCT4);
+
+        personEditionT4.getPersonHobbies().get(GOLF).getEffectivity().setEnd(T4);
+
+        em.persist(personEditionT4.addHobby(example.hobbies.get(RUN), T4));
+        em.persist(personEditionT4.addHobby(example.hobbies.get(SKI), T4));
+
+        em.flush();
+
+        System.out.println("\nFullPersonWithEditions.populate::DONE");
+    }
+
+    @Test
+    public void queryAllCurrent() {
+        TemporalEntityManager em = getEntityManager();
+        List<Person> results = em.createQuery("SELECT p From Person p", Person.class).getResultList();
+
+        System.out.println("QUERY CURRENT:");
+        for (Person p : results) {
+            System.out.println("\t>" + p);
+        }
+
+        Assert.assertEquals(1, results.size());
+
+        Person currentperson = results.get(0);
+        Assert.assertSame(currentperson, currentperson.getContinuity());
+        Assert.assertEquals(getSample().getId(), currentperson.getId());
+    }
+
+    @Test
+    public void findCurrent() {
+        TemporalEntityManager em = getEntityManager();
+
+        Person current = em.find(Person.class, getSample().getId());
+
+        System.out.println("VERIFY CURRENT: " + current);
+
+        // Verify person
+        Assert.assertNotNull(current);
+        Assert.assertEquals(current, current.getContinuity());
+        Assert.assertEquals(getSample().getId(), current.getId());
+        Assert.assertEquals(getSample().getName(), current.getName());
+        Assert.assertTrue(current.getEffectivity().isCurrent());
+        Assert.assertFalse(current.getEffectivity().isFutureEdition());
+        Assert.assertEquals(current.getEffectivity().getStart(), BOT);
+        Assert.assertEquals(current.getEffectivity().getEnd(), T2);
+
+        // Address
+        Assert.assertNotNull(current.getAddress());
+        Assert.assertEquals(getSample().getAddress().getStreet(), current.getAddress().getStreet());
+        Assert.assertEquals(getSample().getAddress().getCity(), current.getAddress().getCity());
+        Assert.assertEquals(getSample().getAddress().getState(), current.getAddress().getState());
+        Assert.assertTrue(current.getAddress().getEffectivity().isCurrent());
+        Assert.assertFalse(current.getAddress().getEffectivity().isFutureEdition());
+        Assert.assertEquals(current.getAddress().getEffectivity().getStart(), BOT);
+        Assert.assertEquals(current.getAddress().getEffectivity().getEnd(), T2);
+
+        // Phone
+        Assert.assertEquals(1, current.getPhones().size());
+        Phone currentHome = current.getPhone("Home");
+        Assert.assertNotNull(currentHome);
+        Assert.assertEquals("111-111-1111", currentHome.getNumber());
+        Assert.assertSame(current, currentHome.getPerson());
+    }
+
+    @Test
+    public void queryAllCurrentJoinAddress() {
+        TemporalEntityManager em = getEntityManager();
+        List<Person> results = em.createQuery("SELECT p From Person p JOIN FETCH p.address", Person.class).getResultList();
+
+        System.out.println("QUERY CURRENT:");
+        for (Person p : results) {
+            System.out.println("\t>" + p);
+        }
+
+        Assert.assertEquals(1, results.size());
+
+        Person currentperson = results.get(0);
+        Assert.assertSame(currentperson, currentperson.getContinuity());
+        Assert.assertEquals(getSample().getId(), currentperson.getId());
+    }
+
+    @Test
+    public void querySampleCurrentPerson() {
+        TemporalEntityManager em = getEntityManager();
+
+        Person person = em.createQuery("SELECT p From Person p WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+        Address address = person.getAddress();
+
+        Assert.assertNotNull(person);
+
+        System.out.println("FIND CURRENT: " + person);
+
+        Assert.assertEquals(getSample().getId(), person.getId());
+        Assert.assertSame(person, person.getContinuity());
+        Assert.assertNotNull(address);
+        Assert.assertEquals(getSample().getAddress().getCity(), address.getCity());
+    }
+
+    @Test
+    public void querySampleCurrentPersonJoinAddress() {
+        TemporalEntityManager em = getEntityManager();
+
+        Person person = em.createQuery("SELECT p From Person p JOIN FETCH p.address WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+        Address address = person.getAddress();
+
+        Assert.assertNotNull(person);
+
+        System.out.println("FIND CURRENT: " + person);
+
+        Assert.assertEquals(getSample().getId(), person.getId());
+        Assert.assertEquals(person, person.getContinuity());
+        Assert.assertNotNull(address);
+        Assert.assertEquals(getSample().getAddress().getCity(), address.getCity());
+    }
+
+    @Test
+    public void findSampleCurrentPerson() {
+        TemporalEntityManager em = getEntityManager();
+        Person person = em.find(Person.class, getSample().getId());
+
+        Assert.assertNotNull(person);
+
+        System.out.println("FIND CURRENT: " + person);
+
+        Assert.assertEquals(getSample().getId(), person.getId());
+        Assert.assertSame(person, person.getContinuity());
+        Assert.assertTrue(person.getEffectivity().isCurrent());
+        Assert.assertFalse(person.getEffectivity().isFutureEdition());
+        Assert.assertEquals(person.getEffectivity().getStart(), BOT);
+        Assert.assertEquals(person.getEffectivity().getEnd(), T2);
+
+        Assert.assertEquals(0, person.getPersonHobbies().size());
+
+        Assert.assertEquals(1, person.getPhones().size());
+
+    }
+
+    @Test
+    public void findFuturePersonEntityEditionT2() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+
+        Person person = em.find(Person.class, getSample().getId());
+        Assert.assertNotNull(person);
+        System.out.println("FIND Future Edition: " + person);
+        Assert.assertEquals(1, person.getPersonHobbies().size());
+
+        Person continuity = person.getContinuity();
+
+        Assert.assertNotNull(continuity);
+        System.out.println("\tContinuity: " + continuity);
+        Assert.assertTrue("Not an edition entity", TemporalHelper.isEdition(em, person));
+        Assert.assertEquals(getSample().getId(), person.getContinuity().getId());
+
+        Assert.assertFalse(person.getEffectivity().isCurrent());
+        Assert.assertTrue(person.getEffectivity().isFutureEdition());
+        Assert.assertEquals(person.getEffectivity().getStart(), T2);
+        Assert.assertEquals(person.getEffectivity().getEnd(), T4);
+        Assert.assertNotSame(person, person.getContinuity());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtBOT() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(BOT);
+
+        Person pEdition = em.createQuery("SELECT p From Person p WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+
+        System.out.println("QUERY EDITION @ BOT: " + pEdition);
+
+        Assert.assertNotNull("No edition found at BOT", pEdition);
+        Assert.assertTrue(pEdition.getEffectivity().isCurrent());
+        Assert.assertFalse(pEdition.getEffectivity().isFutureEdition());
+        Assert.assertEquals(BOT, pEdition.getEffectivity().getStart());
+        Assert.assertEquals(T2, pEdition.getEffectivity().getEnd());
+        Assert.assertNotNull("No Continuity found", pEdition.getContinuity());
+        Assert.assertEquals(0, pEdition.getPersonHobbies().size());
+
+        Address address = pEdition.getAddress();
+
+        Assert.assertNotNull(address);
+        Assert.assertEquals(getSample().getAddress().getCity(), address.getCity());
+
+        Assert.assertEquals(1, pEdition.getPhones().size());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT1() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T1);
+
+        Person pEdition = em.createQuery("SELECT p From Person p WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+
+        System.out.println("QUERY EDITION @ T1: " + pEdition);
+
+        Assert.assertNotNull("No edition found at T1", pEdition);
+        Assert.assertTrue(pEdition.getEffectivity().isCurrent());
+        Assert.assertFalse(pEdition.getEffectivity().isFutureEdition());
+        Assert.assertEquals(BOT, pEdition.getEffectivity().getStart());
+        Assert.assertEquals(T2, pEdition.getEffectivity().getEnd());
+        Assert.assertNotNull("No Continuity found", pEdition.getContinuity());
+
+        Assert.assertEquals(0, pEdition.getPersonHobbies().size());
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(SKI));
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(RUN));
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(GOLF));
+
+        Address address = pEdition.getAddress();
+
+        Assert.assertNotNull(address);
+        Assert.assertEquals(getSample().getAddress().getCity(), address.getCity());
+
+        Assert.assertEquals(1, pEdition.getPhones().size());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT2() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+
+        Person pEdition = em.createQuery("SELECT p From Person p WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+
+        System.out.println("QUERY EDITION @ T2: " + pEdition);
+
+        Assert.assertNotNull("No edition found at T2", pEdition);
+        Assert.assertFalse(pEdition.getEffectivity().isCurrent());
+        Assert.assertTrue(pEdition.getEffectivity().isFutureEdition());
+        Assert.assertEquals(T2, pEdition.getEffectivity().getStart());
+        Assert.assertEquals(T4, pEdition.getEffectivity().getEnd());
+        Assert.assertNotSame(pEdition, pEdition.getContinuity());
+
+        Assert.assertEquals(1, pEdition.getPersonHobbies().size());
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(SKI));
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(RUN));
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(GOLF));
+
+        Address address = pEdition.getAddress();
+
+        Assert.assertNotNull(address);
+        Assert.assertEquals("Toronto", address.getCity());
+
+        Assert.assertEquals(2, pEdition.getPhones().size());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT2JoinFetchAddress() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+
+        Person pEdition = null;
+        try {
+            pEdition = em.createQuery("SELECT p From Person p JOIN FETCH p.address WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+        } catch (NoResultException e) {
+            Assert.fail("Join returned no result");
+        }
+        Address address = pEdition.getAddress();
+
+        System.out.println("QUERY EDITION @ T2: " + pEdition);
+        System.out.println("\t> " + address);
+
+        Assert.assertNotNull("No edition found", pEdition);
+        Assert.assertFalse(pEdition.getEffectivity().isCurrent());
+        Assert.assertTrue(pEdition.getEffectivity().isFutureEdition());
+        Assert.assertEquals(T2, pEdition.getEffectivity().getStart());
+        Assert.assertEquals(T4, pEdition.getEffectivity().getEnd());
+        Assert.assertNotNull("No Continuity found", pEdition.getContinuity());
+        Assert.assertNotNull(address);
+        Assert.assertEquals("Toronto", address.getCity());
+
+        Assert.assertEquals(1, pEdition.getPersonHobbies().size());
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(SKI));
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(RUN));
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(GOLF));
+
+        Assert.assertEquals(2, pEdition.getPhones().size());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT3() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T3);
+
+        Person pEdition = em.createQuery("SELECT p From Person p WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+
+        System.out.println("QUERY EDITION @ T3: " + pEdition);
+
+        Assert.assertNotNull("No edition found ", pEdition);
+        Assert.assertFalse(pEdition.getEffectivity().isCurrent());
+        Assert.assertTrue(pEdition.getEffectivity().isFutureEdition());
+        Assert.assertEquals(T2, pEdition.getEffectivity().getStart());
+        Assert.assertEquals(T4, pEdition.getEffectivity().getEnd());
+        Assert.assertNotSame(pEdition, pEdition.getContinuity());
+
+        Assert.assertEquals(1, pEdition.getPersonHobbies().size());
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(SKI));
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(RUN));
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(GOLF));
+
+        Address address = pEdition.getAddress();
+
+        Assert.assertNotNull(address);
+        Assert.assertEquals("Toronto", address.getCity());
+
+        Assert.assertEquals(2, pEdition.getPhones().size());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT4() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T4);
+
+        Person pEdition = em.createQuery("SELECT p From Person p WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+
+        System.out.println("QUERY EDITION @ T4: " + pEdition);
+
+        Assert.assertNotNull("No Person Edition Found", pEdition);
+        Assert.assertFalse(pEdition.getEffectivity().isCurrent());
+        Assert.assertTrue(pEdition.getEffectivity().isFutureEdition());
+        Assert.assertEquals(T4, pEdition.getEffectivity().getStart());
+        Assert.assertEquals(EOT, pEdition.getEffectivity().getEnd());
+        Assert.assertNotSame(pEdition, pEdition.getContinuity());
+
+        Assert.assertEquals(2, pEdition.getPersonHobbies().size());
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(SKI));
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(RUN));
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(GOLF));
+
+        Address address = pEdition.getAddress();
+
+        Assert.assertNotNull(address);
+
+        Assert.assertEquals(2, pEdition.getPhones().size());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT5() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T5);
+
+        Person pEdition = em.createQuery("SELECT p From Person p WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+
+        System.out.println("QUERY EDITION @ T5: " + pEdition);
+
+        Assert.assertNotNull("No edition found at T5", pEdition);
+        Assert.assertFalse(pEdition.getEffectivity().isCurrent());
+        Assert.assertTrue(pEdition.getEffectivity().isFutureEdition());
+        Assert.assertEquals(T4, pEdition.getEffectivity().getStart());
+        Assert.assertEquals(EOT, pEdition.getEffectivity().getEnd());
+        Assert.assertNotSame(pEdition, pEdition.getContinuity());
+        Assert.assertEquals(2, pEdition.getPersonHobbies().size());
+
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(SKI));
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(RUN));
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(GOLF));
+
+        Assert.assertEquals(2, pEdition.getPhones().size());
+    }
+
+    @Test
+    public void nativeQueryForAllEdition() {
+        TemporalEntityManager em = getEntityManager();
+
+        TypedQuery<Person> query = em.createNamedQuery("PersonEdition.all", Person.class);
+        query.setParameter("CID", getSample().getId());
+        List<Person> editions = query.getResultList();
+
+        Assert.assertFalse("No edition found", editions.isEmpty());
+
+        System.out.println("QUERY ALL EDITIONS:");
+        for (Person p : editions) {
+            System.out.println("\t" + p);
+            Assert.assertNotNull("No Continuity found", p.getContinuity());
+        }
+
+        Assert.assertEquals(3, editions.size());
+    }
+
+    // @Test
+    public void deleteAllAtT5() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T5);
+
+        Person p = em.find(Person.class, getSample().getId());
+
+        em.getTransaction().begin();
+
+        p.getEffectivity().setEnd(T5);
+        p.getAddress().getEffectivity().setEnd(T5);
+        for (Phone phone : p.getPhones().values()) {
+            phone.getEffectivity().setEnd(T5);
+        }
+
+        em.flush();
+
+        // TODO - validation
+    }
+
+    @Test
+    public void detachResultUsingCopyPolicy() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+
+        TypedQuery<Person> query = em.createNamedQuery("PersonEdition.find", Person.class);
+        query.setParameter("ID", getSample().getId());
+
+        Person p = query.getSingleResult();
+
+        System.out.println("ORIGINAL: " + p + " HASHCODE: " + System.identityHashCode(p));
+        System.out.println("\t" + p.getAddress());
+
+        CopyGroup cg = new CopyGroup();
+        cg.cascadeAllParts();
+
+        Person pCopy = (Person) JpaHelper.getEntityManager(em).copy(p, cg);
+        System.out.println("COPY: " + pCopy + " HASHSCODE: " + System.identityHashCode(pCopy));
+        System.out.println("\t" + pCopy.getAddress());
+    }
+
+    @Test
+    public void modifyFutureEditionOfCurrentPersonAtT4() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T4);
+
+        Person pEdition = em.createQuery("SELECT p From Person p WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+
+        System.out.println("QUERY EDITION @ T4: " + pEdition);
+
+        Assert.assertNotNull("No Person Edition Found", pEdition);
+        Assert.assertFalse(pEdition.getEffectivity().isCurrent());
+        Assert.assertTrue(pEdition.getEffectivity().isFutureEdition());
+        Assert.assertEquals(T4, pEdition.getEffectivity().getStart());
+        Assert.assertNotSame(pEdition, pEdition.getContinuity());
+
+        Assert.assertEquals(2, pEdition.getPersonHobbies().size());
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(SKI));
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(RUN));
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(GOLF));
+
+        long currentVersion = pEdition.getVersion();
+
+        em.getTransaction().begin();
+        pEdition.setName(pEdition.getName().toUpperCase());
+        em.flush();
+
+        Assert.assertEquals(currentVersion + 1, pEdition.getVersion());
+    }
+
+    @Test
+    public void modifyFutureEditionOfCurrentPersonAtT4UsingMerge() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T4);
+
+        Person pEdition = em.createQuery("SELECT p From Person p WHERE p.id = " + getSample().getId(), Person.class).getSingleResult();
+
+        System.out.println("QUERY EDITION @ T4: " + pEdition);
+
+        // Create new unregistered hobby and add.
+
+        Assert.assertNotNull("No Person Edition Found", pEdition);
+        Assert.assertFalse(pEdition.getEffectivity().isCurrent());
+        Assert.assertTrue(pEdition.getEffectivity().isFutureEdition());
+        Assert.assertEquals(T4, pEdition.getEffectivity().getStart());
+        Assert.assertNotSame(pEdition, pEdition.getContinuity());
+
+        Assert.assertEquals(2, pEdition.getPersonHobbies().size());
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(SKI));
+        Assert.assertTrue(pEdition.getPersonHobbies().containsKey(RUN));
+        Assert.assertFalse(pEdition.getPersonHobbies().containsKey(GOLF));
+
+        long currentVersion = pEdition.getVersion();
+
+        em.getTransaction().begin();
+        pEdition.setName(pEdition.getName().toUpperCase());
+        em.flush();
+
+        Assert.assertEquals(currentVersion + 1, pEdition.getVersion());
+    }
+
+    /**
+     * Verify that the edition creation operation correctly copies values
+     * including mutable values and collections.
+     */
+    @Test
+    public void verifyCreateEditionCopying() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T5);
+        EditionSet es = em.getEditionSet();
+
+        Person pEdition = em.find(Person.class, getSample().getId());
+
+        Assert.assertNotNull(pEdition);
+        Assert.assertTrue(TemporalHelper.isEdition(em, pEdition));
+        Assert.assertEquals(T4, pEdition.getEffectivity().getStart());
+        Assert.assertNotNull(es);
+        Assert.assertTrue(es.getEntries().isEmpty());
+
+        Person pAtT5 = em.newEdition(pEdition);
+
+        Assert.assertNotNull(pAtT5);
+        Assert.assertTrue(TemporalHelper.isEdition(em, pEdition));
+        Assert.assertEquals(T5, pAtT5.getEffectivity().getStart());
+        Assert.assertFalse(es.getEntries().isEmpty());
+        Assert.assertEquals(1, es.getEntries().size());
+
+        // Verify collection/map cloning
+        Assert.assertNotSame(pEdition.getPhones(), pAtT5.getPhones());
+        Assert.assertNotSame(pEdition.getPersonHobbies(), pAtT5.getPersonHobbies());
+        Assert.assertNotSame(pEdition.getNicknames(), pAtT5.getNicknames());
+
+        // Mutable non-temporal values
+        Assert.assertSame(pEdition.getDateOfBirth(), pAtT5.getDateOfBirth());
+
+        // TODO: Validate mutable basic copying
+
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testDateOfBirthNonTemporalStorage() {
+        TemporalEntityManager em = getEntityManager();
+
+        List<?> results = em.createNativeQuery("SELECT DATEOFBIRTH FROM TPERSON WHERE CID = 1 ORDER BY OID").getResultList();
+
+        Assert.assertNotNull(results);
+        Assert.assertEquals(3, results.size());
+        Assert.assertEquals(new Date(75, 1, 5), results.get(0));
+        Assert.assertNull(results.get(1));
+        Assert.assertNull(results.get(2));
+    }
+
+    /**
+     * Verify the query result and relationship to person
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void queryCurrentHomePhone() {
+        TemporalEntityManager em = getEntityManager();
+
+        TypedQuery<Phone> query = em.createQuery("SELECT p FROM Phone p WHERE p.type = 'Home'", Phone.class);
+        Phone phone = query.getSingleResult();
+
+        Assert.assertNotNull(phone);
+        Assert.assertFalse(TemporalHelper.isEditionClass((Class<BaseEntity>) phone.getClass()));
+        Assert.assertNotNull(phone.getContinuity());
+        Assert.assertEquals(phone, phone.getContinuity());
+        Assert.assertEquals(BOT, phone.getEffectivity().getStart());
+        Assert.assertEquals(T2, phone.getEffectivity().getEnd());
+
+        Assert.assertNotNull(phone.getPerson());
+        Assert.assertEquals(phone.getEffectivity().getStart(), phone.getPerson().getEffectivity().getStart());
+    }
+
+    /**
+     * Verify the query result and relationship to person
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void queryHomePhoneAtBOT() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(BOT);
+
+        TypedQuery<Phone> query = em.createQuery("SELECT p FROM Phone p WHERE p.type = 'Home'", Phone.class);
+        Phone phone = query.getSingleResult();
+
+        Assert.assertNotNull(phone);
+        Assert.assertTrue(TemporalHelper.isEditionClass((Class<BaseEntity>) phone.getClass()));
+        Assert.assertNotNull(phone.getContinuity());
+        Assert.assertEquals(BOT, phone.getEffectivity().getStart());
+        Assert.assertEquals(T2, phone.getEffectivity().getEnd());
+
+        Assert.assertNotNull(phone.getPerson());
+        Assert.assertEquals(phone.getEffectivity().getStart(), phone.getPerson().getEffectivity().getStart());
+    }
+
+    /**
+     * Verify the query result and relationship to person
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void queryHomePhoneAtT1() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T1);
+
+        TypedQuery<Phone> query = em.createQuery("SELECT p FROM Phone p WHERE p.type = 'Home'", Phone.class);
+        Phone phone = query.getSingleResult();
+
+        Assert.assertNotNull(phone);
+        Assert.assertTrue(TemporalHelper.isEditionClass((Class<BaseEntity>) phone.getClass()));
+        Assert.assertNotNull(phone.getContinuity());
+        Assert.assertEquals(BOT, phone.getEffectivity().getStart());
+        Assert.assertEquals(T2, phone.getEffectivity().getEnd());
+
+        Assert.assertNotNull(phone.getPerson());
+        Assert.assertEquals(phone.getEffectivity().getStart(), phone.getPerson().getEffectivity().getStart());
+    }
+
+    /**
+     * Verify the query result and relationship to person
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void queryHomePhoneAtT2() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+
+        TypedQuery<Phone> query = em.createQuery("SELECT p FROM Phone p WHERE p.type = 'Home'", Phone.class);
+        Phone phone = query.getSingleResult();
+
+        Assert.assertNotNull(phone);
+        Assert.assertTrue(TemporalHelper.isEditionClass((Class<BaseEntity>) phone.getClass()));
+        Assert.assertNotNull(phone.getContinuity());
+        Assert.assertEquals(T2, phone.getEffectivity().getStart());
+        Assert.assertEquals(T4, phone.getEffectivity().getEnd());
+
+        Assert.assertNotNull(phone.getPerson());
+        Assert.assertEquals(phone.getEffectivity().getStart(), phone.getPerson().getEffectivity().getStart());
+    }
+
+    /**
+     * Verify the query result and relationship to person
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void queryHomePhoneAtT3() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T3);
+
+        TypedQuery<Phone> query = em.createQuery("SELECT p FROM Phone p WHERE p.type = 'Home'", Phone.class);
+        Phone phone = query.getSingleResult();
+
+        Assert.assertNotNull(phone);
+        Assert.assertTrue(TemporalHelper.isEditionClass((Class<BaseEntity>) phone.getClass()));
+        Assert.assertNotNull(phone.getContinuity());
+        Assert.assertEquals(T2, phone.getEffectivity().getStart());
+        Assert.assertEquals(T4, phone.getEffectivity().getEnd());
+
+        Assert.assertNotNull(phone.getPerson());
+        Assert.assertEquals(phone.getEffectivity().getStart(), phone.getPerson().getEffectivity().getStart());
+    }
+
+    /**
+     * Verify the query result and relationship to person
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void queryHomePhoneAtT4() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T4);
+
+        TypedQuery<Phone> query = em.createQuery("SELECT p FROM Phone p WHERE p.type = 'Home'", Phone.class);
+        Phone phone = query.getSingleResult();
+
+        Assert.assertNotNull(phone);
+        Assert.assertTrue(TemporalHelper.isEditionClass((Class<BaseEntity>) phone.getClass()));
+        Assert.assertNotNull(phone.getContinuity());
+        Assert.assertEquals(T4, phone.getEffectivity().getStart());
+        Assert.assertEquals(EOT, phone.getEffectivity().getEnd());
+
+        Assert.assertNotNull(phone.getPerson());
+        Assert.assertEquals(phone.getEffectivity().getStart(), phone.getPerson().getEffectivity().getStart());
+    }
+
+    /**
+     * Verify the query result and relationship to person
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void queryHomePhoneAtT5() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T5);
+
+        TypedQuery<Phone> query = em.createQuery("SELECT p FROM Phone p WHERE p.type = 'Home'", Phone.class);
+        Phone phone = query.getSingleResult();
+
+        Assert.assertNotNull(phone);
+        Assert.assertTrue(TemporalHelper.isEditionClass((Class<BaseEntity>) phone.getClass()));
+        Assert.assertNotNull(phone.getContinuity());
+        Assert.assertEquals(T4, phone.getEffectivity().getStart());
+        Assert.assertEquals(EOT, phone.getEffectivity().getEnd());
+
+        Assert.assertNotNull(phone.getPerson());
+        Assert.assertEquals(phone.getEffectivity().getStart(), phone.getPerson().getEffectivity().getStart());
+    }
+}
diff --git a/Temporal Tests/src/tests/FuturePersonTests.java b/Temporal Tests/src/tests/FuturePersonTests.java
new file mode 100644
index 0000000..b590819
--- /dev/null
+++ b/Temporal Tests/src/tests/FuturePersonTests.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import static example.PersonModelExample.T1;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T3;
+import static example.PersonModelExample.T4;
+import static example.PersonModelExample.T5;
+import static example.PersonModelExample.T6;
+import static temporal.Effectivity.BOT;
+
+import java.util.List;
+
+import model.Person;
+import model.PersonHobby;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import temporal.TemporalEntityManager;
+import example.PersonModelExample;
+
+/**
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class FuturePersonTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.futurePerson;
+    }
+
+    @Override
+    public void populate(TemporalEntityManager em) {
+        example.populateHobbies(em);
+        for (PersonHobby ph : example.futurePerson.getPersonHobbies().values()) {
+            em.persist(ph);
+        }
+        em.persist(example.futurePerson);
+    }
+
+    @Test
+    public void queryAllCurrent() {
+        TemporalEntityManager em = getEntityManager();
+
+        List<Person> results = example.queryAllCurrent(em);
+
+        Assert.assertTrue(results.isEmpty());
+    }
+
+    @Test
+    public void queryPersonEditionAtBOT() {
+        TemporalEntityManager em = getEntityManager();
+        em.setProperty("EFF_TS", BOT);
+
+        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();
+
+        Assert.assertTrue("Editions found", results.isEmpty());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT1() {
+        TemporalEntityManager em = getEntityManager();
+        em.setProperty("EFF_TS", T1);
+
+        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();
+
+        Assert.assertTrue("Editions found", results.isEmpty());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT2() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+
+        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();
+
+        System.out.println("QUERY EFFECTIVE @ T2:");
+        for (Person p : results) {
+            System.out.println("\t>" + p);
+            System.out.println("\t\t>" + p.getAddress());
+            System.out.println("\t\t>" + p.getPhones().values());
+        }
+
+        Assert.assertFalse("No Editions found", results.isEmpty());
+        Assert.assertEquals(1, results.size());
+
+        Person person = results.get(0);
+
+        Assert.assertSame(person, person.getContinuity());
+        Assert.assertFalse(person.getEffectivity().isCurrent());
+        Assert.assertTrue(person.getEffectivity().isFutureEdition());
+        Assert.assertEquals(getSample().getId(), person.getId());
+        Assert.assertEquals(getSample().getName(), person.getName());
+        Assert.assertNull(person.getAddress());
+        Assert.assertTrue(person.getPhones().isEmpty());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT3() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T3);
+
+        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();
+
+        System.out.println("QUERY EFFECTIVE @ T3:");
+        for (Person p : results) {
+            System.out.println("\t>" + p);
+            System.out.println("\t\t>" + p.getAddress());
+            System.out.println("\t\t>" + p.getPhones().values());
+        }
+
+        Assert.assertFalse("No Editions found", results.isEmpty());
+        Assert.assertEquals(1, results.size());
+
+        Person person = results.get(0);
+
+        Assert.assertSame(person, person.getContinuity());
+        Assert.assertFalse(person.getEffectivity().isCurrent());
+        Assert.assertTrue(person.getEffectivity().isFutureEdition());
+        Assert.assertEquals(getSample().getId(), person.getId());
+        Assert.assertEquals(getSample().getName(), person.getName());
+        Assert.assertNotNull(person.getAddress());
+        Assert.assertTrue(person.getPhones().isEmpty());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT4() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T4);
+
+        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();
+
+        Assert.assertFalse("No PersonEdition Found", results.isEmpty());
+
+        System.out.println("QUERY EFFECTIVE @ T4:");
+        for (Person p : results) {
+            System.out.println("\t>" + p);
+            System.out.println("\t\t>" + p.getAddress());
+            System.out.println("\t\t>" + p.getPhones().values());
+        }
+
+        Assert.assertFalse("No Editions found", results.isEmpty());
+        Assert.assertEquals(1, results.size());
+
+        Person person = results.get(0);
+
+        Assert.assertSame(person, person.getContinuity());
+        Assert.assertFalse(person.getEffectivity().isCurrent());
+        Assert.assertTrue(person.getEffectivity().isFutureEdition());
+        Assert.assertEquals(getSample().getId(), person.getId());
+        Assert.assertEquals(getSample().getName(), person.getName());
+        Assert.assertNotNull(person.getAddress());
+        Assert.assertFalse(person.getPhones().isEmpty());
+    }
+
+    @Test
+    public void queryFutureEditionOfCurrentPersonAtT5() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T5);
+
+        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();
+
+        System.out.println("QUERY EFFECTIVE @ T5:");
+        for (Person p : results) {
+            System.out.println("\t>" + p);
+            System.out.println("\t\t>" + p.getAddress());
+            System.out.println("\t\t>" + p.getPhones().values());
+        }
+
+        Assert.assertFalse("No Editions found", results.isEmpty());
+        Assert.assertEquals(1, results.size());
+
+        Person person = results.get(0);
+
+        Assert.assertSame(person, person.getContinuity());
+        Assert.assertFalse(person.getEffectivity().isCurrent());
+        Assert.assertTrue(person.getEffectivity().isFutureEdition());
+        Assert.assertEquals(getSample().getId(), person.getId());
+        Assert.assertEquals(getSample().getName(), person.getName());
+        Assert.assertNotNull(person.getAddress());
+        Assert.assertFalse(person.getPhones().isEmpty());
+    }
+
+    @Test
+    public void verifyCreateNewEntityInFuture() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T6);
+
+        em.getTransaction().begin();
+
+        Person p = em.newEntity(Person.class);
+
+        Assert.assertNotNull(p);
+        Assert.assertNotNull(p.getEffectivity());
+
+        em.getTransaction().rollback();
+    }
+
+}
diff --git a/Temporal Tests/src/tests/ModifyCurrentTests.java b/Temporal Tests/src/tests/ModifyCurrentTests.java
new file mode 100644
index 0000000..a74559b
--- /dev/null
+++ b/Temporal Tests/src/tests/ModifyCurrentTests.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.RUN;
+import static example.PersonModelExample.SKI;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T4;
+import model.Address;
+import model.Person;
+import model.Phone;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import temporal.TemporalEntityManager;
+import example.PersonModelExample;
+
+/**
+ * Make changes to the current (continuity) require that all future editions
+ * which had the same value as the current be updated.
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class ModifyCurrentTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Test
+    public void test() {
+        getSample();
+        Assert.fail("NOT YET IMPLEMENTED");
+    }
+
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nFullPersonWithEditions.populate:START");
+
+        example.populateHobbies(em);
+        em.persist(example.fullPerson);
+        em.flush();
+
+        System.out.println("\n> Create T2 Edition");
+        em.setEffectiveTime(T2);
+
+        Person fpEdition = em.find(Person.class, example.fullPerson.getId());
+        Person personEditionT2 = em.newEdition(fpEdition);
+        personEditionT2.setName("Jimmy");
+        Address aT2 = em.newEdition(example.fullPerson.getAddress());
+        aT2.setCity("Toronto");
+        aT2.setState("ON");
+        personEditionT2.setAddress(aT2);
+        Phone pT2 = em.newEdition(example.fullPerson.getPhone("Home"));
+        personEditionT2.addPhone(pT2);
+        pT2.setNumber("222-222-2222");
+        em.persist(personEditionT2.addHobby(example.hobbies.get("golf"), T2));
+        em.flush();
+
+        System.out.println("\n> Create T4 Edition");
+        em.setEffectiveTime(T4);
+
+        Person personEditionT4 = em.newEdition(personEditionT2);
+        personEditionT4.setName("James");
+        Address aT4 = em.newEdition(aT2);
+        aT4.setCity("San Francisco");
+        aT4.setState("CA");
+        personEditionT4.setAddress(aT4);
+        Phone pT4 = em.newEdition(pT2);
+        pT4.setNumber("444-444-4444");
+        personEditionT4.addPhone(pT4);
+        personEditionT4.removeHobby(example.hobbies.get(GOLF), T4, T4);
+        em.persist(personEditionT4.addHobby(example.hobbies.get(RUN), T4));
+        em.persist(personEditionT4.addHobby(example.hobbies.get(SKI), T4));
+        em.flush();
+
+        System.out.println("\nFullPersonWithEditions.populate::DONE");
+    }
+
+}
diff --git a/Temporal Tests/src/tests/MultipleEditionQueries.java b/Temporal Tests/src/tests/MultipleEditionQueries.java
new file mode 100644
index 0000000..bef98d6
--- /dev/null
+++ b/Temporal Tests/src/tests/MultipleEditionQueries.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.RUN;
+import static example.PersonModelExample.SKI;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T4;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import model.Address;
+import model.Person;
+import model.Phone;
+
+import org.junit.Test;
+
+import temporal.TemporalEntityManager;
+import example.PersonModelExample;
+
+/**
+ * TODO
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class MultipleEditionQueries extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Test
+    public void queryForAllPersonEditions() {
+        TemporalEntityManager em = getEntityManager();
+
+        List<Person> results = em.createQuery("SELECT p FROM PersonEditionView p ORDER BY p.effectivity.start", Person.class).getResultList();
+
+        Assert.assertNotNull(results);
+        Assert.assertEquals(3, results.size());
+    }
+
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nFullPersonWithEditions.populate:START");
+
+        example.populateHobbies(em);
+        em.persist(getSample());
+        em.flush();
+
+        System.out.println("\n> Create T2 Edition");
+        em.setEffectiveTime(T2);
+
+        Person fpEdition = em.find(Person.class, example.fullPerson.getId());
+        Person personEditionT2 = em.newEdition(fpEdition);
+        personEditionT2.setName("Jimmy");
+        Address aT2 = em.newEdition(example.fullPerson.getAddress());
+        aT2.setCity("Toronto");
+        aT2.setState("ON");
+        personEditionT2.setAddress(aT2);
+        Phone pT2 = em.newEdition(example.fullPerson.getPhone("Home"));
+        personEditionT2.addPhone(pT2);
+        pT2.setNumber("222-222-2222");
+        em.persist(personEditionT2.addHobby(example.hobbies.get(GOLF), T2));
+        em.flush();
+
+        System.out.println("\n> Create T4 Edition");
+        em.setEffectiveTime(T4);
+
+        Person personEditionT4 = em.newEdition(personEditionT2);
+        personEditionT4.setName("James");
+        Address aT4 = em.newEdition(aT2);
+        aT4.setCity("San Francisco");
+        aT4.setState("CA");
+        personEditionT4.setAddress(aT4);
+        Phone pT4 = em.newEdition(pT2);
+        pT4.setNumber("444-444-4444");
+        personEditionT4.addPhone(pT4);
+        personEditionT4.removeHobby(example.hobbies.get(GOLF), T4, T4);
+        em.persist(personEditionT4.addHobby(example.hobbies.get(RUN), T4));
+        em.persist(personEditionT4.addHobby(example.hobbies.get(SKI), T4));
+        em.flush();
+
+        System.out.println("\nFullPersonWithEditions.populate::DONE");
+    }
+
+}
diff --git a/Temporal Tests/src/tests/ProxyWrapperUpdateTests.java b/Temporal Tests/src/tests/ProxyWrapperUpdateTests.java
new file mode 100644
index 0000000..0439fa5
--- /dev/null
+++ b/Temporal Tests/src/tests/ProxyWrapperUpdateTests.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests;
+
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T4;
+
+import java.lang.reflect.Proxy;
+
+import junit.framework.Assert;
+import model.Address;
+import model.Person;
+import model.Phone;
+import model.entities.AddressEntity;
+import model.entities.PersonEntity;
+import model.entities.PhoneEntity;
+
+import org.junit.Test;
+
+import temporal.EditionWrapperHelper;
+import temporal.TemporalEdition;
+import temporal.TemporalEntity;
+import temporal.TemporalEntityManager;
+import example.PersonModelExample;
+
+/**
+ * Tests that verify the update of editions
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class ProxyWrapperUpdateTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    @Test
+    public void createWrapperForCurrent() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(null);
+
+        try {
+            EditionWrapperHelper.wrap(em, new PersonEntity());
+        } catch (IllegalArgumentException e) {
+            return;
+        }
+        Assert.fail("IllegalArgumentException not thrown");
+    }
+
+    @Test
+    public void createWrapperForPersonEditionWithoutEffectiveTS() {
+        TemporalEntityManager em = getEntityManager();
+
+        try {
+            em.getTransaction().begin();
+            Person tempPerson = em.newEntity(Person.class);
+            em.persist(tempPerson);
+            em.flush();
+
+            EditionWrapperHelper.wrap(em, tempPerson);
+
+        } catch (IllegalArgumentException e) {
+            return;
+        }
+
+        Assert.fail("IllegalArgumentException expected");
+    }
+
+    @Test
+    public void createWrapperForPersonEdition() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T4);
+
+        em.getTransaction().begin();
+        Person tempPerson = em.newEntity(Person.class);
+        em.persist(tempPerson);
+        em.flush();
+
+        TemporalEntity<Person> wrapper = EditionWrapperHelper.wrap(em, tempPerson);
+
+        Assert.assertNotNull(wrapper);
+        Assert.assertTrue(wrapper instanceof Person);
+        Assert.assertTrue(wrapper instanceof TemporalEdition);
+    }
+
+    @Test
+    public void createWrapperForAddressEdition() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T4);
+
+        em.getTransaction().begin();
+        TemporalEntity<Address> wrapper = EditionWrapperHelper.wrap(em, em.newEntity(AddressEntity.class));
+
+        Assert.assertNotNull(wrapper);
+        Assert.assertTrue(wrapper instanceof Address);
+        Assert.assertTrue(wrapper instanceof TemporalEdition);
+
+        em.getTransaction().rollback();
+    }
+
+    @Test
+    public void createWrapperForPhoneEdition() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T4);
+
+        em.getTransaction().begin();
+        TemporalEntity<Phone> wrapper = EditionWrapperHelper.wrap(em, em.newEntity(PhoneEntity.class));
+
+        Assert.assertNotNull(wrapper);
+        Assert.assertTrue(wrapper instanceof Phone);
+        Assert.assertTrue(wrapper instanceof TemporalEdition);
+        em.getTransaction().rollback();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void create2editionsUsingWrappers() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+
+        Person editionAtT2 = em.find(Person.class, example.fullPerson.getId());
+
+        em.getTransaction().begin();
+        Person wrappedPerson = (Person) EditionWrapperHelper.wrap(em, editionAtT2);
+
+        Assert.assertTrue(Proxy.isProxyClass(wrappedPerson.getClass()));
+        Assert.assertTrue(Proxy.isProxyClass(wrappedPerson.getAddress().getClass()));
+        Assert.assertFalse(((TemporalEdition<Person>) wrappedPerson).hasChanges());
+
+        wrappedPerson.setName(editionAtT2.getName() + "@T2");
+
+        Assert.assertTrue(((TemporalEdition<Person>) wrappedPerson).hasChanges());
+
+        em.getTransaction().commit();
+        em.close();
+
+        em = getEntityManager();
+        em.setEffectiveTime(T4);
+
+        Person editionAtT4 = em.find(Person.class, example.fullPerson.getId());
+
+        em.getTransaction().begin();
+        wrappedPerson = (Person) EditionWrapperHelper.wrap(em, editionAtT4);
+
+        Assert.assertFalse(((TemporalEdition<Person>) wrappedPerson).hasChanges());
+
+        wrappedPerson.setName(editionAtT4.getName() + "@T4");
+
+        Assert.assertTrue(((TemporalEdition<Person>) wrappedPerson).hasChanges());
+
+        em.getTransaction().commit();
+    }
+
+    @Override
+    public void populate(TemporalEntityManager em) {
+        em.persist(example.fullPerson);
+    }
+}
diff --git a/Temporal Tests/src/tests/editionsets/AllTests.java b/Temporal Tests/src/tests/editionsets/AllTests.java
new file mode 100644
index 0000000..ed46d1d
--- /dev/null
+++ b/Temporal Tests/src/tests/editionsets/AllTests.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.editionsets;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+@RunWith(Suite.class)
+@SuiteClasses({ EditionSetConfigTests.class, 
+                CreateEditionSetTests.class, 
+                ApplySimpleEditionSetTests.class, 
+                MoveSingleEditionSetTests.class,
+                DeleteEditionSetTests.class,
+                PropagateChangesTests.class})
+public class AllTests {
+}
diff --git a/Temporal Tests/src/tests/editionsets/ApplySimpleEditionSetTests.java b/Temporal Tests/src/tests/editionsets/ApplySimpleEditionSetTests.java
new file mode 100644
index 0000000..3b8f3a4
--- /dev/null
+++ b/Temporal Tests/src/tests/editionsets/ApplySimpleEditionSetTests.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.editionsets;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.T2;
+import junit.framework.Assert;
+import model.Address;
+import model.Person;
+import model.Phone;
+
+import org.junit.Test;
+
+import temporal.EditionSet;
+import temporal.EditionSetEntry;
+import temporal.EditionSetHelper;
+import temporal.TemporalEntityManager;
+import tests.BaseTestCase;
+import example.PersonModelExample;
+
+/**
+ * Tests applying a simple (no conflict) {@link EditionSet}
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class ApplySimpleEditionSetTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Test
+    public void verifyEditionSetAtT2() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.getTransaction().begin();
+
+        em.setEffectiveTime(T2);
+        EditionSet es = em.getEditionSet();
+
+        Assert.assertNotNull(es);
+        Assert.assertEquals(T2, es.getEffective());
+        Assert.assertEquals(3, es.getEntries().size());
+
+        for (EditionSetEntry ese : es.getEntries()) {
+            Assert.assertNotNull(ese.getTemporal());
+        }
+
+        EditionSetHelper.apply(em, es);
+
+        em.flush();
+    }
+
+    /**
+     * Populate initial sample entity
+     */
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nEditionSetTests.populate:START");
+        example.populateHobbies(em);
+        em.persist(getSample());
+        em.flush();
+
+        populateT2Editions(em);
+        System.out.println("\nEditionSetTests.populate::DONE");
+    }
+
+    /**
+     * Create the edition at T2 if it has not already been created
+     */
+    public Person populateT2Editions(TemporalEntityManager em) {
+        em.setEffectiveTime(T2);
+        EditionSet editionSet = em.getEditionSet();
+        Assert.assertNotNull(editionSet);
+
+        Person personEditionT2 = em.find(Person.class, getSample().getId());
+
+        if (personEditionT2.getEffectivity().getStart() != T2) {
+            System.out.println("\nEditionSetTests.populateT2Edition:START");
+
+            editionSet.setDescription("EditionSetTests::Person@T2");
+            personEditionT2 = em.newEdition(personEditionT2);
+            personEditionT2.setName("Jimmy");
+            Address aT2 = em.newEdition(personEditionT2.getAddress());
+            aT2.setCity("Toronto");
+            aT2.setState("ON");
+            personEditionT2.setAddress(aT2);
+            Phone pT2 = em.newEdition(personEditionT2.getPhone("Home"));
+            personEditionT2.addPhone(pT2);
+            pT2.setNumber("222-222-2222");
+            em.persist(personEditionT2.addHobby(example.hobbies.get(GOLF), T2));
+
+            em.flush();
+
+            System.out.println("\nEditionSetTests.populateT2Edition::DONE");
+        }
+
+        return personEditionT2;
+    }
+
+}
diff --git a/Temporal Tests/src/tests/editionsets/CreateEditionSetTests.java b/Temporal Tests/src/tests/editionsets/CreateEditionSetTests.java
new file mode 100644
index 0000000..38ff8ec
--- /dev/null
+++ b/Temporal Tests/src/tests/editionsets/CreateEditionSetTests.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.editionsets;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.RUN;
+import static example.PersonModelExample.SKI;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T4;
+import static example.PersonModelExample.T5;
+
+import java.util.List;
+
+import javax.persistence.Temporal;
+
+import junit.framework.Assert;
+import model.Address;
+import model.Person;
+import model.PersonHobby;
+import model.Phone;
+
+import org.junit.Test;
+
+import temporal.EditionSet;
+import temporal.EditionSetEntry;
+import temporal.TemporalEntityManager;
+import temporal.TemporalHelper;
+import tests.BaseTestCase;
+import example.PersonModelExample;
+
+/**
+ * Tests verifying the {@link EditionSet} capabilities.
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class CreateEditionSetTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Test
+    public void verifyEditionSetAtT2() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.getTransaction().begin();
+        populateT2Editions(em);
+
+        em.setEffectiveTime(T2);
+        EditionSet es = em.getEditionSet();
+
+        Assert.assertNotNull(es);
+        Assert.assertEquals(T2, es.getEffective());
+        Assert.assertEquals(4, es.getEntries().size());
+
+        Assert.assertTrue(es.getEntries().get(0).getTemporal() instanceof Person);
+        Person p = (Person) es.getEntries().get(0).getTemporal();
+        Assert.assertEquals(T2, p.getEffectivity().getStart());
+
+        Assert.assertTrue(es.getEntries().get(1).getTemporal() instanceof Address);
+        Address a = (Address) es.getEntries().get(1).getTemporal();
+        Assert.assertEquals(T2, a.getEffectivity().getStart());
+
+        Assert.assertTrue(es.getEntries().get(2).getTemporal() instanceof Phone);
+        Phone phone = (Phone) es.getEntries().get(2).getTemporal();
+        Assert.assertEquals(T2, phone.getEffectivity().getStart());
+
+        Assert.assertTrue(es.getEntries().get(3).getTemporal() instanceof PersonHobby);
+        PersonHobby ph = (PersonHobby) es.getEntries().get(3).getTemporal();
+        Assert.assertEquals(T2, ph.getEffectivity().getStart());
+        Assert.assertSame(p, ph.getPerson());
+        Assert.assertEquals(PersonModelExample.GOLF, ph.getName());
+        Assert.assertEquals(PersonModelExample.GOLF, ph.getHobby().getName());
+
+        Assert.assertEquals(1, p.getPersonHobbies().size());
+
+    }
+
+    @Test
+    public void verifyEditionSetAtT4() {
+        TemporalEntityManager em = getEntityManager();
+        em.getTransaction().begin();
+
+        populateT4Editions(em);
+
+        List<EditionSet> editionSets = em.createQuery("SELECT e FROM EditionSet e ORDER BY e.effective", EditionSet.class).getResultList();
+
+        Assert.assertNotNull(editionSets);
+        Assert.assertEquals("Incorrect number of EditionSets found.", 2, editionSets.size());
+
+        EditionSet t1 = editionSets.get(0);
+        Assert.assertNotNull(t1);
+        Assert.assertEquals(T2, t1.getEffective());
+
+        EditionSet t2 = editionSets.get(1);
+        Assert.assertNotNull(t2);
+        Assert.assertEquals(T4, t2.getEffective());
+    }
+
+    /**
+     * Verify that the addition of a {@link Temporal} value in a 1:M collection
+     * causes an EditionSetEntry to be created.
+     */
+    @Test
+    public void addHobbyAtT5WithInitializedEditionSet() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T5);
+        EditionSet es = em.getEditionSet();
+
+        Assert.assertNotNull(es);
+
+        Person person = em.find(Person.class, getSample().getId());
+        Assert.assertNotNull(person);
+        Assert.assertTrue(TemporalHelper.isTemporalEntity(person));
+        Assert.assertEquals(T5, es.getEffective());
+
+        PersonHobby runHobby = em.newTemporal(PersonHobby.class);
+        runHobby.setHobby(example.hobbies.get(RUN));
+        person.addHobby(runHobby);
+
+        Assert.assertEquals(1, es.getEntries().size());
+
+        EditionSetEntry entry = es.getEntries().get(0);
+
+        Assert.assertTrue(entry.getTemporal() instanceof PersonHobby);
+    }
+
+    /**
+     * Populate initial sample entity
+     */
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nEditionSetTests.populate:START");
+        example.populateHobbies(em);
+        em.persist(getSample());
+        System.out.println("\nEditionSetTests.populate::DONE");
+    }
+
+    /**
+     * Create the edition at T2 if it has not already been created
+     */
+    public Person populateT2Editions(TemporalEntityManager em) {
+        em.setEffectiveTime(T2);
+        EditionSet editionSet = em.getEditionSet();
+        Assert.assertNotNull(editionSet);
+
+        Person personEditionT2 = em.find(Person.class, getSample().getId());
+
+        if (personEditionT2.getEffectivity().getStart() != T2) {
+            System.out.println("\nEditionSetTests.populateT2Edition:START");
+
+            editionSet.setDescription("EditionSetTests::Person@T2");
+            personEditionT2 = em.newEdition(personEditionT2);
+            personEditionT2.setName("Jimmy");
+            Address aT2 = em.newEdition(personEditionT2.getAddress());
+            aT2.setCity("Toronto");
+            aT2.setState("ON");
+            personEditionT2.setAddress(aT2);
+            Phone pT2 = em.newEdition(personEditionT2.getPhone("Home"));
+            personEditionT2.addPhone(pT2);
+            pT2.setNumber("222-222-2222");
+
+            PersonHobby golfHobby = em.newTemporal(PersonHobby.class);
+            golfHobby.setHobby(example.hobbies.get(GOLF));
+            personEditionT2.addHobby(golfHobby);
+
+            em.flush();
+
+            System.out.println("\nEditionSetTests.populateT2Edition::DONE");
+        }
+
+        return personEditionT2;
+    }
+
+    public Person populateT4Editions(TemporalEntityManager em) {
+        populateT2Editions(em);
+
+        em.setEffectiveTime(T4);
+        EditionSet editionSet = em.getEditionSet();
+        Assert.assertNotNull(editionSet);
+
+        Person personEditionT4 = em.find(Person.class, getSample().getId());
+
+        if (personEditionT4 == null) {
+            System.out.println("\nEditionSetTests.populateT4Edition:START");
+            editionSet.setDescription("EditionSetTests::Person@T4");
+            personEditionT4 = em.newEdition(personEditionT4);
+            personEditionT4.setName("James");
+            Address aT4 = em.newEdition(personEditionT4.getAddress());
+            aT4.setCity("San Francisco");
+            aT4.setState("CA");
+            personEditionT4.setAddress(aT4);
+            Phone pT4 = em.newEdition(personEditionT4.getPhone("Home"));
+            pT4.setNumber("444-444-4444");
+            personEditionT4.addPhone(pT4);
+            personEditionT4.getPersonHobbies().get(GOLF).getEffectivity().setEnd(T4);
+
+            PersonHobby runHobby = em.newTemporal(PersonHobby.class);
+            runHobby.setHobby(example.hobbies.get(RUN));
+            personEditionT4.addHobby(runHobby);
+
+            PersonHobby skiHobby = em.newTemporal(PersonHobby.class);
+            skiHobby.setHobby(example.hobbies.get(SKI));
+            personEditionT4.addHobby(skiHobby);
+
+            em.flush();
+
+            System.out.println("\nEditionSetTests.populateT4Edition:DONE");
+        }
+
+        return personEditionT4;
+    }
+}
diff --git a/Temporal Tests/src/tests/editionsets/DeleteEditionSetTests.java b/Temporal Tests/src/tests/editionsets/DeleteEditionSetTests.java
new file mode 100644
index 0000000..094d987
--- /dev/null
+++ b/Temporal Tests/src/tests/editionsets/DeleteEditionSetTests.java
@@ -0,0 +1,291 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.editionsets;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.RUN;
+import static example.PersonModelExample.SKI;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T4;
+import static example.PersonModelExample.T5;
+import static temporal.Effectivity.BOT;
+
+import java.util.List;
+
+import javax.persistence.Temporal;
+
+import junit.framework.Assert;
+import model.Address;
+import model.Person;
+import model.PersonHobby;
+import model.Phone;
+
+import org.junit.Test;
+
+import temporal.EditionSet;
+import temporal.EditionSetEntry;
+import temporal.TemporalEntityManager;
+import temporal.TemporalHelper;
+import tests.BaseTestCase;
+import example.PersonModelExample;
+
+/**
+ * Tests verifying the {@link EditionSet} capabilities.
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class DeleteEditionSetTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Test
+    public void verifyEditionSetAtT2() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.setEffectiveTime(T2);
+        EditionSet es = em.getEditionSet();
+
+        Assert.assertNotNull(es);
+        Assert.assertEquals(T2, es.getEffective());
+        Assert.assertEquals(4, es.getEntries().size());
+
+        Assert.assertTrue(es.getEntries().get(0).getTemporal() instanceof Person);
+        Person p = (Person) es.getEntries().get(0).getTemporal();
+        Assert.assertEquals(T2, p.getEffectivity().getStart());
+
+        Assert.assertTrue(es.getEntries().get(1).getTemporal() instanceof Address);
+        Address a = (Address) es.getEntries().get(1).getTemporal();
+        Assert.assertEquals(T2, a.getEffectivity().getStart());
+
+        Assert.assertTrue(es.getEntries().get(2).getTemporal() instanceof Phone);
+        Phone phone = (Phone) es.getEntries().get(2).getTemporal();
+        Assert.assertEquals(T2, phone.getEffectivity().getStart());
+
+        Assert.assertTrue(es.getEntries().get(3).getTemporal() instanceof PersonHobby);
+        PersonHobby ph = (PersonHobby) es.getEntries().get(3).getTemporal();
+        Assert.assertEquals(T2, ph.getEffectivity().getStart());
+        Assert.assertEquals(PersonModelExample.GOLF, ph.getName());
+        Assert.assertEquals(PersonModelExample.GOLF, ph.getHobby().getName());
+        
+        //Assert.assertSame(p, ph.getPerson());
+
+        Assert.assertEquals(1, p.getPersonHobbies().size());
+
+    }
+
+    @Test
+    public void verifyEditionSetAtT4() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.setEffectiveTime(T4);
+        EditionSet es = em.getEditionSet();
+
+        Assert.assertNotNull(es);
+        Assert.assertEquals(T4, es.getEffective());
+        Assert.assertEquals(5, es.getEntries().size());
+
+        Assert.assertTrue(es.getEntries().get(0).getTemporal() instanceof Person);
+        Person p = (Person) es.getEntries().get(0).getTemporal();
+        Assert.assertEquals(T4, p.getEffectivity().getStart());
+
+        Assert.assertTrue(es.getEntries().get(1).getTemporal() instanceof Address);
+        Address a = (Address) es.getEntries().get(1).getTemporal();
+        Assert.assertEquals(T4, a.getEffectivity().getStart());
+
+        Assert.assertTrue(es.getEntries().get(2).getTemporal() instanceof Phone);
+        Phone phone = (Phone) es.getEntries().get(2).getTemporal();
+        Assert.assertEquals(T4, phone.getEffectivity().getStart());
+
+        Assert.assertTrue(es.getEntries().get(3).getTemporal() instanceof PersonHobby);
+        PersonHobby ph = (PersonHobby) es.getEntries().get(3).getTemporal();
+        Assert.assertEquals(T4, ph.getEffectivity().getStart());
+        Assert.assertEquals(PersonModelExample.RUN, ph.getName());
+        Assert.assertEquals(PersonModelExample.RUN, ph.getHobby().getName());
+        //Assert.assertSame(p, ph.getPerson());
+
+        Assert.assertTrue(es.getEntries().get(4).getTemporal() instanceof PersonHobby);
+        ph = (PersonHobby) es.getEntries().get(4).getTemporal();
+        Assert.assertEquals(T4, ph.getEffectivity().getStart());
+        Assert.assertEquals(PersonModelExample.SKI, ph.getName());
+        Assert.assertEquals(PersonModelExample.SKI, ph.getHobby().getName());
+        //Assert.assertSame(p, ph.getPerson());
+
+        Assert.assertEquals(2, p.getPersonHobbies().size());
+
+    }
+
+    @Test
+    public void verifyEditionSets() {
+        TemporalEntityManager em = getEntityManager();
+
+        List<EditionSet> editionSets = em.createQuery("SELECT e FROM EditionSet e ORDER BY e.effective", EditionSet.class).getResultList();
+
+        Assert.assertNotNull(editionSets);
+        Assert.assertEquals("Incorrect number of EditionSets found.", 2, editionSets.size());
+
+        EditionSet t1 = editionSets.get(0);
+        Assert.assertNotNull(t1);
+        Assert.assertEquals(T2, t1.getEffective());
+
+        EditionSet t2 = editionSets.get(1);
+        Assert.assertNotNull(t2);
+        Assert.assertEquals(T4, t2.getEffective());
+        
+        
+    }
+
+    /**
+     * Verify that the addition of a {@link Temporal} value in a 1:M collection
+     * causes an EditionSetEntry to be created.
+     */
+    @Test
+    public void addHobbyAtT5WithInitializedEditionSet() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T5);
+        EditionSet es = em.getEditionSet();
+
+        Assert.assertNotNull(es);
+
+        Person person = em.find(Person.class, getSample().getId());
+        Assert.assertNotNull(person);
+        Assert.assertTrue(TemporalHelper.isTemporalEntity(person));
+        Assert.assertEquals(T5, es.getEffective());
+
+        PersonHobby runHobby = em.newTemporal(PersonHobby.class);
+        runHobby.setHobby(example.hobbies.get(RUN));
+        person.addHobby(runHobby);
+
+        Assert.assertEquals(1, es.getEntries().size());
+
+        EditionSetEntry entry = es.getEntries().get(0);
+
+        Assert.assertTrue(entry.getTemporal() instanceof PersonHobby);
+    }
+    
+    /**
+     * TODO 
+     */
+   // @Test
+    public void deleteT4() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T4);
+        
+        EditionSet esT4 = em.getEditionSet();
+        
+        Assert.assertNotNull(esT4);
+        
+        em.getTransaction().begin();
+        em.remove(esT4);
+        
+        em.flush();
+        
+        esT4 = em.find(EditionSet.class, T4);
+        Assert.assertNull(esT4);
+    }
+
+    /**
+     * TODO 
+     */
+  //  @Test
+    public void deleteT2() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T2);
+        
+        EditionSet esT2 = em.getEditionSet();
+        
+        Assert.assertNotNull(esT2);
+        
+        em.getTransaction().begin();
+        em.remove(esT2);
+        
+        em.flush();
+
+        esT2= em.find(EditionSet.class, T2);
+        Assert.assertNull(esT2);
+}
+
+    /**
+     * Populate initial sample entity
+     */
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nEditionSetTests.populate:START");
+        example.populateHobbies(em);
+        em.persist(getSample());
+
+        System.out.println("\nEditionSetTests.populateT2Edition:START");
+
+        em.setEffectiveTime(T2);
+        EditionSet editionSet = em.getEditionSet();
+        editionSet.setDescription("EditionSetTests::Person@T2");
+
+        Person person = em.find(Person.class, getSample().getId());
+        Assert.assertEquals(BOT, person.getEffectivity().getStart());
+
+        Person personEditionT2 = em.newEdition(person);
+        personEditionT2.setName("Jimmy");
+        Address aT2 = em.newEdition(personEditionT2.getAddress());
+        aT2.setCity("Toronto");
+        aT2.setState("ON");
+        personEditionT2.setAddress(aT2);
+        Phone pT2 = em.newEdition(personEditionT2.getPhone("Home"));
+        personEditionT2.addPhone(pT2);
+        pT2.setNumber("222-222-2222");
+
+        PersonHobby golfHobby = em.newTemporal(PersonHobby.class);
+        golfHobby.setHobby(example.hobbies.get(GOLF));
+        personEditionT2.addHobby(golfHobby);
+
+        em.flush();
+
+        System.out.println("\nEditionSetTests.populateT2Edition::DONE");
+
+        System.out.println("\nEditionSetTests.populateT4Edition:START");
+
+        em.setEffectiveTime(T4);
+        editionSet = em.getEditionSet();
+        editionSet.setDescription("EditionSetTests::Person@T4");
+
+        person = em.find(Person.class, getSample().getId());
+        Assert.assertEquals(T2, person.getEffectivity().getStart());
+
+        Person personEditionT4 = em.newEdition(person);
+        personEditionT4.setName("James");
+        Address aT4 = em.newEdition(personEditionT4.getAddress());
+        aT4.setCity("San Francisco");
+        aT4.setState("CA");
+        personEditionT4.setAddress(aT4);
+        Phone pT4 = em.newEdition(personEditionT4.getPhone("Home"));
+        pT4.setNumber("444-444-4444");
+        personEditionT4.addPhone(pT4);
+        personEditionT4.getPersonHobbies().get(GOLF).getEffectivity().setEnd(T4);
+
+        PersonHobby runHobby = em.newTemporal(PersonHobby.class);
+        runHobby.setHobby(example.hobbies.get(RUN));
+        personEditionT4.addHobby(runHobby);
+
+        PersonHobby skiHobby = em.newTemporal(PersonHobby.class);
+        skiHobby.setHobby(example.hobbies.get(SKI));
+        personEditionT4.addHobby(skiHobby);
+
+        em.flush();
+
+        System.out.println("\nEditionSetTests.populateT4Edition:DONE");
+
+        System.out.println("\nEditionSetTests.populate::DONE");
+    }
+
+}
diff --git a/Temporal Tests/src/tests/editionsets/EditionSetConfigTests.java b/Temporal Tests/src/tests/editionsets/EditionSetConfigTests.java
new file mode 100644
index 0000000..0374609
--- /dev/null
+++ b/Temporal Tests/src/tests/editionsets/EditionSetConfigTests.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.editionsets;
+
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T6;
+import junit.framework.Assert;
+import model.Person;
+
+import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.mappings.OneToManyMapping;
+import org.eclipse.persistence.mappings.VariableOneToOneMapping;
+import org.eclipse.persistence.sessions.server.Server;
+import org.junit.Test;
+
+import temporal.EditionSet;
+import temporal.TemporalEntityManager;
+import temporal.TemporalHelper;
+import tests.BaseTestCase;
+import example.PersonModelExample;
+
+/**
+ * Tests verifying the {@link EditionSet} capabilities.
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class EditionSetConfigTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Test
+    public void verifyEditionSetMapping() {
+        TemporalEntityManager em = getEntityManager();
+
+        ClassDescriptor desc = em.unwrap(Server.class).getClassDescriptorForAlias("EditionSet");
+        Assert.assertNotNull(desc);
+
+        OneToManyMapping otmMapping = (OneToManyMapping) desc.getMappingForAttributeName("entries");
+        Assert.assertNotNull(otmMapping);
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @Test
+    public void verifyEditionSetEntryMapping() {
+        TemporalEntityManager em = getEntityManager();
+
+        ClassDescriptor desc = em.unwrap(Server.class).getClassDescriptorForAlias("EditionSetEntry");
+        Assert.assertNotNull(desc);
+
+        VariableOneToOneMapping votoMapping = (VariableOneToOneMapping) desc.getMappingForAttributeName("temporal");
+        Assert.assertNotNull(votoMapping);
+
+        Assert.assertEquals(8, votoMapping.getTypeIndicatorTranslation().size());
+
+        Assert.assertTrue(votoMapping.getTypeIndicatorTranslation().containsKey("Person"));
+        Assert.assertTrue(TemporalHelper.isEditionClass((Class) votoMapping.getTypeIndicatorTranslation().get("Person")));
+
+        Assert.assertTrue(votoMapping.getTypeIndicatorTranslation().containsKey("Phone"));
+        Assert.assertTrue(TemporalHelper.isEditionClass((Class) votoMapping.getTypeIndicatorTranslation().get("Phone")));
+
+        Assert.assertTrue(votoMapping.getTypeIndicatorTranslation().containsKey("Address"));
+        Assert.assertTrue(TemporalHelper.isEditionClass((Class) votoMapping.getTypeIndicatorTranslation().get("Address")));
+
+        Assert.assertTrue(votoMapping.getTypeIndicatorTranslation().containsKey("PersonHobby"));
+        Assert.assertTrue(TemporalHelper.isTemporal((Class) votoMapping.getTypeIndicatorTranslation().get("PersonHobby"), false));
+    }
+
+    @Test
+    public void verifySetEffectiveInitialize() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.setEffectiveTime(T6);
+        EditionSet es = em.getEditionSet();
+
+        Assert.assertNotNull(es);
+        Assert.assertEquals(T6, es.getEffective());
+    }
+
+    @Test
+    public void verifyEditionSetPerEffective() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.setEffectiveTime(T2);
+        EditionSet esT2 = em.getEditionSet();
+        Assert.assertNotNull(esT2);
+        Assert.assertEquals(T2, esT2.getEffective());
+
+        em.setEffectiveTime(T6);
+        EditionSet esT6 = em.getEditionSet();
+        Assert.assertNotNull(esT6);
+        Assert.assertEquals(T6, esT6.getEffective());
+        
+        Assert.assertNotSame(esT2, esT6);
+    }
+
+    @Test
+    public void verifyNotInitialized() {
+        TemporalEntityManager em = getEntityManager();
+        Assert.assertFalse(em.hasEditionSet());
+
+        em.setEffectiveTime(T6);
+
+        Assert.assertFalse(em.hasEditionSet());
+    }
+
+    /**
+     * Populate initial sample entity
+     */
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nEditionSetTests.populate:START");
+        example.populateHobbies(em);
+        em.persist(getSample());
+        System.out.println("\nEditionSetTests.populate::DONE");
+    }
+
+}
diff --git a/Temporal Tests/src/tests/editionsets/MoveSingleEditionSetTests.java b/Temporal Tests/src/tests/editionsets/MoveSingleEditionSetTests.java
new file mode 100644
index 0000000..921f404
--- /dev/null
+++ b/Temporal Tests/src/tests/editionsets/MoveSingleEditionSetTests.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.editionsets;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.T2;
+import junit.framework.Assert;
+import model.Address;
+import model.Person;
+import model.Phone;
+
+import org.junit.Test;
+
+import temporal.EditionSet;
+import temporal.EditionSetEntry;
+import temporal.TemporalEntityManager;
+import tests.BaseTestCase;
+import example.PersonModelExample;
+
+/**
+ * Tests applying a simple (no conflict) {@link EditionSet}
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class MoveSingleEditionSetTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Test
+    public void moveEditionSetFromT2toT3() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.getTransaction().begin();
+
+        em.setEffectiveTime(T2);
+        EditionSet es = em.getEditionSet();
+
+        Assert.assertNotNull(es);
+        Assert.assertEquals(T2, es.getEffective());
+        Assert.assertEquals(3, es.getEntries().size());
+
+        for (EditionSetEntry entry : es.getEntries()) {
+            System.out.println("> " + entry.getTemporal());
+            for (String attrName : entry.getAttributes()) {
+                System.out.println("\t>> " + attrName);
+            }
+        }
+    }
+
+    /**
+     * Populate initial sample entity
+     */
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nEditionSetTests.populate:START");
+        example.populateHobbies(em);
+        em.persist(getSample());
+        populateT2Editions(em);
+        System.out.println("\nEditionSetTests.populate::DONE");
+    }
+
+    /**
+     * Create the edition at T2 if it has not already been created
+     */
+    public Person populateT2Editions(TemporalEntityManager em) {
+        em.setEffectiveTime(T2);
+        EditionSet editionSet = em.getEditionSet();
+        Assert.assertNotNull(editionSet);
+
+        Person personEditionT2 = em.find(Person.class, getSample().getId());
+
+        if (personEditionT2.getEffectivity().getStart() != T2) {
+            System.out.println("\nEditionSetTests.populateT2Edition:START");
+
+            editionSet.setDescription("EditionSetTests::Person@T2");
+            personEditionT2 = em.newEdition(personEditionT2);
+            personEditionT2.setName("Jimmy");
+            Address aT2 = em.newEdition(personEditionT2.getAddress());
+            aT2.setCity("Toronto");
+            aT2.setState("ON");
+            personEditionT2.setAddress(aT2);
+            Phone pT2 = em.newEdition(personEditionT2.getPhone("Home"));
+            personEditionT2.addPhone(pT2);
+            pT2.setNumber("222-222-2222");
+            em.persist(personEditionT2.addHobby(example.hobbies.get(GOLF), T2));
+            em.flush();
+
+            System.out.println("\nEditionSetTests.populateT2Edition::DONE");
+        }
+
+        return personEditionT2;
+    }
+
+}
diff --git a/Temporal Tests/src/tests/editionsets/PropagateChangesTests.java b/Temporal Tests/src/tests/editionsets/PropagateChangesTests.java
new file mode 100644
index 0000000..1d07428
--- /dev/null
+++ b/Temporal Tests/src/tests/editionsets/PropagateChangesTests.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.editionsets;
+
+import static example.PersonModelExample.GOLF;
+import static example.PersonModelExample.RUN;
+import static example.PersonModelExample.SWIM;
+import static example.PersonModelExample.T2;
+import static example.PersonModelExample.T4;
+import junit.framework.Assert;
+import model.Address;
+import model.Person;
+import model.Phone;
+
+import org.junit.Test;
+
+import temporal.EditionSet;
+import temporal.TemporalEntityManager;
+import temporal.TemporalHelper;
+import tests.BaseTestCase;
+import example.PersonModelExample;
+
+/**
+ * Tests change propagation through future editions.
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class PropagateChangesTests extends BaseTestCase {
+
+    private static PersonModelExample example = new PersonModelExample();
+
+    private Person getSample() {
+        return example.fullPerson;
+    }
+
+    @Test
+    public void makeBasicChangesAtT2Changes() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.getTransaction().begin();
+
+        em.setEffectiveTime(T2);
+        EditionSet esT2 = em.getEditionSet();
+        Assert.assertNotNull(esT2);
+
+        Person personT2 = em.find(Person.class, getSample().getId());
+
+        Assert.assertNotNull(personT2);
+        Assert.assertTrue(TemporalHelper.isEdition(em, personT2));
+        Assert.assertEquals(T2, personT2.getEffectivity().getStart());
+
+        personT2.setName("Jimster");
+        personT2.setEmail("a@b.c");
+        personT2.getAddress().setState("ONT");
+        personT2.getAddress().setStreet(null);
+
+        em.flush();
+        em.clear();
+
+        em.setEffectiveTime(T4);
+        EditionSet esT4 = em.getEditionSet();
+        Assert.assertNotNull(esT4);
+
+        Person personT4 = em.find(Person.class, getSample().getId());
+
+        Assert.assertNotNull(personT4);
+        Assert.assertTrue(TemporalHelper.isEdition(em, personT4));
+        Assert.assertEquals(T4, personT4.getEffectivity().getStart());
+
+        String nativeName = (String) em.createNativeQuery("SELECT P_NAMES FROM TPERSON WHERE CID = " + getSample().getId() + " AND START_TS = 400").getSingleResult();
+        Assert.assertEquals("Jimbo", nativeName);
+        Assert.assertEquals("Jimbo", personT4.getName());
+
+        String nativeState = (String) em.createNativeQuery("SELECT STATE FROM TADDRESS WHERE CID = " + getSample().getAddress().getId() + " AND START_TS = 400").getSingleResult();
+        Assert.assertEquals("ONT", nativeState);
+        Assert.assertEquals("ONT", personT4.getAddress().getState());
+
+        Assert.assertNull(personT4.getAddress().getStreet());
+        Assert.assertNotNull(personT4.getEmail());
+    }
+
+    @Test
+    public void makeBasicCollectionChangesAtT2Changes() {
+        TemporalEntityManager em = getEntityManager();
+
+        em.getTransaction().begin();
+
+        em.setEffectiveTime(T2);
+        EditionSet esT2 = em.getEditionSet();
+        Assert.assertNotNull(esT2);
+
+        Person personT2 = em.find(Person.class, getSample().getId());
+
+        Assert.assertNotNull(personT2);
+        Assert.assertTrue(TemporalHelper.isEdition(em, personT2));
+        Assert.assertEquals(T2, personT2.getEffectivity().getStart());
+
+        em.persist(personT2.addHobby(example.hobbies.get(SWIM), T2));
+
+        try {
+            em.flush();
+        } catch (UnsupportedOperationException e) {
+            return;
+        }
+        Assert.fail("UnsupportedOperationException expected");
+
+    }
+
+    /**
+     * Populate initial sample entity
+     */
+    @Override
+    public void populate(TemporalEntityManager em) {
+        System.out.println("\nEditionSetTests.populate:START");
+        example.populateHobbies(em);
+        em.persist(getSample());
+        populateT2Editions(em);
+        populateT4Editions(em);
+        System.out.println("\nEditionSetTests.populate::DONE");
+    }
+
+    /**
+     * Create the edition at T2 if it has not already been created
+     */
+    public Person populateT2Editions(TemporalEntityManager em) {
+        em.setEffectiveTime(T2);
+        EditionSet editionSet = em.getEditionSet();
+        Assert.assertNotNull(editionSet);
+
+        Person personEditionT2 = em.find(Person.class, getSample().getId());
+
+        if (personEditionT2.getEffectivity().getStart() != T2) {
+            System.out.println("\nEditionSetTests.populateT2Edition:START");
+
+            editionSet.setDescription("EditionSetTests::Person@T2");
+            personEditionT2 = em.newEdition(personEditionT2);
+            personEditionT2.setName("Jimmy");
+            Address aT2 = em.newEdition(personEditionT2.getAddress());
+            aT2.setCity("Toronto");
+            aT2.setState("ON");
+            personEditionT2.setAddress(aT2);
+            Phone pT2 = em.newEdition(personEditionT2.getPhone("Home"));
+            personEditionT2.addPhone(pT2);
+            pT2.setNumber("222-222-2222");
+            em.persist(personEditionT2.addHobby(example.hobbies.get(GOLF), T2));
+            em.flush();
+
+            System.out.println("\nEditionSetTests.populateT2Edition::DONE");
+        }
+
+        return personEditionT2;
+    }
+
+    /**
+     * Create the edition at T2 if it has not already been created
+     */
+    public Person populateT4Editions(TemporalEntityManager em) {
+        em.setEffectiveTime(T4);
+        EditionSet editionSet = em.getEditionSet();
+        Assert.assertNotNull(editionSet);
+
+        Person personEditionT4 = em.find(Person.class, getSample().getId());
+
+        if (personEditionT4.getEffectivity().getStart() != T4) {
+            System.out.println("\nEditionSetTests.populateT4Edition:START");
+
+            editionSet.setDescription("EditionSetTests::Person@T4");
+            personEditionT4 = em.newEdition(personEditionT4);
+            personEditionT4.setName("Jimbo");
+            Address aT4 = em.newEdition(personEditionT4.getAddress());
+            aT4.setCity("Ottawa");
+            personEditionT4.setAddress(aT4);
+            Phone pT4 = em.newEdition(personEditionT4.getPhone("Home"));
+            personEditionT4.addPhone(pT4);
+            pT4.setNumber("444-444-4444");
+            em.persist(personEditionT4.addHobby(example.hobbies.get(RUN), T4));
+            em.flush();
+
+            System.out.println("\nEditionSetTests.populateT4Edition::DONE");
+        }
+
+        return personEditionT4;
+    }
+}
diff --git a/Temporal Tests/src/tests/internal/AllTests.java b/Temporal Tests/src/tests/internal/AllTests.java
new file mode 100644
index 0000000..c6125a5
--- /dev/null
+++ b/Temporal Tests/src/tests/internal/AllTests.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.internal;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+/**
+ * Internal test suite verifying how EclipseLInk and the temporal extensions are working.
+ *
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+@RunWith(Suite.class)
+@SuiteClasses({ VerifyConfigTests.class, 
+                VerifySchemaManager.class,
+                TemporalHelperTests.class, 
+                TemporalEntityManagerTests.class, 
+                TemporalEntityTests.class,
+                //WrapperPolicyTests.class,
+                })
+public class AllTests {
+}
diff --git a/Temporal Tests/src/tests/internal/TemporalEntityManagerTests.java b/Temporal Tests/src/tests/internal/TemporalEntityManagerTests.java
new file mode 100644
index 0000000..f498740
--- /dev/null
+++ b/Temporal Tests/src/tests/internal/TemporalEntityManagerTests.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.internal;
+
+import static example.PersonModelExample.T1;
+import static example.PersonModelExample.T3;
+import static example.PersonModelExample.T4;
+import static example.PersonModelExample.T5;
+import static example.PersonModelExample.T6;
+import static example.PersonModelExample.T7;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static temporal.Effectivity.BOT;
+import static temporal.Effectivity.EOT;
+
+import javax.persistence.EntityManager;
+
+import junit.framework.Assert;
+import model.Person;
+import model.PersonHobby;
+
+import org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork;
+import org.eclipse.persistence.sessions.DatabaseSession;
+import org.eclipse.persistence.sessions.UnitOfWork;
+import org.eclipse.persistence.sessions.server.ClientSession;
+import org.eclipse.persistence.sessions.server.Server;
+import org.junit.Test;
+
+import temporal.EditionSet;
+import temporal.TemporalEntityManager;
+import tests.BaseTestCase;
+
+/**
+ * Verify the {@link TemporalEntityManager} API
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class TemporalEntityManagerTests extends BaseTestCase {
+
+    private void verifySetStartTime(TemporalEntityManager em, Long value) {
+        assertTrue(em.hasEffectiveTime());
+        assertNotNull(em.getEffectiveTime());
+        assertEquals(value, em.getEffectiveTime());
+
+        RepeatableWriteUnitOfWork uow = em.unwrap(RepeatableWriteUnitOfWork.class);
+        assertNotNull(uow);
+
+        ClientSession clientSession = (ClientSession) uow.getParent();
+
+        DatabaseSession session = em.unwrap(DatabaseSession.class);
+        assertNotSame(clientSession, session);
+
+        Server serverSession = em.unwrap(Server.class);
+        assertNotSame(clientSession, serverSession);
+        assertSame(session, serverSession);
+    }
+
+    @Test
+    public void verifyGetInstance() {
+        TemporalEntityManager em1 = getEntityManager();
+
+        Assert.assertTrue(em1.getProperties().containsKey(TemporalEntityManager.TEMPORAL_EM_PROPERTY));
+        Assert.assertFalse(em1.getProperties().containsKey(TemporalEntityManager.EFF_TS_PROPERTY));
+        assertFalse(em1.hasEffectiveTime());
+        assertNull(em1.getEffectiveTime());
+
+        EntityManager wrappedEm = em1.unwrap(EntityManager.class);
+        Assert.assertNotSame(em1, wrappedEm);
+
+        TemporalEntityManager em2 = TemporalEntityManager.getInstance(wrappedEm);
+        Assert.assertSame(em1, em2);
+
+        TemporalEntityManager em3 = TemporalEntityManager.getInstance(wrappedEm.unwrap(UnitOfWork.class));
+        Assert.assertSame(em1, em3);
+
+        TemporalEntityManager em4 = TemporalEntityManager.getInstance(em1);
+        Assert.assertSame(em1, em4);
+    }
+
+    @Test
+    public void verifySetStartTime() {
+        TemporalEntityManager em = getEntityManager();
+
+        assertFalse(em.hasEffectiveTime());
+        assertNull(em.getEffectiveTime());
+
+        em.setEffectiveTime(T1);
+
+        verifySetStartTime(em, T1);
+    }
+
+    @Test
+    public void verifyClearStartTime() {
+        TemporalEntityManager em = getEntityManager();
+        assertFalse(em.hasEffectiveTime());
+        assertNull(em.getEffectiveTime());
+
+        em.setEffectiveTime(T3);
+
+        verifySetStartTime(em, T3);
+
+        em.clearEffectiveTime();
+
+        assertFalse(em.hasEffectiveTime());
+        assertNull(em.getEffectiveTime());
+    }
+
+    @Test
+    public void verifyConcurrentSetStartTime() {
+        TemporalEntityManager em1 = getEntityManager();
+        TemporalEntityManager em2 = TemporalEntityManager.getInstance(getEMF().createEntityManager());
+
+        assertNotSame(em1, em2);
+
+        em1.setEffectiveTime(T4);
+
+        em2.setEffectiveTime(T5);
+
+        verifySetStartTime(em2, T5);
+        verifySetStartTime(em1, T4);
+    }
+
+    @Test
+    public void verifyConcurrentClearStartTime() {
+        TemporalEntityManager em1 = getEntityManager();
+        TemporalEntityManager em2 = TemporalEntityManager.getInstance(getEMF().createEntityManager());
+
+        assertNotSame(em1, em2);
+
+        em1.setEffectiveTime(T6);
+        em2.setEffectiveTime(T7);
+
+        verifySetStartTime(em2, T7);
+        verifySetStartTime(em1, T6);
+
+        em1.clearEffectiveTime();
+        verifySetStartTime(em2, T7);
+        assertFalse(em1.hasEffectiveTime());
+        assertNull(em1.getEffectiveTime());
+
+        em2.clearEffectiveTime();
+        assertFalse(em2.hasEffectiveTime());
+        assertNull(em2.getEffectiveTime());
+    }
+
+    @Test
+    public void verifyCurrentCreateTemporal() {
+        TemporalEntityManager em = getEntityManager();
+        em.getTransaction().begin();
+
+        PersonHobby ph = em.newTemporal(PersonHobby.class);
+
+        Assert.assertNotNull(ph);
+        Assert.assertNotNull(ph.getEffectivity());
+        Assert.assertEquals(BOT, ph.getEffectivity().getStart());
+        Assert.assertEquals(EOT, ph.getEffectivity().getEnd());
+    }
+
+    @Test
+    public void verifyFutureCreateTemporal() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T3);
+        em.getTransaction().begin();
+
+        PersonHobby ph = em.newTemporal(PersonHobby.class);
+
+        Assert.assertNotNull(ph);
+        Assert.assertNotNull(ph.getEffectivity());
+        Assert.assertEquals(T3, ph.getEffectivity().getStart());
+        Assert.assertEquals(EOT, ph.getEffectivity().getEnd());
+    }
+
+    @Test
+    public void verifyChangeEffectiveWithPendingChanges() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T3);
+        EditionSet esT3 = em.getEditionSet();
+        
+        em.getTransaction().begin();
+
+        Person newPersonAtT3 = em.newEntity(Person.class);
+        Assert.assertNotNull(newPersonAtT3);
+        Assert.assertEquals(T3, newPersonAtT3.getEffectivity().getStart());
+        Assert.assertTrue(esT3.hasChanges());
+
+        em.setEffectiveTime(T4);
+        EditionSet esT4 = em.getEditionSet();
+        
+        Assert.assertFalse(esT4.hasChanges());
+        Assert.assertTrue(esT3.hasChanges());
+        
+        em.flush();
+    }
+
+    @Test
+    public void verifyRollbackWithPendingChanges() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T3);
+        em.getTransaction().begin();
+
+        Person newPersonAtT3 = em.newEntity(Person.class);
+        Assert.assertNotNull(newPersonAtT3);
+        Assert.assertEquals(T3, newPersonAtT3.getEffectivity().getStart());
+        Assert.assertTrue(em.hasEditionSet());
+        Assert.assertTrue(em.getEditionSet().hasChanges());
+
+        // TODO : ?
+        em.getTransaction().rollback();
+    }
+}
diff --git a/Temporal Tests/src/tests/internal/TemporalEntityTests.java b/Temporal Tests/src/tests/internal/TemporalEntityTests.java
new file mode 100644
index 0000000..a27c535
--- /dev/null
+++ b/Temporal Tests/src/tests/internal/TemporalEntityTests.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.internal;
+
+import static temporal.Effectivity.BOT;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import temporal.BaseTemporalEntity;
+import temporal.TemporalEntity;
+
+/**
+ * Simple tests verifying the functionality of the interfaces and base classes
+ * used in this temporal extension framework.
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+
+public class TemporalEntityTests {
+
+    @Test
+    public void verifyTestEntityConstructor() {
+        TestEntity entity = new TestEntityImpl();
+
+        Assert.assertNotNull(entity.getEffectivity());
+        Assert.assertNull(entity.getContinuity());
+        Assert.assertNull(entity.getPreviousEdition());
+        Assert.assertEquals(0, entity.getVersion());
+        Assert.assertEquals(BOT, entity.getEffectivity().getStart());
+    }
+
+    @Test
+    public void verifyTestEntityEditionConstructor() {
+        TestEntity entity = new TestEntityEdition();
+
+        Assert.assertNotNull(entity.getEffectivity());
+        Assert.assertNull(entity.getContinuity());
+        Assert.assertNull(entity.getPreviousEdition());
+        Assert.assertEquals(0, entity.getVersion());
+        Assert.assertEquals(BOT, entity.getEffectivity().getStart());
+    }
+
+    @Test
+    public void verifyTestEntityEditionViewConstructor() {
+        TestEntity entity = new TestEntityEditionView();
+
+        Assert.assertNotNull(entity.getEffectivity());
+        Assert.assertNull(entity.getContinuity());
+        Assert.assertNull(entity.getPreviousEdition());
+        Assert.assertEquals(0, entity.getVersion());
+        Assert.assertEquals(BOT, entity.getEffectivity().getStart());
+    }
+
+    @Test
+    public void testIsContinuity() {
+        TestEntity entity = new TestEntityEditionView();
+
+        Assert.assertFalse(entity.isContinuity());
+
+        entity.setId(1);
+        entity.setContinuity(entity);
+
+        Assert.assertTrue(entity.isContinuity());
+    }
+
+    /**
+     * Static test classes
+     */
+
+    public static interface TestEntity extends TemporalEntity<TestEntity> {
+        void setId(int id);
+    }
+
+    public static class TestEntityImpl extends BaseTemporalEntity<TestEntity> implements TestEntity {
+
+        @Override
+        public void setId(int id) {
+            super.setId(id);
+        }
+
+    }
+
+    public static class TestEntityEdition extends TestEntityImpl {
+
+    }
+
+    public static class TestEntityEditionView extends TestEntityEdition {
+
+    }
+}
diff --git a/Temporal Tests/src/tests/internal/TemporalHelperTests.java b/Temporal Tests/src/tests/internal/TemporalHelperTests.java
new file mode 100644
index 0000000..46345b7
--- /dev/null
+++ b/Temporal Tests/src/tests/internal/TemporalHelperTests.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.internal;
+
+import static example.PersonModelExample.T1;
+import static temporal.Effectivity.*;
+import static example.PersonModelExample.T3;
+import static example.PersonModelExample.T4;
+import static example.PersonModelExample.T5;
+import static example.PersonModelExample.T6;
+import static example.PersonModelExample.T7;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import junit.framework.Assert;
+
+import model.PersonHobby;
+
+import org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork;
+import org.eclipse.persistence.sessions.DatabaseSession;
+import org.eclipse.persistence.sessions.server.ClientSession;
+import org.eclipse.persistence.sessions.server.Server;
+import org.junit.Test;
+
+import temporal.TemporalEntityManager;
+import temporal.TemporalHelper;
+import tests.BaseTestCase;
+
+/**
+ * Verify the helper methods on {@link TemporalHelper}
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class TemporalHelperTests extends BaseTestCase {
+
+    private void verifySetStartTime(TemporalEntityManager em, Long value) {
+        assertTrue(em.hasEffectiveTime());
+        assertNotNull(em.getEffectiveTime());
+        assertEquals(value, em.getEffectiveTime());
+
+        RepeatableWriteUnitOfWork uow = em.unwrap(RepeatableWriteUnitOfWork.class);
+        assertNotNull(uow);
+
+        ClientSession clientSession = (ClientSession) uow.getParent();
+
+        DatabaseSession session = em.unwrap(DatabaseSession.class);
+        assertNotSame(clientSession, session);
+
+        Server serverSession = em.unwrap(Server.class);
+        assertNotSame(clientSession, serverSession);
+        assertSame(session, serverSession);
+    }
+
+    @Test
+    public void verifySetStartTime() {
+        TemporalEntityManager em = getEntityManager();
+
+        assertFalse(em.hasEffectiveTime());
+        assertNull(em.getEffectiveTime());
+
+        em.setEffectiveTime(T1);
+
+        verifySetStartTime(em, T1);
+    }
+
+    @Test
+    public void verifyClearStartTime() {
+        TemporalEntityManager em = getEntityManager();
+        assertFalse(em.hasEffectiveTime());
+        assertNull(em.getEffectiveTime());
+
+        em.setEffectiveTime(T3);
+
+        verifySetStartTime(em, T3);
+
+        em.clearEffectiveTime();
+
+        assertFalse(em.hasEffectiveTime());
+        assertNull(em.getEffectiveTime());
+    }
+
+    @Test
+    public void verifyConcurrentSetStartTime() {
+        TemporalEntityManager em1 = getEntityManager();
+        TemporalEntityManager em2 = TemporalEntityManager.getInstance(getEMF().createEntityManager());
+
+        assertNotSame(em1, em2);
+
+        em1.setEffectiveTime(T4);
+
+        em2.setEffectiveTime(T5);
+
+        verifySetStartTime(em2, T5);
+        verifySetStartTime(em1, T4);
+    }
+
+    @Test
+    public void verifyConcurrentClearStartTime() {
+        TemporalEntityManager em1 = getEntityManager();
+        TemporalEntityManager em2 = TemporalEntityManager.getInstance(getEMF().createEntityManager());
+
+        assertNotSame(em1, em2);
+
+        em1.setEffectiveTime(T6);
+        em2.setEffectiveTime(T7);
+
+        verifySetStartTime(em2, T7);
+        verifySetStartTime(em1, T6);
+
+        em1.clearEffectiveTime();
+        verifySetStartTime(em2, T7);
+        assertFalse(em1.hasEffectiveTime());
+        assertNull(em1.getEffectiveTime());
+
+        em2.clearEffectiveTime();
+        assertFalse(em2.hasEffectiveTime());
+        assertNull(em2.getEffectiveTime());
+    }
+
+    @Test
+    public void verifyCurrentCreateTemporal() {
+        TemporalEntityManager em = getEntityManager();
+        em.getTransaction().begin();
+
+        PersonHobby ph = em.newTemporal(PersonHobby.class);
+
+        Assert.assertNotNull(ph);
+        Assert.assertNotNull(ph.getEffectivity());
+        Assert.assertEquals(BOT, ph.getEffectivity().getStart());
+        Assert.assertEquals(EOT, ph.getEffectivity().getEnd());
+    }
+
+    @Test
+    public void verifyFutureCreateTemporal() {
+        TemporalEntityManager em = getEntityManager();
+        em.setEffectiveTime(T3);
+        em.getTransaction().begin();
+
+        PersonHobby ph = em.newTemporal(PersonHobby.class);
+
+        Assert.assertNotNull(ph);
+        Assert.assertNotNull(ph.getEffectivity());
+        Assert.assertEquals(T3, ph.getEffectivity().getStart());
+        Assert.assertEquals(EOT, ph.getEffectivity().getEnd());
+    }
+}
diff --git a/Temporal Tests/src/tests/internal/VerifyConfigTests.java b/Temporal Tests/src/tests/internal/VerifyConfigTests.java
new file mode 100644
index 0000000..a4a8809
--- /dev/null
+++ b/Temporal Tests/src/tests/internal/VerifyConfigTests.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.internal;
+
+import junit.framework.Assert;
+import model.Address;
+import model.Hobby;
+import model.Person;
+import model.PersonHobby;
+import model.Phone;
+import model.entities.AddressEntity;
+import model.entities.PersonEntity;
+import model.entities.PhoneEntity;
+
+import org.eclipse.persistence.config.CacheIsolationType;
+import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.internal.helper.DatabaseField;
+import org.eclipse.persistence.internal.weaving.PersistenceWeaved;
+import org.eclipse.persistence.internal.weaving.PersistenceWeavedChangeTracking;
+import org.eclipse.persistence.internal.weaving.PersistenceWeavedFetchGroups;
+import org.eclipse.persistence.internal.weaving.PersistenceWeavedLazy;
+import org.eclipse.persistence.jpa.JpaHelper;
+import org.eclipse.persistence.mappings.OneToManyMapping;
+import org.eclipse.persistence.mappings.OneToOneMapping;
+import org.eclipse.persistence.sessions.Session;
+import org.eclipse.persistence.sessions.server.Server;
+import org.junit.Test;
+
+import temporal.Effectivity;
+import temporal.TemporalEdition;
+import temporal.TemporalEntity;
+import temporal.TemporalHelper;
+import temporal.persistence.DescriptorHelper;
+import tests.BaseTestCase;
+
+/**
+ * Tests that verify the descriptors are setup as expected and that the
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class VerifyConfigTests extends BaseTestCase {
+
+    @Test
+    public void verifyDescriptorsExist() {
+        Server session = JpaHelper.getServerSession(getEMF());
+
+        Assert.assertNotNull(session);
+        Assert.assertTrue(session.isConnected());
+        Assert.assertEquals(21, session.getDescriptors().size());
+
+        Assert.assertNotNull(session.getClassDescriptorForAlias("Person"));
+        Assert.assertNotNull(session.getClassDescriptor(PersonEntity.class));
+        Assert.assertNotNull(session.getClassDescriptorForAlias("Address"));
+        Assert.assertNotNull(session.getClassDescriptor(AddressEntity.class));
+        Assert.assertNotNull(session.getClassDescriptorForAlias("Phone"));
+        Assert.assertNotNull(session.getClassDescriptor(PhoneEntity.class));
+        Assert.assertNotNull(session.getClassDescriptor(Effectivity.class));
+
+        Assert.assertNotNull(session.getClassDescriptorForAlias("Hobby"));
+        Assert.assertNotNull(session.getClassDescriptorForAlias("PersonHobby"));
+        Assert.assertNotNull(session.getClassDescriptorForAlias("EditionSet"));
+        Assert.assertNotNull(session.getClassDescriptorForAlias("EditionSetEntry"));
+
+        Assert.assertNotNull(session.getClassDescriptorForAlias("PersonEdition"));
+        Assert.assertNotNull(session.getClassDescriptorForAlias("AddressEdition"));
+        Assert.assertNotNull(session.getClassDescriptorForAlias("PhoneEdition"));
+
+        Assert.assertNotNull(session.getClassDescriptorForAlias("PersonEditionView"));
+        Assert.assertNotNull(session.getClassDescriptorForAlias("AddressEditionView"));
+        Assert.assertNotNull(session.getClassDescriptorForAlias("PhoneEditionView"));
+    }
+
+    @Test
+    public void verifyInterface() {
+        Server session = JpaHelper.getServerSession(getEMF());
+
+        Assert.assertSame(Person.class, session.getClassDescriptor(PersonEntity.class).getProperty(TemporalHelper.INTERFACE));
+        Assert.assertSame(Person.class, session.getClassDescriptor(Person.class).getProperty(TemporalHelper.INTERFACE));
+        Assert.assertSame(Address.class, session.getClassDescriptor(AddressEntity.class).getProperty(TemporalHelper.INTERFACE));
+        Assert.assertSame(Address.class, session.getClassDescriptor(Address.class).getProperty(TemporalHelper.INTERFACE));
+        Assert.assertSame(Phone.class, session.getClassDescriptor(PhoneEntity.class).getProperty(TemporalHelper.INTERFACE));
+        Assert.assertSame(Phone.class, session.getClassDescriptor(Phone.class).getProperty(TemporalHelper.INTERFACE));
+    }
+
+    @Test
+    public void verifyWeavingPerson() {
+        Assert.assertTrue(PersistenceWeaved.class.isAssignableFrom(PersonEntity.class));
+        Assert.assertTrue(PersistenceWeavedLazy.class.isAssignableFrom(PersonEntity.class));
+        Assert.assertTrue(PersistenceWeavedChangeTracking.class.isAssignableFrom(PersonEntity.class));
+        Assert.assertTrue(PersistenceWeavedFetchGroups.class.isAssignableFrom(PersonEntity.class));
+        Assert.assertFalse(TemporalEdition.class.isAssignableFrom(PersonEntity.class));
+    }
+
+    @Test
+    public void verifyWeavingAddress() {
+        Assert.assertTrue(PersistenceWeaved.class.isAssignableFrom(AddressEntity.class));
+        Assert.assertTrue(PersistenceWeavedLazy.class.isAssignableFrom(AddressEntity.class));
+        Assert.assertTrue(PersistenceWeavedChangeTracking.class.isAssignableFrom(AddressEntity.class));
+        Assert.assertTrue(PersistenceWeavedFetchGroups.class.isAssignableFrom(AddressEntity.class));
+        Assert.assertFalse(TemporalEdition.class.isAssignableFrom(AddressEntity.class));
+    }
+
+    @Test
+    public void verifyWeavingPhone() {
+        Assert.assertTrue(PersistenceWeaved.class.isAssignableFrom(PhoneEntity.class));
+        Assert.assertTrue(PersistenceWeavedLazy.class.isAssignableFrom(PhoneEntity.class));
+        Assert.assertTrue(PersistenceWeavedChangeTracking.class.isAssignableFrom(PhoneEntity.class));
+        Assert.assertTrue(PersistenceWeavedFetchGroups.class.isAssignableFrom(PhoneEntity.class));
+        Assert.assertFalse(TemporalEdition.class.isAssignableFrom(PhoneEntity.class));
+    }
+
+    @Test
+    public void verifyAttributeChangeTracking() {
+        Server session = JpaHelper.getServerSession(getEMF());
+
+        assertAttributeChangeTracking(session, "Person");
+        assertAttributeChangeTracking(session, "Address");
+        assertAttributeChangeTracking(session, "Phone");
+    }
+
+    @Test
+    public void verifyEntityDescriptors() {
+        Server session = JpaHelper.getServerSession(getEMF());
+
+        for (String alias : new String[] { "Person", "Address", "Phone" }) {
+            ClassDescriptor descriptor = session.getClassDescriptorForAlias(alias);
+
+            Assert.assertNotNull(descriptor);
+            Assert.assertNotNull(descriptor.getQueryManager().getAdditionalJoinExpression());
+            Assert.assertFalse(descriptor.shouldBeReadOnly());
+            Assert.assertFalse(descriptor.isIsolated());
+            Assert.assertTrue(descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy());
+
+            Assert.assertEquals(1, descriptor.getPrimaryKeyFieldNames().size());
+            Assert.assertEquals("OID", descriptor.getPrimaryKeyFields().get(0).getName());
+
+            Assert.assertEquals(CacheIsolationType.PROTECTED, descriptor.getCacheIsolation());
+        }
+    }
+
+    /**
+     * Verify the {@link PersonHobby} and {@link Hobby} mappings are correct.
+     * These mappings are temporal but they are not {@link TemporalEntity}
+     */
+    @Test
+    public void verifyPersonHobbyMappings() {
+        Server session = JpaHelper.getServerSession(getEMF());
+        ClassDescriptor phDesc = session.getDescriptorForAlias("PersonHobby");
+        Assert.assertNotNull(phDesc);
+        
+        OneToOneMapping personMapping = (OneToOneMapping) phDesc.getMappingForAttributeName("person");
+        Assert.assertNotNull(personMapping);
+        Assert.assertSame(PersonEntity.class, personMapping.getReferenceClass());
+        
+        Assert.assertEquals(1, personMapping.getForeignKeyFields().size());
+        DatabaseField fkField = personMapping.getForeignKeyFields().firstElement();
+        Assert.assertEquals("PERSON_ID", fkField.getName());
+        
+        DatabaseField targetField = personMapping.getSourceToTargetKeyFields().get(fkField);
+        Assert.assertEquals("CID", targetField.getName());
+    }
+
+    @Test
+    public void verifyEditionDescriptors() {
+        Server session = JpaHelper.getServerSession(getEMF());
+
+        for (String alias : new String[] { "Person", "Address", "Phone" }) {
+            ClassDescriptor descriptor = session.getClassDescriptorForAlias(alias + DescriptorHelper.EDITION);
+
+            Assert.assertNotNull(descriptor);
+            Assert.assertNotNull(descriptor.getQueryManager().getAdditionalJoinExpression());
+            Assert.assertFalse(descriptor.shouldBeReadOnly());
+            Assert.assertTrue(descriptor.isIsolated());
+            Assert.assertTrue(descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy());
+
+            Assert.assertEquals(1, descriptor.getPrimaryKeyFieldNames().size());
+            Assert.assertEquals("OID", descriptor.getPrimaryKeyFields().get(0).getName());
+
+            Assert.assertEquals(CacheIsolationType.ISOLATED, descriptor.getCacheIsolation());
+        }
+    }
+
+    @Test
+    public void verifyEditionViewDescriptors() {
+        Server session = JpaHelper.getServerSession(getEMF());
+
+        for (String alias : new String[] { "Person", "Address", "Phone" }) {
+            ClassDescriptor descriptor = session.getClassDescriptorForAlias(alias + DescriptorHelper.EDITION_VIEW);
+
+            Assert.assertNotNull(descriptor);
+            Assert.assertNull(descriptor.getQueryManager().getAdditionalJoinExpression());
+            Assert.assertTrue(descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy());
+            Assert.assertTrue(descriptor.isIsolated());
+            Assert.assertEquals(1, descriptor.getPrimaryKeyFieldNames().size());
+            Assert.assertEquals("OID", descriptor.getPrimaryKeyFields().get(0).getName());
+
+            Assert.assertEquals(CacheIsolationType.ISOLATED, descriptor.getCacheIsolation());
+        }
+    }
+
+    private void assertAttributeChangeTracking(Session session, String alias) {
+        ClassDescriptor descriptor = session.getClassDescriptorForAlias(alias);
+        Assert.assertNotNull(descriptor);
+        Assert.assertTrue(descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy());
+
+        if (TemporalEntity.class.isAssignableFrom(descriptor.getJavaClass()) && !descriptor.getAlias().endsWith(DescriptorHelper.EDITION)) {
+            assertAttributeChangeTracking(session, alias + DescriptorHelper.EDITION);
+        }
+    }
+
+    @Test
+    public void verifyPersonPhonesDescriptor() {
+        Server session = JpaHelper.getServerSession(getEMF());
+        ClassDescriptor descriptor = session.getClassDescriptorForAlias("Person");
+
+        Assert.assertNotNull(descriptor);
+        Assert.assertEquals(PersonEntity.class, descriptor.getJavaClass());
+
+        OneToManyMapping phonesMapping = (OneToManyMapping) descriptor.getMappingForAttributeName("phones");
+        Assert.assertNotNull(phonesMapping);
+
+        Assert.assertEquals("Phone", phonesMapping.getReferenceDescriptor().getAlias());
+        Assert.assertTrue(phonesMapping.isCacheable());
+
+        // TODO: Verify FK fields
+    }
+
+}
diff --git a/Temporal Tests/src/tests/internal/VerifySchemaManager.java b/Temporal Tests/src/tests/internal/VerifySchemaManager.java
new file mode 100644
index 0000000..bf211c2
--- /dev/null
+++ b/Temporal Tests/src/tests/internal/VerifySchemaManager.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.internal;
+
+import junit.framework.Assert;
+
+import org.eclipse.persistence.tools.schemaframework.ForeignKeyConstraint;
+import org.eclipse.persistence.tools.schemaframework.SchemaManager;
+import org.eclipse.persistence.tools.schemaframework.TableDefinition;
+import org.junit.Test;
+
+import temporal.persistence.TemporalSchemaManager;
+import tests.BaseTestCase;
+
+/**
+ * Verify the schema manager's table definitions
+ */
+public class VerifySchemaManager extends BaseTestCase {
+
+    private SchemaManager getSchemaManager() {
+        return (SchemaManager) getEMF().getProperties().get(SchemaManager.class.getName());
+    }
+
+    private TemporalSchemaManager getTemporalSchemaManager() {
+        return (TemporalSchemaManager) getSchemaManager();
+    }
+
+    @Test
+    public void verifySchemaManager() {
+        SchemaManager sm = getSchemaManager();
+        Assert.assertNotNull(sm);
+        Assert.assertTrue(sm instanceof TemporalSchemaManager);
+        Assert.assertSame(sm, getTemporalSchemaManager());
+        Assert.assertNotNull(getTemporalSchemaManager().getTableCreator());
+    }
+
+    @Test
+    public void verifyPhoneTable() {
+        TableDefinition td = getTemporalSchemaManager().getTableDefinition("TPHONE");
+        Assert.assertNotNull(td);
+
+        ForeignKeyConstraint fkc = td.getForeignKeyMap().get("FK_TPHONE_PERSON_ID");
+        Assert.assertNotNull(fkc);
+        Assert.assertEquals("OID", fkc.getTargetFields().get(0));
+    }
+
+    @Test
+    public void verifyPersonHobbyTable() {
+        TableDefinition td = getTemporalSchemaManager().getTableDefinition("TPERSON_HOBBY");
+        Assert.assertNotNull(td);
+
+        ForeignKeyConstraint fkc = td.getForeignKeyMap().get("FK_TPERSON_HOBBY_PERSON_ID");
+        Assert.assertNotNull(fkc);
+        Assert.assertEquals("OID", fkc.getTargetFields().get(0));
+    }
+
+    @Test
+    public void verifyPersonTable() {
+        TableDefinition td = getTemporalSchemaManager().getTableDefinition("TPERSON");
+        Assert.assertNotNull(td);
+
+        ForeignKeyConstraint fkc = td.getForeignKeyMap().get("FK_TPERSON_ADDR_ID");
+        Assert.assertNotNull(fkc);
+        Assert.assertEquals("OID", fkc.getTargetFields().get(0));
+    }
+}
diff --git a/Temporal Tests/src/tests/internal/WrapperPolicyTests.java b/Temporal Tests/src/tests/internal/WrapperPolicyTests.java
new file mode 100644
index 0000000..d89200f
--- /dev/null
+++ b/Temporal Tests/src/tests/internal/WrapperPolicyTests.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
+ * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
+ * 
+ * Contributors: dclarke - Bug 361016: Future Versions Examples
+ ******************************************************************************/
+package tests.internal;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+
+import junit.framework.Assert;
+
+import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.internal.sessions.AbstractSession;
+import org.eclipse.persistence.jpa.JpaHelper;
+import org.eclipse.persistence.sessions.server.Server;
+import org.junit.Test;
+
+import temporal.TemporalHelper;
+import temporal.persistence.DescriptorHelper;
+import temporal.persistence.EditionWrapperPolicy;
+import tests.BaseTestCase;
+
+/**
+ * Verify the helper methods on {@link TemporalHelper}
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.3.1
+ */
+public class WrapperPolicyTests extends BaseTestCase {
+
+    @Test
+    public void verifyConfig() {
+        Server session = JpaHelper.getServerSession(getEMF());
+
+        Assert.assertNotNull(session);
+
+        for (String alias : new String[] { "Person", "Address", "Phone" }) {
+            ClassDescriptor cd = session.getClassDescriptorForAlias(alias);
+            Assert.assertNotNull(cd);
+            Assert.assertTrue(cd.hasWrapperPolicy());
+            Assert.assertTrue(cd.getWrapperPolicy() instanceof EditionWrapperPolicy);
+
+            cd = session.getClassDescriptorForAlias(alias + DescriptorHelper.EDITION);
+            Assert.assertNotNull(cd);
+            Assert.assertTrue(cd.hasWrapperPolicy());
+            Assert.assertTrue(cd.getWrapperPolicy() instanceof EditionWrapperPolicy);
+        }
+    }
+
+    @Test
+    public void createEntityAndDescriptorLookupUsingProxy() {
+        Server session = JpaHelper.getServerSession(getEMF());
+        Assert.assertNotNull(session);
+
+        for (String alias : new String[] { "Person", "Address", "Phone" }) {
+            ClassDescriptor cd = session.getClassDescriptorForAlias(alias);
+            Assert.assertNotNull(cd);
+            
+            Object entity = cd.getInstantiationPolicy().buildNewInstance();
+            Assert.assertNotNull(entity);
+            Assert.assertFalse(cd.getWrapperPolicy().isWrapped(entity));
+            
+            Object wrappedEnObject = cd.getWrapperPolicy().wrapObject(entity, (AbstractSession) session);
+            
+            Assert.assertNotNull(wrappedEnObject);
+            Assert.assertTrue(cd.getWrapperPolicy().isWrapped(wrappedEnObject));
+            Assert.assertTrue(Proxy.isProxyClass(wrappedEnObject.getClass()));
+            InvocationHandler handler = Proxy.getInvocationHandler(wrappedEnObject);
+            Assert.assertTrue(handler instanceof EditionWrapperPolicy.Handler<?>);
+            
+            ClassDescriptor lookupCD = session.getClassDescriptor(wrappedEnObject);
+            Assert.assertNotNull(lookupCD);
+            Assert.assertSame(cd, lookupCD);
+        }
+    }
+
+    @Test
+    public void createEditionAndDescriptorLookupUsingProxy() {
+        Server session = JpaHelper.getServerSession(getEMF());
+        Assert.assertNotNull(session);
+
+        for (String alias : new String[] { "Person", "Address", "Phone" }) {
+            ClassDescriptor cd = session.getClassDescriptorForAlias(alias+ DescriptorHelper.EDITION);
+            Assert.assertNotNull(cd);
+            
+            Object entity = cd.getInstantiationPolicy().buildNewInstance();
+            Assert.assertNotNull(entity);
+            Assert.assertFalse(cd.getWrapperPolicy().isWrapped(entity));
+            
+            Object wrappedEnObject = cd.getWrapperPolicy().wrapObject(entity, (AbstractSession) session);
+            
+            Assert.assertNotNull(wrappedEnObject);
+            Assert.assertTrue(Proxy.isProxyClass(wrappedEnObject.getClass()));
+            InvocationHandler handler = Proxy.getInvocationHandler(wrappedEnObject);
+            Assert.assertTrue(handler instanceof EditionWrapperPolicy.Handler<?>);
+            
+            ClassDescriptor lookupCD = session.getClassDescriptor(wrappedEnObject);
+            Assert.assertNotNull(lookupCD);
+            Assert.assertSame(cd, lookupCD);
+        }
+    }
+}
diff --git a/Temporal Tests/src/tests/internal/asm/ASMifyPersonEdition.java b/Temporal Tests/src/tests/internal/asm/ASMifyPersonEdition.java
new file mode 100644
index 0000000..7f2b90b
--- /dev/null
+++ b/Temporal Tests/src/tests/internal/asm/ASMifyPersonEdition.java
@@ -0,0 +1,15 @@
+package tests.internal.asm;
+
+import org.eclipse.persistence.internal.libraries.asm.util.ASMifierClassVisitor;
+
+public class ASMifyPersonEdition {
+
+    /**
+     * @param args
+     * @throws Exception 
+     */
+    public static void main(String[] args) throws Exception {
+        ASMifierClassVisitor.main(new String[] { PersonEdition.class.getName()});
+    }
+
+}
diff --git a/Temporal Tests/src/tests/internal/asm/PersonEdition.java b/Temporal Tests/src/tests/internal/asm/PersonEdition.java
new file mode 100644
index 0000000..5d2fff0
--- /dev/null
+++ b/Temporal Tests/src/tests/internal/asm/PersonEdition.java
@@ -0,0 +1,7 @@
+package tests.internal.asm;
+
+import model.Person;
+
+public interface PersonEdition extends Person {
+
+}