Merge branch 'master' of ssh://git.eclipse.org/gitroot/eclipselink/examples
diff --git a/jpa/employee/employee.model/.project b/jpa/employee/employee.model/.project
index aa0e7e6..5a922d3 100644
--- a/jpa/employee/employee.model/.project
+++ b/jpa/employee/employee.model/.project
@@ -6,6 +6,11 @@
 	</projects>
 	<buildSpec>
 		<buildCommand>
+			<name>org.python.pydev.PyDevBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
 			<name>org.eclipse.wst.common.project.facet.core.builder</name>
 			<arguments>
 			</arguments>
@@ -32,5 +37,6 @@
 		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.python.pydev.pythonNature</nature>
 	</natures>
 </projectDescription>
diff --git a/jpa/employee/employee.model/.pydevproject b/jpa/employee/employee.model/.pydevproject
new file mode 100644
index 0000000..40e9f40
--- /dev/null
+++ b/jpa/employee/employee.model/.pydevproject
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?eclipse-pydev version="1.0"?><pydev_project>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
+</pydev_project>
diff --git a/jpa/employee/employee.model/.settings/org.eclipse.core.resources.prefs b/jpa/employee/employee.model/.settings/org.eclipse.core.resources.prefs
index c015bf3..5de7f02 100644
--- a/jpa/employee/employee.model/.settings/org.eclipse.core.resources.prefs
+++ b/jpa/employee/employee.model/.settings/org.eclipse.core.resources.prefs
@@ -1,6 +1,6 @@
 eclipse.preferences.version=1
 encoding//src/main/java=UTF-8
-encoding//src/main/java/eclipselink/example/jpa/employee/services/EditEmployee.java=UTF-8
+encoding//src/main/java/eclipselink/example/jpa/employee/services/AdminBean.java=UTF-8
 encoding//src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java=UTF-8
 encoding//src/main/resources=UTF-8
 encoding//src/test/java=UTF-8
diff --git a/jpa/employee/employee.model/.settings/org.eclipse.wst.validation.prefs b/jpa/employee/employee.model/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000..f6a7fbd
--- /dev/null
+++ b/jpa/employee/employee.model/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,8 @@
+DELEGATES_PREFERENCE=delegateValidatorList
+USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
+USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
+USER_PREFERENCE=overrideGlobalPreferencesfalse
+eclipse.preferences.version=1
+override=false
+suspend=false
+vf.version=3
diff --git a/jpa/employee/employee.model/.settings/org.eclipse.wst.xml.core.prefs b/jpa/employee/employee.model/.settings/org.eclipse.wst.xml.core.prefs
new file mode 100644
index 0000000..b663641
--- /dev/null
+++ b/jpa/employee/employee.model/.settings/org.eclipse.wst.xml.core.prefs
@@ -0,0 +1,18 @@
+attributeHasNoValue=2
+eclipse.preferences.version=1
+endTagWithAttributes=2
+honourAllSchemaLocations=false
+indicateNoGrammar=-1
+indiciateNoDocumentElement=-1
+markupValidation=false
+missingClosingBracket=2
+missingClosingQuote=2
+missingEndTag=2
+missingQuotes=2
+missingStartTag=2
+missingTagName=2
+namespaceInPITarget=2
+use-project-settings=true
+whitespaceAtStart=2
+whitespaceBeforeTagName=2
+xinclude=false
diff --git a/jpa/employee/employee.model/.settings/org.eclipse.wst.xsl.core.prefs b/jpa/employee/employee.model/.settings/org.eclipse.wst.xsl.core.prefs
new file mode 100644
index 0000000..e28962c
--- /dev/null
+++ b/jpa/employee/employee.model/.settings/org.eclipse.wst.xsl.core.prefs
@@ -0,0 +1,11 @@
+CHECK_CALL_TEMPLATES=2
+CHECK_XPATHS=2
+CIRCULAR_REF=2
+DUPLICATE_PARAMETER=2
+EMPTY_PARAM=1
+MISSING_INCLUDE=2
+MISSING_PARAM=1
+NAME_ATTRIBUTE_EMPTY=2
+NAME_ATTRIBUTE_MISSING=2
+TEMPLATE_CONFLICT=2
+eclipse.preferences.version=1
diff --git a/jpa/employee/employee.model/README.md b/jpa/employee/employee.model/README.md
index 3b165aa..2a1ffd3 100644
--- a/jpa/employee/employee.model/README.md
+++ b/jpa/employee/employee.model/README.md
@@ -3,4 +3,7 @@
 
 Employee example model project illustrating an annotation mapped model. This project is leveraged by the employee.web and employee.web-js projects.
 
-http://wiki.eclipse.org/EclipseLink/Examples/JPA/Employee
\ No newline at end of file
+[EclipseLink Wiki: Employee JPA Example][1]
+  
+  
+[1]: http://wiki.eclipse.org/EclipseLink/Examples/JPA/Employee
\ No newline at end of file
diff --git a/jpa/employee/employee.model/src/PessimisticLockTest.launch b/jpa/employee/employee.model/src/PessimisticLockTest.launch
index 4231fbb..ea1494d 100644
--- a/jpa/employee/employee.model/src/PessimisticLockTest.launch
+++ b/jpa/employee/employee.model/src/PessimisticLockTest.launch
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
 <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/employee.model/src/test/java/test/PessimisticLockTest.java"/>
+<listEntry value="/employee.model"/>
 </listAttribute>
 <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
+<listEntry value="4"/>
 </listAttribute>
 <stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
 <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
diff --git a/jpa/employee/employee.model/src/eclipse/AdminBeanTest.launch b/jpa/employee/employee.model/src/eclipse/AdminBeanTest.launch
new file mode 100644
index 0000000..d1ba8ed
--- /dev/null
+++ b/jpa/employee/employee.model/src/eclipse/AdminBeanTest.launch
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/AdminBeanTest.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</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.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="eclipselink.example.jpa.employee.test.services.AdminBeanTest"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="employee.model"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-javaagent:${system_property:user.home}/.m2/repository/org/eclipse/persistence/eclipselink/2.4.2-SNAPSHOT/eclipselink-2.4.2-SNAPSHOT.jar"/>
+</launchConfiguration>
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/AdminBean.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/AdminBean.java
new file mode 100644
index 0000000..f7d35c7
--- /dev/null
+++ b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/AdminBean.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2010-2013 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 - EclipseLink 2.3 - MySports Demo Bug 344608
+ ******************************************************************************/
+package eclipselink.example.jpa.employee.services;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.LocalBean;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceUnit;
+import javax.persistence.metamodel.EntityType;
+
+import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.internal.sessions.IdentityMapAccessor;
+import org.eclipse.persistence.sessions.server.Server;
+import org.eclipse.persistence.tools.schemaframework.SchemaManager;
+
+import eclipselink.example.jpa.employee.model.Employee;
+import eclipselink.example.jpa.employee.model.SamplePopulation;
+
+/**
+ * Edit service for an {@link Employee} instance.
+ * 
+ * @author dclarke
+ * @since EclipseLink 2.4.2
+ */
+@Stateless
+@LocalBean
+public class AdminBean {
+
+    private EntityManagerFactory emf;
+
+    public EntityManagerFactory getEmf() {
+        return emf;
+    }
+
+    @PersistenceUnit(unitName = "employee")
+    public void setEmf(EntityManagerFactory emf) {
+        this.emf = emf;
+    }
+
+    public String resetDatabase() {
+        EntityManager em = getEmf().createEntityManager();
+
+        try {
+            SchemaManager sm = new SchemaManager(em.unwrap(Server.class));
+            sm.replaceDefaultTables();
+            sm.replaceSequences();
+
+            em.unwrap(Server.class).getIdentityMapAccessor().initializeAllIdentityMaps();
+        } finally {
+            em.close();
+        }
+        return null;
+    }
+
+    public String populateDatabase(int quantity) {
+        EntityManager em = getEmf().createEntityManager();
+
+        try {
+            new SamplePopulation().createNewEmployees(em, quantity);
+        } finally {
+            em.close();
+        }
+        return null;
+    }
+
+    public int getCacheSize(String typeName) {
+        EntityManager em = getEmf().createEntityManager();
+        Server session = em.unwrap(Server.class);
+        ClassDescriptor descriptor = session.getDescriptorForAlias(typeName);
+        if (descriptor != null) {
+            return ((IdentityMapAccessor) session.getIdentityMapAccessor()).getIdentityMap(descriptor.getJavaClass()).getSize();
+        } else {
+            return -1;
+        }
+    }
+
+    public int getDatabaseCount(String type) {
+        EntityManager em = getEmf().createEntityManager();
+
+        try {
+            return em.createQuery("SELECT COUNT(o) FROM " + type + " o", Number.class).getSingleResult().intValue();
+        } finally {
+            em.close();
+        }
+    }
+
+    /**
+     * Construct a list of valid type names based on the JAP metamodel. Only
+     * include types that are inheritance roots (no super type).
+     */
+    public List<String> getTypes() {
+        List<String> typeNames = new ArrayList<String>();
+        for (EntityType<?> type : getEmf().getMetamodel().getEntities()) {
+            if (type.getSupertype() == null) {
+                typeNames.add(type.getName());
+            }
+        }
+        return typeNames;
+    }
+
+}
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/Diagnostics.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/Diagnostics.java
index 3652b3b..96b3dba 100644
--- a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/Diagnostics.java
+++ b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/Diagnostics.java
@@ -27,7 +27,9 @@
 import org.eclipse.persistence.sessions.server.Server;
 
 /**
- * TODO
+ * SessionLog proxy {@link InvocationHandler} used to intercept SQL logging
+ * messages so this sample application can display the SQL executed by the most
+ * recent operations.
  * 
  * @author dclarke
  * @since EclipseLink 2.4.2
@@ -46,10 +48,8 @@
     private SessionLog log;
 
     /**
-     * TODO
-     * 
-     * @param emf
-     * @return
+     * Lookup the Diagnostics instance and registered as the SessionLog (proxy).
+     * If one does not exist then create one.
      */
     public static Diagnostics getInstance(EntityManagerFactory emf) {
         EntityManager em = emf.createEntityManager();
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployee.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployee.java
deleted file mode 100644
index ccac3c8..0000000
--- a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployee.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package eclipselink.example.jpa.employee.services;
-
-import javax.ejb.Local;
-
-import eclipselink.example.jpa.employee.model.Employee;
-import eclipselink.example.jpa.employee.model.PhoneNumber;
-
-/**
- * 
- * @author dclarke
- * @since EclipseLink 2.4.2
- */
-@Local
-public interface EditEmployee {
-
-    public abstract Employee getEmployee();
-
-    public abstract void setEmployee(Employee employee);
-
-    public abstract boolean isNew();
-
-    /**
-     * 
-     * @return
-     */
-    public abstract void save();
-
-    public abstract void delete();
-
-    public abstract void refresh();
-
-    /**
-     * Force the optimistic version field to be updated so that the save
-     * operations will fail.
-     */
-    public abstract int updateVersion();
-
-    public abstract String removeAddress();
-
-    public abstract String addAddress();
-
-    public abstract PhoneNumber addPhone(String type);
-
-    public abstract void remove(PhoneNumber phone);
-
-    public abstract void close();
-
-}
\ No newline at end of file
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java
index 4b7399d..f630189 100644
--- a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java
+++ b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java
@@ -12,11 +12,12 @@
  ******************************************************************************/
 package eclipselink.example.jpa.employee.services;
 
-import javax.ejb.Local;
+import javax.ejb.LocalBean;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.LockModeType;
+import javax.persistence.PersistenceUnit;
 
 import eclipselink.example.jpa.employee.model.Address;
 import eclipselink.example.jpa.employee.model.Employee;
@@ -29,47 +30,37 @@
  * @since EclipseLink 2.4.2
  */
 @Stateless
-@Local(EditEmployee.class)
-public class EditEmployeeBean implements EditEmployee {
+@LocalBean
+public class EditEmployeeBean {
 
-    private EntityManager entityManager;
+    private EntityManagerFactory emf;
 
     private Employee employee;
 
+    private Diagnostics diagnostics;
+
     public EditEmployeeBean() {
         super();
     }
 
-    public EditEmployeeBean(EntityManagerFactory emf, Integer id) {
-        this.entityManager = emf.createEntityManager();
-        if (id != null) {
-            setEmployee(getEntityManager().find(Employee.class, id));
-        } else {
-            this.employee = new Employee();
-        }
+    public EntityManagerFactory getEmf() {
+        return emf;
     }
 
-    protected EntityManager getEntityManager() {
-        return this.entityManager;
+    @PersistenceUnit(unitName = "employee")
+    public void setEmf(EntityManagerFactory emf) {
+        this.emf = emf;
+        this.diagnostics = Diagnostics.getInstance(emf);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see eclipselink.example.jpa.employee.services.EditEmployee#getEmployee()
-     */
-    @Override
+    public Diagnostics getDiagnostics() {
+        return diagnostics;
+    }
+
     public Employee getEmployee() {
         return employee;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see eclipselink.example.jpa.employee.services.EditEmployee#setEmployee(
-     * eclipselink.example.jpa.employee.model.Employee)
-     */
-    @Override
     public void setEmployee(Employee employee) {
         this.employee = employee;
         if (employee != null) {
@@ -78,108 +69,89 @@
         }
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see eclipselink.example.jpa.employee.services.EditEmployee#isNew()
-     */
-    @Override
+    public Employee setEmployee(int id) {
+        EntityManager em = getEmf().createEntityManager();
+
+        try {
+            this.employee = em.find(Employee.class, id);
+            return this.employee;
+        } finally {
+            em.close();
+        }
+    }
+
     public boolean isNew() {
         return getEmployee().getId() <= 0;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see eclipselink.example.jpa.employee.services.EditEmployee#save()
-     */
-    @Override
     public void save() {
-        getEntityManager().getTransaction().begin();
+        EntityManager em = getEmf().createEntityManager();
 
-        // Ensure the Employee's lock value is incremented
-        getEntityManager().lock(getEmployee(), LockModeType.OPTIMISTIC_FORCE_INCREMENT);
+        try {
+            this.employee = em.merge(getEmployee());
+            em.getTransaction().begin();
 
-        getEntityManager().getTransaction().commit();
+            // Ensure the Employee's lock value is incremented
+            em.lock(getEmployee(), LockModeType.OPTIMISTIC_FORCE_INCREMENT);
+
+            em.getTransaction().commit();
+        } finally {
+            em.close();
+        }
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see eclipselink.example.jpa.employee.services.EditEmployee#delete()
-     */
-    @Override
     public void delete() {
+        EntityManager em = getEmf().createEntityManager();
+
         try {
-            getEntityManager().getTransaction().begin();
-            getEntityManager().remove(getEmployee());
-            getEntityManager().getTransaction().commit();
+            this.employee = em.merge(getEmployee());
+            em.getTransaction().begin();
+            em.remove(getEmployee());
+            em.getTransaction().commit();
         } finally {
             setEmployee(null);
         }
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see eclipselink.example.jpa.employee.services.EditEmployee#refresh()
-     */
-    @Override
     public void refresh() {
-        if (!getEntityManager().contains(getEmployee())) {
-            setEmployee(getEntityManager().merge(getEmployee()));
+        EntityManager em = getEmf().createEntityManager();
+
+        try {
+            if (!em.contains(getEmployee())) {
+                setEmployee(em.merge(getEmployee()));
+            }
+            em.refresh(getEmployee());
+        } finally {
+            em.close();
         }
-        getEntityManager().refresh(getEmployee());
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * eclipselink.example.jpa.employee.services.EditEmployee#updateVersion()
-     */
-    @Override
     public int updateVersion() {
-        getEntityManager().detach(getEmployee());
-        getEntityManager().getTransaction().begin();
-        getEntityManager().createNativeQuery("UPDATE EMPLOYEE SET VERSION = VERSION + 1 WHERE EMP_ID = " + getEmployee().getId()).executeUpdate();
-        getEntityManager().getTransaction().commit();
-        setEmployee(getEntityManager().merge(getEmployee()));
-        Number result = (Number) getEntityManager().createNativeQuery("SELECT VERSION FROM EMPLOYEE WHERE EMP_ID = " + getEmployee().getId()).getSingleResult();
-        return result.intValue();
+        EntityManager em = getEmf().createEntityManager();
+
+        try {
+            this.employee = em.merge(getEmployee());
+            em.getTransaction().begin();
+            em.createNativeQuery("UPDATE EMPLOYEE SET VERSION = VERSION + 1 WHERE EMP_ID = " + getEmployee().getId()).executeUpdate();
+            em.getTransaction().commit();
+            setEmployee(em.merge(getEmployee()));
+            Number result = (Number) em.createNativeQuery("SELECT VERSION FROM EMPLOYEE WHERE EMP_ID = " + getEmployee().getId()).getSingleResult();
+            return result.intValue();
+        } finally {
+            em.close();
+        }
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * eclipselink.example.jpa.employee.services.EditEmployee#removeAddress()
-     */
-    @Override
     public String removeAddress() {
         getEmployee().setAddress(null);
         return null;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see eclipselink.example.jpa.employee.services.EditEmployee#addAddress()
-     */
-    @Override
     public String addAddress() {
         getEmployee().setAddress(new Address());
         return null;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * eclipselink.example.jpa.employee.services.EditEmployee#addPhone(java.
-     * lang.String)
-     */
-    @Override
     public PhoneNumber addPhone(String type) {
         if (type != null && !type.isEmpty()) {
             return getEmployee().addPhoneNumber(type, "", "");
@@ -187,26 +159,8 @@
         return null;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * eclipselink.example.jpa.employee.services.EditEmployee#remove(eclipselink
-     * .example.jpa.employee.model.PhoneNumber)
-     */
-    @Override
     public void remove(PhoneNumber phone) {
         getEmployee().removePhoneNumber(phone);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see eclipselink.example.jpa.employee.services.EditEmployee#close()
-     */
-    @Override
-    public void close() {
-        getEntityManager().close();
-    }
-
 }
diff --git a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/AdminBeanTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/AdminBeanTest.java
new file mode 100644
index 0000000..a0f69fe
--- /dev/null
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/AdminBeanTest.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2010-2013 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 - initial
+ ******************************************************************************/
+package eclipselink.example.jpa.employee.test.services;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import eclipselink.example.jpa.employee.model.SamplePopulation;
+import eclipselink.example.jpa.employee.services.Diagnostics;
+import eclipselink.example.jpa.employee.services.AdminBean;
+import eclipselink.example.jpa.employee.test.PersistenceTesting;
+
+public class AdminBeanTest {
+
+    private AdminBean admin;
+
+    public AdminBean getAdmin() {
+        return admin;
+    }
+
+    @Test
+    public void verifyReset() {
+        for (String type : getAdmin().getTypes()) {
+            Assert.assertEquals(0, admin.getCacheSize(type));
+            Assert.assertEquals(0, admin.getDatabaseCount(type));
+        }
+    }
+
+    @Test
+    public void popuate() {
+        verifyReset();
+
+        getAdmin().populateDatabase(20);
+
+        Assert.assertEquals(20, admin.getCacheSize("Employee"));
+        Assert.assertEquals(20, admin.getDatabaseCount("Employee"));
+
+        Assert.assertEquals(20, admin.getCacheSize("Address"));
+        Assert.assertEquals(20, admin.getDatabaseCount("Address"));
+
+        Assert.assertEquals(40, admin.getCacheSize("PhoneNumber"));
+        Assert.assertEquals(40, admin.getDatabaseCount("PhoneNumber"));
+
+        Assert.assertEquals(0, admin.getCacheSize("Project"));
+        Assert.assertEquals(0, admin.getDatabaseCount("Project"));
+    }
+
+    @Test
+    public void verifyTypeNames() {
+        List<String> types = getAdmin().getTypes();
+
+        Assert.assertNotNull(types);
+        Assert.assertEquals(4, types.size());
+
+        Assert.assertTrue(types.contains("Employee"));
+        Assert.assertTrue(types.contains("Address"));
+        Assert.assertTrue(types.contains("PhoneNumber"));
+        Assert.assertTrue(types.contains("Project"));
+    }
+
+    private static EntityManagerFactory emf;
+
+    public static EntityManagerFactory getEmf() {
+        return emf;
+    }
+
+    @Before
+    public void resetDatabase() {
+        this.admin = new AdminBean();
+        this.admin.setEmf(getEmf());
+        this.admin.resetDatabase();
+    }
+
+    @BeforeClass
+    public static void createEMF() {
+        emf = PersistenceTesting.createEMF(true);
+
+        EntityManager em = emf.createEntityManager();
+        new SamplePopulation().createNewEmployees(em, 25);
+        em.close();
+
+        Diagnostics.getInstance(emf);
+        emf.getCache().evictAll();
+    }
+
+    @AfterClass
+    public static void closeEMF() {
+        if (emf != null && emf.isOpen()) {
+            emf.close();
+        }
+        emf = null;
+    }
+
+}
diff --git a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/EditEmployeeTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/EditEmployeeTest.java
index 22f9265..a9284f4 100644
--- a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/EditEmployeeTest.java
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/EditEmployeeTest.java
@@ -23,8 +23,8 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import eclipselink.example.jpa.employee.model.Employee;
 import eclipselink.example.jpa.employee.model.SamplePopulation;
-import eclipselink.example.jpa.employee.services.EditEmployee;
 import eclipselink.example.jpa.employee.services.EditEmployeeBean;
 import eclipselink.example.jpa.employee.test.PersistenceTesting;
 
@@ -36,33 +36,35 @@
  */
 public class EditEmployeeTest {
 
+    private EditEmployeeBean edit = new EditEmployeeBean();
+
+    @Before
+    public void setup() {
+        this.edit = new EditEmployeeBean();
+        this.edit.setEmf(getEmf());
+    }
+
     @Test
     public void saveWithoutChanges() {
-        EditEmployee edit = new EditEmployeeBean(getEmf(), sampleId);
+        Employee emp = this.edit.setEmployee(sampleId);
+        
+        Assert.assertNotNull(emp);
 
-        try {
-            edit.save();
-        } finally {
-            edit.close();
-        }
+        edit.save();
     }
 
     @Test
     public void incrementSalary() {
-        EditEmployee edit = new EditEmployeeBean(getEmf(), sampleId);
+        edit.setEmployee(sampleId);
 
-        try {
-            edit.getEmployee().setSalary(edit.getEmployee().getSalary() + 1);
-            edit.save();
-        } finally {
-            edit.close();
-        }
+        edit.getEmployee().setSalary(edit.getEmployee().getSalary() + 1);
+        edit.save();
     }
 
     @Test
     public void optimisticLockFailure() {
-        EditEmployee edit = new EditEmployeeBean(getEmf(), sampleId);
-
+        edit.setEmployee(sampleId);
+        
         try {
             edit.updateVersion();
             edit.getEmployee().setSalary(edit.getEmployee().getSalary() + 1);
@@ -72,8 +74,6 @@
                 return;
             }
             throw e;
-        } finally {
-            edit.close();
         }
 
         Assert.fail("OptimisticLockException not thrown");
@@ -81,15 +81,11 @@
 
     @Test
     public void refreshUpdateAddress() {
-        EditEmployee edit = new EditEmployeeBean(getEmf(), sampleId);
+        edit.setEmployee(sampleId);
 
-        try {
-            edit.refresh();
-            edit.getEmployee().getAddress().setCity("Ottawa");
-            edit.save();
-        } finally {
-            edit.close();
-        }
+        edit.refresh();
+        edit.getEmployee().getAddress().setCity("Ottawa");
+        edit.save();
 
     }
 
diff --git a/jpa/employee/employee.web/README.md b/jpa/employee/employee.web/README.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jpa/employee/employee.web/README.md
diff --git a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Admin.java b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Admin.java
index 413d449..6267a30 100644
--- a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Admin.java
+++ b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Admin.java
@@ -12,16 +12,13 @@
  ******************************************************************************/
 package eclipselink.example.jpa.employee.web;
 
+import java.util.List;
+
+import javax.ejb.EJB;
 import javax.faces.bean.ManagedBean;
 import javax.faces.bean.RequestScoped;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.PersistenceUnit;
 
-import org.eclipse.persistence.sessions.server.Server;
-import org.eclipse.persistence.tools.schemaframework.SchemaManager;
-
-import eclipselink.example.jpa.employee.model.SamplePopulation;
+import eclipselink.example.jpa.employee.services.AdminBean;
 
 /**
  * TODO
@@ -33,41 +30,58 @@
 @RequestScoped
 public class Admin {
 
-    private EntityManagerFactory emf;
+    private AdminBean adminBean;
 
-    public EntityManagerFactory getEmf() {
-        return emf;
+    private List<String> typeNames;
+
+    private boolean displaySql = false;
+
+    public AdminBean getAdminBean() {
+        return adminBean;
     }
 
-    @PersistenceUnit(unitName = "employee")
-    public void setEmf(EntityManagerFactory emf) {
-        this.emf = emf;
+    @EJB
+    public void setAdminBean(AdminBean adminBean) {
+        this.adminBean = adminBean;
     }
 
     public String resetDatabase() {
-        EntityManager em = getEmf().createEntityManager();
-
-        try {
-            SchemaManager sm = new SchemaManager(em.unwrap(Server.class));
-            sm.replaceDefaultTables();
-            sm.replaceSequences();
-
-            em.unwrap(Server.class).getIdentityMapAccessor().initializeAllIdentityMaps();
-        } finally {
-            em.close();
-        }
-        return null;
+        return getAdminBean().resetDatabase();
     }
 
     public String populateDatabase() {
-        EntityManager em = getEmf().createEntityManager();
+        return getAdminBean().populateDatabase(25);
+    }
 
-        try {
-            new SamplePopulation().createNewEmployees(em, 25);
-        } finally {
-            em.close();
+    public List<String> getTypeNames() {
+        if (this.typeNames == null) {
+            this.typeNames = getAdminBean().getTypes();
         }
-        return null;
+        return typeNames;
+    }
+
+    public boolean isDisplaySql() {
+        return displaySql;
+    }
+
+    public void setDisplaySql(boolean displaySql) {
+        this.displaySql = displaySql;
+    }
+
+    public void toggleSqlDisplay() {
+        this.displaySql = !this.displaySql;
+    }
+
+    public String getToggleSqlDisplayButton() {
+        return isDisplaySql() ? "Disable SQL Display" : "Enable SQL Display";
+    }
+
+    public String getCacheSize(String typeName) {
+        int size = getAdminBean().getCacheSize(typeName);
+        if (size < 0) {
+            return "Error";
+        }
+        return Integer.toString(size);
     }
 
 }
diff --git a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Config.java b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Config.java
deleted file mode 100644
index b5b230a..0000000
--- a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Config.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010-2013 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 - initial
- ******************************************************************************/
-package eclipselink.example.jpa.employee.web;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.faces.bean.ManagedBean;
-import javax.faces.bean.SessionScoped;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.PersistenceUnit;
-
-import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.internal.sessions.IdentityMapAccessor;
-import org.eclipse.persistence.sessions.server.Server;
-
-/**
- * TODO
- * 
- * @author dclarke
- * @since EclipseLink 2.4.2
- */
-@ManagedBean
-@SessionScoped
-public class Config {
-
-    private List<String> typeNames;
-
-    private boolean displaySql = false;
-
-    public Config() {
-        this.typeNames = new ArrayList<String>();
-        this.typeNames.add("Employee");
-        this.typeNames.add("Address");
-        this.typeNames.add("PhoneNumber");
-        this.typeNames.add("Project");
-    }
-
-    private EntityManagerFactory emf;
-
-    public EntityManagerFactory getEmf() {
-        return emf;
-    }
-
-    @PersistenceUnit(unitName = "employee")
-    public void setEmf(EntityManagerFactory emf) {
-        this.emf = emf;
-    }
-
-    public List<String> getTypeNames() {
-        return typeNames;
-    }
-
-    public boolean isDisplaySql() {
-        return displaySql;
-    }
-
-    public void setDisplaySql(boolean displaySql) {
-        this.displaySql = displaySql;
-    }
-
-    public void toggleSqlDisplay() {
-        this.displaySql = !this.displaySql;
-    }
-
-    public String getToggleSqlDisplayButton() {
-        return isDisplaySql() ? "Disable SQL Display" : "Enable SQL Display";
-    }
-
-    public String getCacheSize(String typeName) {
-        System.out.println("Config.getCacheSize('" + typeName + "')");
-        EntityManager em = getEmf().createEntityManager();
-        Server session = em.unwrap(Server.class);
-        ClassDescriptor descriptor = session.getDescriptorForAlias(typeName);
-        if (descriptor != null) {
-            int size = ((IdentityMapAccessor) session.getIdentityMapAccessor()).getIdentityMap(descriptor.getJavaClass()).getSize();
-            return Integer.toString(size);
-        } else {
-            return "N/A";
-        }
-    }
-}
diff --git a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/EditEmployeeView.java b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/EditEmployeeView.java
index a41e814..e13deaf 100644
--- a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/EditEmployeeView.java
+++ b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/EditEmployeeView.java
@@ -13,15 +13,13 @@
 package eclipselink.example.jpa.employee.web;
 
 import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
+import javax.ejb.EJB;
 import javax.faces.application.FacesMessage;
 import javax.faces.bean.ManagedBean;
 import javax.faces.bean.ViewScoped;
 import javax.faces.context.FacesContext;
 import javax.faces.context.Flash;
-import javax.persistence.EntityManagerFactory;
 import javax.persistence.OptimisticLockException;
-import javax.persistence.PersistenceUnit;
 import javax.persistence.RollbackException;
 
 import org.eclipse.persistence.logging.SessionLogEntry;
@@ -31,7 +29,6 @@
 import eclipselink.example.jpa.employee.model.PhoneNumber;
 import eclipselink.example.jpa.employee.services.Diagnostics;
 import eclipselink.example.jpa.employee.services.Diagnostics.SQLTrace;
-import eclipselink.example.jpa.employee.services.EditEmployee;
 import eclipselink.example.jpa.employee.services.EditEmployeeBean;
 
 /**
@@ -44,17 +41,13 @@
 @ViewScoped
 public class EditEmployeeView {
 
-    private EditEmployee edit;
+    private EditEmployeeBean edit;
 
     /**
      * Value used to create new unique {@link PhoneNumber}
      */
     private String type;
 
-    private EntityManagerFactory emf;
-
-    private Diagnostics diagnostics;
-
     protected static final String PAGE = "/employee/edit";
     protected static final String PAGE_REDIRECT = "/employee/edit?faces-redirect=true";
 
@@ -65,17 +58,22 @@
         setEmployee(id);
     }
 
-    public EditEmployee getEdit() {
+    public EditEmployeeBean getEdit() {
         return edit;
     }
 
+    @EJB
+    public void setEdit(EditEmployeeBean edit) {
+        this.edit = edit;
+    }
+
     public Employee getEmployee() {
         return getEdit().getEmployee();
     }
 
     public void setEmployee(int id) {
         getDiagnostics().start();
-        this.edit = new EditEmployeeBean(getEmf(), id);
+        this.edit.setEmployee(id);
         addMessages(getDiagnostics().stop());
     }
 
@@ -98,18 +96,8 @@
         return getEdit().isNew();
     }
 
-    @PersistenceUnit(unitName = "employee")
-    public void setEmf(EntityManagerFactory emf) {
-        this.emf = emf;
-        this.diagnostics = Diagnostics.getInstance(emf);
-    }
-
-    public EntityManagerFactory getEmf() {
-        return emf;
-    }
-
     public Diagnostics getDiagnostics() {
-        return diagnostics;
+        return getEdit().getDiagnostics();
     }
 
     /**
@@ -189,11 +177,6 @@
         return null;
     }
 
-    @PreDestroy
-    public void destroy() {
-        getEdit().close();
-    }
-
     /**
      * Add each SQL string to the messages TODO: Allow this to be
      * enabled/disabled
diff --git a/jpa/employee/employee.web/src/main/webapp/admin.xhtml b/jpa/employee/employee.web/src/main/webapp/admin.xhtml
index aff04c9..d4b226a 100644
--- a/jpa/employee/employee.web/src/main/webapp/admin.xhtml
+++ b/jpa/employee/employee.web/src/main/webapp/admin.xhtml
@@ -21,15 +21,15 @@
 					action="#{admin.populateDatabase}" class="menu-button"
 					style="width: 400" />
 				<p />
-				<h:commandButton value="#{config.toggleSqlDisplayButton}"
-					action="#{config.toggleSqlDisplay}" class="menu-button"
+				<h:commandButton value="#{admin.toggleSqlDisplayButton}"
+					action="#{admin.toggleSqlDisplay}" class="menu-button"
 					style="width: 400" />
 				<p />
 			</div>
 		</h:form>
 		<h2>Entity Status</h2>
 		<h:form>
-			<h:dataTable var="type" value="#{config.typeNames}"
+			<h:dataTable var="type" value="#{admin.typeNames}"
 				class="table-design" width="500">
 				<h:column>
 					<f:facet name="header">Type</f:facet>
@@ -40,7 +40,7 @@
 						<div align="center">Cache Size</div>
 					</f:facet>
 					<div align="center">
-						<h:outputLabel value="#{config.getCacheSize(type)}" />
+						<h:outputLabel value="#{admin.getCacheSize(type)}" />
 					</div>
 				</h:column>
 			</h:dataTable>
diff --git a/jpa/employee/pom.xml b/jpa/employee/pom.xml
index 1580b6d..557f286 100644
--- a/jpa/employee/pom.xml
+++ b/jpa/employee/pom.xml
@@ -49,15 +49,11 @@
 	</properties>
 
 	<repositories>
-		<repository>
-			<id>Java.Net</id>
-			<url>http://download.java.net/maven/2/</url>
-		</repository>
-		<repository>
-			<id>EclipseLink</id>
-			<url>http://download.eclipse.org/rt/eclipselink/maven.repo</url>
-		</repository>
-	</repositories>
+        <repository>
+            <id>oss.sonatype.org</id>
+            <name>OSS Sonatype Staging</name>
+            <url>https://oss.sonatype.org/content/groups/staging</url>
+        </repository>	</repositories>
 	
 	<modules>
         <module>employee.model</module>