Bug #464790 - Update former org.eclipse.persistence.example.jpa.server.cachecoordination example with JGroups and add to examples

Signed-off-by: Petros Splinakis <petros.splinakis@oracle.com>
Reviewed-by: Martin Grebac <martin.grebac@oracle.com>
diff --git a/jpa/cachecoordination/.classpath b/jpa/cachecoordination/.classpath
new file mode 100755
index 0000000..907a117
--- /dev/null
+++ b/jpa/cachecoordination/.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"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/EclipseLink 1.2"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Oracle JDBC"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/EJB"/>
+	<classpathentry kind="output" path="classes"/>
+</classpath>
diff --git a/jpa/cachecoordination/.project b/jpa/cachecoordination/.project
new file mode 100755
index 0000000..77fbdde
--- /dev/null
+++ b/jpa/cachecoordination/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.persistence.example.jpa.server.cachecoordination</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+	</natures>
+</projectDescription>
diff --git a/jpa/cachecoordination/.settings/com.bea.workshop.common.upgrade.log.xml b/jpa/cachecoordination/.settings/com.bea.workshop.common.upgrade.log.xml
new file mode 100755
index 0000000..36b9b74
--- /dev/null
+++ b/jpa/cachecoordination/.settings/com.bea.workshop.common.upgrade.log.xml
@@ -0,0 +1,8 @@
+<upgrade-log>
+  <entry time="2008-12-01 17:06:43 UTC">
+    <upgrade-participant pluginId="com.bea.workshop.common.wtp.core" pluginVersion="2.1.0.20080808135653" class="com.bea.workshop.common.wtp.core.upgrade.internal.WtpComponentFileUpgradeParticipant"/>
+  </entry>
+  <entry time="2009-02-12 07:58:46 UTC">
+    <upgrade-participant pluginId="com.bea.workshop.common.wtp.core" pluginVersion="2.1.0.20080808135653" class="com.bea.workshop.common.wtp.core.upgrade.internal.WtpComponentFileUpgradeParticipant"/>
+  </entry>
+</upgrade-log>
diff --git a/jpa/cachecoordination/.settings/org.eclipse.jdt.core.prefs b/jpa/cachecoordination/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..598ee66
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,65 @@
+#Mon Dec 01 11:47:05 EST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jpa/cachecoordination/.settings/org.eclipse.jpt.core.prefs b/jpa/cachecoordination/.settings/org.eclipse.jpt.core.prefs
new file mode 100755
index 0000000..7a9ecac
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.jpt.core.prefs
@@ -0,0 +1,4 @@
+#Thu Nov 26 14:30:03 EST 2009
+eclipse.preferences.version=1
+org.eclipse.jpt.core.discoverAnnotatedClasses=false
+org.eclipse.jpt.core.platform=eclipselink1_1
diff --git a/jpa/cachecoordination/.settings/org.eclipse.wst.common.component b/jpa/cachecoordination/.settings/org.eclipse.wst.common.component
new file mode 100755
index 0000000..0ef2f97
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="org.eclipse.persistence.example.jpa.20.employee.annotations">
+        <wb-resource deploy-path="/" source-path="/src"/>
+    </wb-module>
+</project-modules>
diff --git a/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
new file mode 100755
index 0000000..62ac925
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
@@ -0,0 +1,7 @@
+<root>
+  <facet id="jpt.jpa">
+    <node name="libprov">
+      <attribute name="provider-id" value="jpa-eclipselink1_1-user-library-provider"/>
+    </node>
+  </facet>
+</root>
diff --git a/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.xml b/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100755
index 0000000..e4cea7d
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <fixed facet="jpt.jpa"/>
+  <fixed facet="jst.java"/>
+  <fixed facet="jst.utility"/>
+  <installed facet="jst.java" version="5.0"/>
+  <installed facet="jst.utility" version="1.0"/>
+  <installed facet="jpt.jpa" version="1.0"/>
+</faceted-project>
diff --git a/jpa/cachecoordination/build-wls-cluster.xml b/jpa/cachecoordination/build-wls-cluster.xml
new file mode 100755
index 0000000..9109639
--- /dev/null
+++ b/jpa/cachecoordination/build-wls-cluster.xml
@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic Cluster. -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+    <property environment="env"/>
+    <property name="JEE_HOME" value="/scratch/wls/12.1.3"/>
+    <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+    <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+    <!-- localhost may not work, machine name/ip my be required. -->
+    <property name="JEE_HOST" value="localhost"/>
+    <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+    <property name="JEE_PORT1" value="7021"/>
+    <property name="JEE_PORT2" value="7031"/>
+    <property name="JEE_PORT3" value="7041"/>
+    <property name="JEE_DOMAIN" value="./domain"/>
+    <!-- These also need to be defined in the jndi.properties file. -->
+    <property name="JEE_USER" value="weblogic"/>
+    <property name="JEE_PASSWORD" value="welcome1"/>
+    <!-- These need to be updated with your database settings. -->
+    <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+    <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+    <property name="DB_USER" value="scott"/>
+    <property name="DB_PASSWORD" value="tiger"/>
+    <!-- These will differ depending on the version of WebLogic. -->
+    <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+    <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+    <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+    <property name="debuglevel" value="source,lines,vars"/>
+    <path id="example.classpath">
+        <pathelement location="classes"/>
+        <pathelement location="${JPA_LIB}"/>
+        <pathelement location="${EJB_LIB}"/>
+        <pathelement location="${ECLIPSELINK_LIB}"/>
+        <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+    </path>
+    <target name="init" depends="clean">
+        <mkdir dir="classes"/>
+    </target>
+    <target name="clean">
+        <delete dir="classes"/>
+    </target>
+
+    <target depends="init" name="build">
+        <echo message="${ant.project.name}: ${ant.file}"/>
+        <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+            <src path="src"/>
+            <exclude name="**/.svn/**"/>
+            <classpath refid="example.classpath"/>
+        </javac>
+        <copy todir="classes/META-INF">
+            <fileset dir="src/META-INF" includes="*"/>
+        </copy>
+        <copy todir="classes/">
+            <fileset dir="./" includes="jndi.properties"/>
+        </copy>
+        <jar jarfile="employee.jar">
+           <fileset dir="classes" includes="**"/>
+        </jar>
+        <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+            <fileset dir="." includes ="employee.jar"/>
+        </ear>
+    </target>
+
+    <!-- WebLogic ant tasks -->
+    <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+
+    <!-- This creates the server domain. -->
+    <target name="create-cluster">
+        <delete dir="${JEE_DOMAIN}"/>
+        <mkdir dir="${JEE_DOMAIN}"/>
+        <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx1024m"/>
+            <jvmarg value="-XX:MaxPermSize=128m"/>
+        </wlserver>
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <create type="Cluster" name="employee-cluster"/>
+            <query domain="mydomain" type="Cluster" name="employee-cluster" property="cluster"/>
+            <create type="Server" name="server1">
+                <set attribute="ListenPort" value="${JEE_PORT1}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+            <create type="Server" name="server2">
+                <set attribute="ListenPort" value="${JEE_PORT2}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+            <create type="Server" name="server3">
+                <set attribute="ListenPort" value="${JEE_PORT3}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+        </wlconfig>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+    </target>
+    
+    <!--
+        This target is to create connection pool and managed datasource required for running this JPA example.
+        Note: WLS server must be running.
+    -->
+    <target name="setup-cluster">
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSTopic" name="EmployeeTopic">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="Cluster" name="*" property="cluster"/>
+            <query domain="mydomain" type="Server" name="server1" property="server1"/>
+            <create type="JDBCConnectionPool" name="employeePool">
+                <set attribute="CapacityIncrement" value="2"/>
+                <set attribute="DriverName" value="${DB_DRIVER}"/>
+                <set attribute="InitialCapacity" value="1"/>
+                <set attribute="MaxCapacity" value="50"/>
+                <set attribute="Password" value="${DB_PASSWORD}"/>
+                <set attribute="Properties" value="user=${DB_USER}"/>
+                <set attribute="URL" value="${DB_URL}"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCTxDataSource" name="EmployeeDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCDataSource" name="EmployeeLocalDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+
+            <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+              <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+              <set attribute="XAServerEnabled" value="false"/>
+              <set attribute="Targets" value="${cluster}"/>
+           </create>
+           <create type="JMSServer" name="EmployeeJMSServer">
+              <set attribute="Targets" value="${server1}"/>
+               <create type="JMSTopic" name="EmployeeTopic">
+                  <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+               </create>
+           </create>
+
+        </wlconfig>
+    </target>
+
+    <!-- This start the servers. -->
+    <target name="start-cluster">
+        <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <sleep seconds="30"/>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver-->
+        <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+        <!-- Where as using wlserver above did not seem to -->
+        <delete>
+            <fileset dir="./" includes="server*.log,server*.err"/>
+        </delete>
+        <parallel>
+            <echo message="*** starting WebLogic admin server"/>
+            <java classname="weblogic.Server" 
+                fork="true"
+                failonerror="true">
+                <jvmarg value="-server"/>
+                <jvmarg value="-Xms512m"/>
+                <jvmarg value="-Xmx1024m"/>
+                <jvmarg value="-XX:MaxPermSize=128m"/>
+                <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                <sysproperty key="weblogic.Name" value="admin"/>
+                <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                <sysproperty key="weblogic.Stdout" value="admin.log"/>
+                <sysproperty key="weblogic.Stderr" value="admin.err"/>
+                <classpath>
+                    <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                    <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                </classpath>
+            </java>
+            <sequential>
+                <waitfor>
+                    <socket server="${JEE_HOST}" port="7001"/>
+                </waitfor>
+                <parallel>
+                    <echo message="*** starting managed server: server1 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server1"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server1.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server1.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server2 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server2"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server2.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server2.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server3 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server3"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server3.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server3.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <sequential>
+                        <waitfor>
+                            <and>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+                            </and>
+                        </waitfor>
+                        <sleep seconds="30"/>
+                        <echo message="*** done, do not close/break prompt "/>
+                    </sequential>
+                </parallel>
+            </sequential>
+        </parallel>
+    </target>
+
+    <!-- Stop the servers. -->
+    <target name="stop-cluster">
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+    </target>
+
+    <!--
+        Deploy the application ear to the servers.
+        Note: WLS server must be running.
+    -->
+    <target name="deploy">
+        <wldeploy action="deploy"
+            name="employee" source="employee.ear"
+            user="${JEE_USER}" password="${JEE_PASSWORD}"
+            adminurl="t3://${JEE_HOST}:7001"
+            failonerror="false" targets="employee-cluster">
+        </wldeploy>
+    </target>
+
+    <target name="example">
+        <java classname="example.Transactions" fork="true">
+            <!--jvmarg value="${AGENT}"/-->
+            <classpath refid="example.classpath"/>
+        </java>
+    </target>
+</project>
+
diff --git a/jpa/cachecoordination/build-wls-jgroups-cluster.xml b/jpa/cachecoordination/build-wls-jgroups-cluster.xml
new file mode 100755
index 0000000..3b2f2d9
--- /dev/null
+++ b/jpa/cachecoordination/build-wls-jgroups-cluster.xml
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic Cluster using JGroups for cache coordination. -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+    <property environment="env"/>
+    <property name="JEE_HOME" value="/path/to/wls/12.1.3"/>
+    <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+    <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+    <!-- localhost may not work, machine name/ip my be required. -->
+    <property name="JEE_HOST" value="localhost"/>
+    <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+    <property name="JEE_PORT1" value="7021"/>
+    <property name="JEE_PORT2" value="7031"/>
+    <property name="JEE_PORT3" value="7041"/>
+    <property name="JEE_DOMAIN" value="./domain"/>
+    <!-- These also need to be defined in the jndi.properties file. -->
+    <property name="JEE_USER" value="weblogic"/>
+    <property name="JEE_PASSWORD" value="welcome1"/>
+    <!-- These need to be updated with your database settings. -->
+    <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+    <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+    <property name="DB_USER" value="scott"/>
+    <property name="DB_PASSWORD" value="tiger"/>
+    <!-- These will differ depending on the version of WebLogic. -->
+    <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+    <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+    <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+    <property name="ECLIPSELINK_EXTENSION_LIB" value="/path/to/org.eclipse.persistence.extension_2.7.0.qualifier.jar"/>
+    <property name="JGROUPS_LIB" value="/path/to/jgroups.jar"/>
+    <property name="debuglevel" value="source,lines,vars"/>
+    <path id="example.classpath">
+        <pathelement location="classes"/>
+        <pathelement location="${JPA_LIB}"/>
+        <pathelement location="${EJB_LIB}"/>
+        <pathelement location="${JGROUPS_LIB}"/>
+        <pathelement location="${ECLIPSELINK_LIB}"/>
+        <pathelement location="${ECLIPSELINK_EXTENSION_LIB}"/>
+        <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+    </path>
+    <target name="init" depends="clean">
+        <mkdir dir="classes"/>
+    </target>
+    <target name="clean">
+        <delete dir="classes"/>
+    </target>
+
+    <target depends="init" name="build">
+        <echo message="${ant.project.name}: ${ant.file}"/>
+        <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+            <src path="src"/>
+            <exclude name="**/.svn/**"/>
+            <classpath refid="example.classpath"/>
+        </javac>
+        <copy todir="classes/META-INF">
+            <fileset dir="src/META-INF" includes="*"/>
+        </copy>
+        <copy todir="classes/">
+            <fileset dir="./" includes="jndi.properties"/>
+        </copy>
+        <jar jarfile="employee.jar">
+           <fileset dir="classes" includes="**"/>
+        </jar>
+        <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+            <fileset dir="." includes ="employee.jar"/>
+        </ear>
+    </target>
+
+    <!-- WebLogic ant tasks -->
+    <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+
+    <!-- This creates the server domain. -->
+    <target name="create-cluster">
+        <delete dir="${JEE_DOMAIN}"/>
+        <mkdir dir="${JEE_DOMAIN}"/>
+        <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx1024m"/>
+            <jvmarg value="-XX:MaxPermSize=128m"/>
+        </wlserver>
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <create type="Cluster" name="employee-cluster"/>
+            <query domain="mydomain" type="Cluster" name="employee-cluster" property="cluster"/>
+            <create type="Server" name="server1">
+                <set attribute="ListenPort" value="${JEE_PORT1}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+            <create type="Server" name="server2">
+                <set attribute="ListenPort" value="${JEE_PORT2}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+            <create type="Server" name="server3">
+                <set attribute="ListenPort" value="${JEE_PORT3}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+        </wlconfig>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <copy todir="${JEE_DOMAIN}/lib/" file="${JGROUPS_LIB}"/>
+        <copy todir="${JEE_DOMAIN}/lib/" file="${ECLIPSELINK_EXTENSION_LIB}"/>
+    </target>
+    
+    <!--
+        This target is to create connection pool and managed datasource required for running this JPA example.
+        Note: WLS server must be running.
+    -->
+    <target name="setup-cluster">
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSTopic" name="EmployeeTopic">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="Cluster" name="*" property="cluster"/>
+            <query domain="mydomain" type="Server" name="server1" property="server1"/>
+            <create type="JDBCConnectionPool" name="employeePool">
+                <set attribute="CapacityIncrement" value="2"/>
+                <set attribute="DriverName" value="${DB_DRIVER}"/>
+                <set attribute="InitialCapacity" value="1"/>
+                <set attribute="MaxCapacity" value="50"/>
+                <set attribute="Password" value="${DB_PASSWORD}"/>
+                <set attribute="Properties" value="user=${DB_USER}"/>
+                <set attribute="URL" value="${DB_URL}"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCTxDataSource" name="EmployeeDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCDataSource" name="EmployeeLocalDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+
+            <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+              <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+              <set attribute="XAServerEnabled" value="false"/>
+              <set attribute="Targets" value="${cluster}"/>
+           </create>
+           <create type="JMSServer" name="EmployeeJMSServer">
+              <set attribute="Targets" value="${server1}"/>
+               <create type="JMSTopic" name="EmployeeTopic">
+                  <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+               </create>
+           </create>
+
+        </wlconfig>
+    </target>
+
+    <!-- This start the servers. -->
+    <target name="start-cluster">
+        <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <sleep seconds="30"/>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver-->
+        <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+        <!-- Where as using wlserver above did not seem to -->
+        <delete>
+            <fileset dir="./" includes="server*.log,server*.err"/>
+        </delete>
+        <parallel>
+            <echo message="*** starting WebLogic admin server"/>
+            <java classname="weblogic.Server" 
+                fork="true"
+                failonerror="true">
+                <jvmarg value="-server"/>
+                <jvmarg value="-Xms512m"/>
+                <jvmarg value="-Xmx1024m"/>
+                <jvmarg value="-XX:MaxPermSize=128m"/>
+                <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                <sysproperty key="weblogic.Name" value="admin"/>
+                <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                <sysproperty key="weblogic.Stdout" value="admin.log"/>
+                <sysproperty key="weblogic.Stderr" value="admin.err"/>
+                <classpath>
+                    <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                    <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                </classpath>
+            </java>
+            <sequential>
+                <waitfor>
+                    <socket server="${JEE_HOST}" port="7001"/>
+                </waitfor>
+                <parallel>
+                    <echo message="*** starting managed server: server1 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server1"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server1.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server1.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server2 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server2"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server2.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server2.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server3 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server3"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server3.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server3.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <sequential>
+                        <waitfor>
+                            <and>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+                            </and>
+                        </waitfor>
+                        <sleep seconds="30"/>
+                        <echo message="*** done, do not close/break prompt "/>
+                    </sequential>
+                </parallel>
+            </sequential>
+        </parallel>
+    </target>
+
+    <!-- Stop the servers. -->
+    <target name="stop-cluster">
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+    </target>
+
+    <!--
+        Deploy the application ear to the servers.
+        Note: WLS server must be running.
+    -->
+    <target name="deploy">
+        <wldeploy action="deploy"
+            name="employee" source="employee.ear"
+            user="${JEE_USER}" password="${JEE_PASSWORD}"
+            adminurl="t3://${JEE_HOST}:7001"
+            failonerror="false" targets="employee-cluster">
+        </wldeploy>
+    </target>
+
+    <target name="example">
+        <java classname="example.Transactions" fork="true">
+            <!--jvmarg value="${AGENT}"/-->
+            <classpath refid="example.classpath"/>
+        </java>
+    </target>
+</project>
+
diff --git a/jpa/cachecoordination/build-wls-jms-cluster.xml b/jpa/cachecoordination/build-wls-jms-cluster.xml
new file mode 100755
index 0000000..b53c82c
--- /dev/null
+++ b/jpa/cachecoordination/build-wls-jms-cluster.xml
@@ -0,0 +1,387 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic Cluster using a clustered JMS topic. -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+    <property environment="env"/>
+    <property name="JEE_HOME" value="/scratch/wls/12.1.3"/>
+    <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+    <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+    <!-- localhost may not work, machine name/ip my be required. -->
+    <property name="JEE_HOST" value="localhost"/>
+    <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+    <property name="JEE_PORT1" value="7021"/>
+    <property name="JEE_PORT2" value="7031"/>
+    <property name="JEE_PORT3" value="7041"/>
+    <property name="JEE_DOMAIN" value="./domain"/>
+    <!-- These also need to be defined in the jndi.properties file. -->
+    <property name="JEE_USER" value="weblogic"/>
+    <property name="JEE_PASSWORD" value="welcome1"/>
+    <!-- These need to be updated with your database settings. -->
+    <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+    <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+    <property name="DB_USER" value="scott"/>
+    <property name="DB_PASSWORD" value="tiger"/>
+    <!-- These will differ depending on the version of WebLogic. -->
+    <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+    <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+    <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+    <property name="debuglevel" value="source,lines,vars"/>
+    <path id="example.classpath">
+        <pathelement location="classes"/>
+        <pathelement location="${JPA_LIB}"/>
+        <pathelement location="${EJB_LIB}"/>
+        <pathelement location="${ECLIPSELINK_LIB}"/>
+        <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+    </path>
+    <target name="init" depends="clean">
+        <mkdir dir="classes"/>
+    </target>
+    <target name="clean">
+        <delete dir="classes"/>
+    </target>
+
+    <target depends="init" name="build">
+        <echo message="${ant.project.name}: ${ant.file}"/>
+        <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+            <src path="src"/>
+            <exclude name="**/.svn/**"/>
+            <classpath refid="example.classpath"/>
+        </javac>
+        <copy todir="classes/META-INF">
+            <fileset dir="src/META-INF" includes="*"/>
+        </copy>
+        <copy todir="classes/">
+            <fileset dir="./" includes="jndi.properties"/>
+        </copy>
+        <jar jarfile="employee.jar">
+           <fileset dir="classes" includes="**"/>
+        </jar>
+        <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+            <fileset dir="." includes ="employee.jar"/>
+        </ear>
+    </target>
+
+    <!-- WebLogic ant tasks -->
+    <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+
+    <!-- This creates the server domain. -->
+    <target name="create-cluster">
+        <delete dir="${JEE_DOMAIN}"/>
+        <mkdir dir="${JEE_DOMAIN}"/>
+        <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx1024m"/>
+            <jvmarg value="-XX:MaxPermSize=128m"/>
+        </wlserver>
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <create type="Cluster" name="employee-cluster"/>
+            <query domain="mydomain" type="Cluster" name="employee-cluster" property="cluster"/>
+            <create type="Server" name="server1">
+                <set attribute="ListenPort" value="${JEE_PORT1}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+            <create type="Server" name="server2">
+                <set attribute="ListenPort" value="${JEE_PORT2}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+            <create type="Server" name="server3">
+                <set attribute="ListenPort" value="${JEE_PORT3}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+        </wlconfig>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+    </target>
+    
+    <!--
+        This target is to create connection pool and managed datasource required for running this JPA example.
+        Note: WLS server must be running.
+    -->
+    <target name="setup-cluster">
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSDistributedTopic" name="EmployeeTopic">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer1">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer2">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer3">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="Cluster" name="*" property="cluster"/>
+            <query domain="mydomain" type="Server" name="server1" property="server1"/>
+            <query domain="mydomain" type="Server" name="server2" property="server2"/>
+            <query domain="mydomain" type="Server" name="server3" property="server3"/>
+
+            <create type="JDBCConnectionPool" name="employeePool">
+                <set attribute="CapacityIncrement" value="2"/>
+                <set attribute="DriverName" value="${DB_DRIVER}"/>
+                <set attribute="InitialCapacity" value="1"/>
+                <set attribute="MaxCapacity" value="50"/>
+                <set attribute="Password" value="${DB_PASSWORD}"/>
+                <set attribute="Properties" value="user=${DB_USER}"/>
+                <set attribute="URL" value="${DB_URL}"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCTxDataSource" name="EmployeeDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCDataSource" name="EmployeeLocalDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+
+            <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+                <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+                <set attribute="XAServerEnabled" value="false"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JMSServer" name="EmployeeJMSServer1">
+                <set attribute="Targets" value="${server1}"/>
+            </create>
+            <create type="JMSServer" name="EmployeeJMSServer2">
+                <set attribute="Targets" value="${server2}"/>
+            </create>
+            <create type="JMSServer" name="EmployeeJMSServer3">
+                <set attribute="Targets" value="${server3}"/>
+             </create>
+            <create type="JMSDistributedTopic" name="EmployeeTopic">
+                <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+                <set attribute="LoadBalancingPolicy" value="Random"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+
+        </wlconfig>
+    </target>
+
+    <!-- This start the servers. -->
+    <target name="start-cluster">
+        <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <sleep seconds="30"/>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver-->
+        <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+        <!-- Where as using wlserver above did not seem to -->
+        <delete>
+            <fileset dir="./" includes="server*.log,server*.err"/>
+        </delete>
+        <parallel>
+            <echo message="*** starting WebLogic admin server"/>
+            <java classname="weblogic.Server" 
+                fork="true"
+                failonerror="true">
+                <jvmarg value="-server"/>
+                <jvmarg value="-Xms512m"/>
+                <jvmarg value="-Xmx1024m"/>
+                <jvmarg value="-XX:MaxPermSize=128m"/>
+                <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                <sysproperty key="weblogic.Name" value="admin"/>
+                <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                <sysproperty key="weblogic.Stdout" value="admin.log"/>
+                <sysproperty key="weblogic.Stderr" value="admin.err"/>
+                <classpath>
+                    <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                    <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                </classpath>
+            </java>
+            <sequential>
+                <waitfor>
+                    <socket server="${JEE_HOST}" port="7001"/>
+                </waitfor>
+                <parallel>
+                    <echo message="*** starting managed server: server1 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server1"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server1.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server1.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server2 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server2"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server2.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server2.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server3 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server3"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server3.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server3.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <sequential>
+                        <waitfor>
+                            <and>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+                            </and>
+                        </waitfor>
+                        <sleep seconds="30"/>
+                        <echo message="*** done, do not close/break prompt "/>
+                    </sequential>
+                </parallel>
+            </sequential>
+        </parallel>
+    </target>
+
+    <!-- Stop the servers. -->
+    <target name="stop-cluster">
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+    </target>
+
+    <!--
+        Deploy the application ear to the servers.
+        Note: WLS server must be running.
+    -->
+    <target name="deploy">
+        <wldeploy action="deploy"
+            name="employee" source="employee.ear"
+            user="${JEE_USER}" password="${JEE_PASSWORD}"
+            adminurl="t3://${JEE_HOST}:7001"
+            failonerror="false" targets="employee-cluster">
+        </wldeploy>
+    </target>
+
+    <target name="example">
+        <java classname="example.Transactions" fork="true">
+            <!--jvmarg value="${AGENT}"/-->
+            <classpath refid="example.classpath"/>
+        </java>
+    </target>
+</project>
+
diff --git a/jpa/cachecoordination/build-wls-servers.xml b/jpa/cachecoordination/build-wls-servers.xml
new file mode 100755
index 0000000..af0c1ce
--- /dev/null
+++ b/jpa/cachecoordination/build-wls-servers.xml
@@ -0,0 +1,374 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic domain with independent servers (no clustering). -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+    <property environment="env"/>
+    <property name="JEE_HOME" value="/scratch/wls/12.1.3"/>
+    <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+    <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+    <!-- localhost may not work, machine name/ip my be required. -->
+    <property name="JEE_HOST" value="localhost"/>
+    <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+    <property name="JEE_PORT1" value="7021"/>
+    <property name="JEE_PORT2" value="7031"/>
+    <property name="JEE_PORT3" value="7041"/>
+    <property name="JEE_DOMAIN" value="./domain"/>
+    <!-- These also need to be defined in the jndi.properties file. -->
+    <property name="JEE_USER" value="weblogic"/>
+    <property name="JEE_PASSWORD" value="welcome1"/>
+    <!-- These need to be updated with your database settings. -->
+    <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+    <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+    <property name="DB_USER" value="scott"/>
+    <property name="DB_PASSWORD" value="tiger"/>
+    <!-- These will differ depending on the version of WebLogic. -->
+    <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+    <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+    <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+    <property name="debuglevel" value="source,lines,vars"/>
+    <path id="example.classpath">
+        <pathelement location="classes"/>
+        <pathelement location="${JPA_LIB}"/>
+        <pathelement location="${EJB_LIB}"/>
+        <pathelement location="${ECLIPSELINK_LIB}"/>
+        <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+    </path>
+    <target name="init" depends="clean">
+        <mkdir dir="classes"/>
+    </target>
+    <target name="clean">
+        <delete dir="classes"/>
+    </target>
+
+    <target depends="init" name="build">
+        <echo message="${ant.project.name}: ${ant.file}"/>
+        <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+            <src path="src"/>
+            <exclude name="**/.svn/**"/>
+            <classpath refid="example.classpath"/>
+        </javac>
+        <copy todir="classes/META-INF">
+            <fileset dir="src/META-INF" includes="*"/>
+        </copy>
+        <copy todir="classes/">
+            <fileset dir="./" includes="jndi.properties"/>
+        </copy>
+        <jar jarfile="employee.jar">
+           <fileset dir="classes" includes="**"/>
+        </jar>
+        <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+            <fileset dir="." includes ="employee.jar"/>
+        </ear>
+    </target>
+
+    <!-- WebLogic ant tasks -->
+    <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+
+    <!-- This creates the server domain. -->
+    <target name="create-cluster">
+        <delete dir="${JEE_DOMAIN}"/>
+        <mkdir dir="${JEE_DOMAIN}"/>
+        <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx1024m"/>
+            <jvmarg value="-XX:MaxPermSize=128m"/>
+        </wlserver>
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <create type="Server" name="server1">
+                <set attribute="ListenPort" value="${JEE_PORT1}"/>
+            </create>
+            <create type="Server" name="server2">
+                <set attribute="ListenPort" value="${JEE_PORT2}"/>
+            </create>
+            <create type="Server" name="server3">
+                <set attribute="ListenPort" value="${JEE_PORT3}"/>
+            </create>
+        </wlconfig>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+    </target>
+    
+    <!--
+        This target is to create connection pool and managed datasource required for running this JPA example.
+        Note: WLS server must be running.
+    -->
+    <target name="setup-cluster">
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSTopic" name="EmployeeTopic">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="Server" name="*" property="cluster"/>
+            <query domain="mydomain" type="Server" name="server1" property="server1"/>
+            <create type="JDBCConnectionPool" name="employeePool">
+                <set attribute="CapacityIncrement" value="2"/>
+                <set attribute="DriverName" value="${DB_DRIVER}"/>
+                <set attribute="InitialCapacity" value="1"/>
+                <set attribute="MaxCapacity" value="50"/>
+                <set attribute="Password" value="${DB_PASSWORD}"/>
+                <set attribute="Properties" value="user=${DB_USER}"/>
+                <set attribute="URL" value="${DB_URL}"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCTxDataSource" name="EmployeeDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCDataSource" name="EmployeeLocalDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+
+            <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+              <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+              <set attribute="XAServerEnabled" value="false"/>
+              <set attribute="Targets" value="${cluster}"/>
+           </create>
+           <create type="JMSServer" name="EmployeeJMSServer">
+              <set attribute="Targets" value="${server1}"/>
+               <create type="JMSTopic" name="EmployeeTopic">
+                  <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+               </create>
+           </create>
+
+        </wlconfig>
+    </target>
+
+    <!-- This start the servers. -->
+    <target name="start-cluster">
+        <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <sleep seconds="30"/>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver-->
+        <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+        <!-- Where as using wlserver above did not seem to -->
+        <delete>
+            <fileset dir="./" includes="server*.log,server*.err"/>
+        </delete>
+        <parallel>
+            <echo message="*** starting WebLogic admin server"/>
+            <java classname="weblogic.Server" 
+                fork="true"
+                failonerror="true">
+                <jvmarg value="-server"/>
+                <jvmarg value="-Xms512m"/>
+                <jvmarg value="-Xmx1024m"/>
+                <jvmarg value="-XX:MaxPermSize=128m"/>
+                <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                <sysproperty key="weblogic.Name" value="admin"/>
+                <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                <sysproperty key="weblogic.Stdout" value="admin.log"/>
+                <sysproperty key="weblogic.Stderr" value="admin.err"/>
+                <classpath>
+                    <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                    <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                </classpath>
+            </java>
+            <sequential>
+                <waitfor>
+                    <socket server="${JEE_HOST}" port="7001"/>
+                </waitfor>
+                <parallel>
+                    <echo message="*** starting managed server: server1 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server1"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server1.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server1.err"/>
+                        <!-- When using RMI outside of a cluster, the host URL must be defined, either as a system property, -->
+                        <!-- in the persistence.xml or in code in a SessionCustomizer -->
+                        <sysproperty key="eclipselink.cache.coordination.rmi.url" value="t3://${JEE_HOST}:${JEE_PORT1}/" />
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server2 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server2"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server2.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server2.err"/>
+                        <!-- When using RMI outside of a cluster, the host URL must be defined, either as a system property, -->
+                        <!-- in the persistence.xml or in code in a SessionCustomizer -->
+                        <sysproperty key="eclipselink.cache.coordination.rmi.url" value="t3://${JEE_HOST}:${JEE_PORT2}/" />
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server3 "/>
+                    <java classname="weblogic.Server" 
+                        fork="true"
+                        failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server3"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server3.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server3.err"/>
+                        <!-- When using RMI outside of a cluster, the host URL must be defined, either as a system property, -->
+                        <!-- in the persistence.xml or in code in a SessionCustomizer -->
+                        <sysproperty key="eclipselink.cache.coordination.rmi.url" value="t3://${JEE_HOST}:${JEE_PORT3}/" />
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <sequential>
+                        <waitfor>
+                            <and>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+                            </and>
+                        </waitfor>
+                        <sleep seconds="30"/>
+                        <echo message="*** done, do not close/break prompt "/>
+                    </sequential>
+                </parallel>
+            </sequential>
+        </parallel>
+    </target>
+
+    <!-- Stop the servers. -->
+    <target name="stop-cluster">
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+            dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+            username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+    </target>
+
+    <!--
+        Deploy the application ear to the servers.
+        Note: WLS server must be running.
+    -->
+    <target name="deploy">
+        <wldeploy action="deploy"
+            name="employee" source="employee.ear"
+            user="${JEE_USER}" password="${JEE_PASSWORD}"
+            adminurl="t3://${JEE_HOST}:7001"
+            failonerror="false" targets="server1,server2,server3">
+        </wldeploy>
+    </target>
+
+    <target name="example">
+        <java classname="example.Transactions" fork="true">
+            <!--jvmarg value="${AGENT}"/-->
+            <classpath refid="example.classpath"/>
+        </java>
+    </target>
+</project>
+
diff --git a/jpa/cachecoordination/build.xml b/jpa/cachecoordination/build.xml
new file mode 100755
index 0000000..7d28972
--- /dev/null
+++ b/jpa/cachecoordination/build.xml
@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic Cluster. -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+    <property environment="env"/>
+    <property name="JEE_HOME" value="/scratch/wls/12.1.3"/>
+    <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+    <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+    <!-- localhost may not work, machine name/ip my be required. -->
+    <property name="JEE_HOST" value="localhost"/>
+    <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+    <property name="JEE_PORT1" value="7021"/>
+    <property name="JEE_PORT2" value="7031"/>
+    <property name="JEE_PORT3" value="7041"/>
+    <property name="JEE_DOMAIN" value="./domain"/>
+    <!-- These also need to be defined in the jndi.properties file. -->
+    <property name="JEE_USER" value="weblogic"/>
+    <property name="JEE_PASSWORD" value="welcome1"/>
+    <!-- These need to be updated with your database settings. -->
+    <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+    <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+    <property name="DB_USER" value="scott"/>
+    <property name="DB_PASSWORD" value="tiger"/>
+    <!-- These will differ depending on the version of WebLogic. -->
+    <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+    <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+    <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+    <property name="debuglevel" value="source,lines,vars"/>
+    <path id="example.classpath">
+        <pathelement location="classes"/>
+        <pathelement location="${JPA_LIB}"/>
+        <pathelement location="${EJB_LIB}"/>
+        <pathelement location="${ECLIPSELINK_LIB}"/>
+        <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+    </path>
+    <target name="init" depends="clean">
+        <mkdir dir="classes"/>
+    </target>
+    <target name="clean">
+        <delete dir="classes"/>
+    </target>
+
+    <target depends="init" name="build">
+        <echo message="${ant.project.name}: ${ant.file}"/>
+        <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+            <src path="src"/>
+            <exclude name="**/.svn/**"/>
+            <classpath refid="example.classpath"/>
+        </javac>
+        <copy todir="classes/META-INF">
+            <fileset dir="src/META-INF" includes="*"/>
+        </copy>
+        <copy todir="classes/">
+            <fileset dir="./" includes="jndi.properties"/>
+        </copy>
+        <jar jarfile="employee.jar">
+            <fileset dir="classes" includes="**"/>
+        </jar>
+        <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+            <fileset dir="." includes ="employee.jar"/>
+        </ear>
+    </target>
+
+    <!-- WebLogic ant tasks -->
+    <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+    <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+        <classpath>
+            <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+        </classpath>
+    </taskdef>
+
+    <!-- This creates the server domain. -->
+    <target name="create-cluster">
+        <delete dir="${JEE_DOMAIN}"/>
+        <mkdir dir="${JEE_DOMAIN}"/>
+        <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+                  dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+                  username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx1024m"/>
+            <jvmarg value="-XX:MaxPermSize=128m"/>
+        </wlserver>
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <create type="Cluster" name="employee-cluster"/>
+            <query domain="mydomain" type="Cluster" name="employee-cluster" property="cluster"/>
+            <create type="Server" name="server1">
+                <set attribute="ListenPort" value="${JEE_PORT1}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+            <create type="Server" name="server2">
+                <set attribute="ListenPort" value="${JEE_PORT2}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+            <create type="Server" name="server3">
+                <set attribute="ListenPort" value="${JEE_PORT3}"/>
+                <set attribute="Cluster" value="${cluster}"/>
+            </create>
+        </wlconfig>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+                  dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+                  username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+    </target>
+
+    <!--
+        This target is to create connection pool and managed datasource required for running this JPA example.
+        Note: WLS server must be running.
+    -->
+    <target name="setup-cluster">
+        <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+            <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSTopic" name="EmployeeTopic">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer">
+                <delete/>
+            </query>
+            <query domain="mydomain" type="Cluster" name="*" property="cluster"/>
+            <query domain="mydomain" type="Server" name="server1" property="server1"/>
+            <create type="JDBCConnectionPool" name="employeePool">
+                <set attribute="CapacityIncrement" value="2"/>
+                <set attribute="DriverName" value="${DB_DRIVER}"/>
+                <set attribute="InitialCapacity" value="1"/>
+                <set attribute="MaxCapacity" value="50"/>
+                <set attribute="Password" value="${DB_PASSWORD}"/>
+                <set attribute="Properties" value="user=${DB_USER}"/>
+                <set attribute="URL" value="${DB_URL}"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCTxDataSource" name="EmployeeDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JDBCDataSource" name="EmployeeLocalDS">
+                <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+                <set attribute="PoolName" value="employeePool"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+
+            <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+                <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+                <set attribute="XAServerEnabled" value="false"/>
+                <set attribute="Targets" value="${cluster}"/>
+            </create>
+            <create type="JMSServer" name="EmployeeJMSServer">
+                <set attribute="Targets" value="${server1}"/>
+                <create type="JMSTopic" name="EmployeeTopic">
+                    <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+                </create>
+            </create>
+
+        </wlconfig>
+    </target>
+
+    <!-- This start the servers. -->
+    <target name="start-cluster">
+        <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <sleep seconds="30"/>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver>
+        <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+                dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+                username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+            <classpath>
+                <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+            </classpath>
+            <jvmarg value="-Xms512m"/>
+            <jvmarg value="-Xmx960m"/>
+        </wlserver-->
+        <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+        <!-- Where as using wlserver above did not seem to -->
+        <delete>
+            <fileset dir="./" includes="server*.log,server*.err"/>
+        </delete>
+        <parallel>
+            <echo message="*** starting WebLogic admin server"/>
+            <java classname="weblogic.Server"
+                  fork="true"
+                  failonerror="true">
+                <jvmarg value="-server"/>
+                <jvmarg value="-Xms512m"/>
+                <jvmarg value="-Xmx1024m"/>
+                <jvmarg value="-XX:MaxPermSize=128m"/>
+                <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                <sysproperty key="weblogic.Name" value="admin"/>
+                <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                <sysproperty key="weblogic.Stdout" value="admin.log"/>
+                <sysproperty key="weblogic.Stderr" value="admin.err"/>
+                <classpath>
+                    <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                    <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                </classpath>
+            </java>
+            <sequential>
+                <waitfor>
+                    <socket server="${JEE_HOST}" port="7001"/>
+                </waitfor>
+                <parallel>
+                    <echo message="*** starting managed server: server1 "/>
+                    <java classname="weblogic.Server"
+                          fork="true"
+                          failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server1"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server1.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server1.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server2 "/>
+                    <java classname="weblogic.Server"
+                          fork="true"
+                          failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server2"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server2.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server2.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <echo message="*** starting managed server: server3 "/>
+                    <java classname="weblogic.Server"
+                          fork="true"
+                          failonerror="true">
+                        <jvmarg value="-server"/>
+                        <jvmarg value="-Xms512m"/>
+                        <jvmarg value="-Xmx1024m"/>
+                        <jvmarg value="-XX:MaxPermSize=128m"/>
+                        <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+                        <sysproperty key="weblogic.Name" value="server3"/>
+                        <sysproperty key="bea.home" value="${JEE_HOME}"/>
+                        <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+                        <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+                        <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+                        <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+                        <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+                        <sysproperty key="weblogic.Stdout" value="server3.log"/>
+                        <sysproperty key="weblogic.Stderr" value="server3.err"/>
+                        <classpath>
+                            <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+                            <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+                        </classpath>
+                    </java>
+                    <sequential>
+                        <waitfor>
+                            <and>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+                                <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+                            </and>
+                        </waitfor>
+                        <sleep seconds="30"/>
+                        <echo message="*** done, do not close/break prompt "/>
+                    </sequential>
+                </parallel>
+            </sequential>
+        </parallel>
+    </target>
+
+    <!-- Stop the servers. -->
+    <target name="stop-cluster">
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+                  dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+                  username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+                  dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+                  username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+                  dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+                  username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+        <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+                  dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+                  username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+        </wlserver>
+    </target>
+
+    <!--
+        Deploy the application ear to the servers.
+        Note: WLS server must be running.
+    -->
+    <target name="deploy">
+        <wldeploy action="deploy"
+                  name="employee" source="employee.ear"
+                  user="${JEE_USER}" password="${JEE_PASSWORD}"
+                  adminurl="t3://${JEE_HOST}:7001"
+                  failonerror="false" targets="employee-cluster">
+        </wldeploy>
+    </target>
+
+    <target name="example">
+        <java classname="example.Transactions" fork="true">
+            <!--jvmarg value="${AGENT}"/-->
+            <classpath refid="example.classpath"/>
+        </java>
+    </target>
+</project>
+
diff --git a/jpa/cachecoordination/jndi.properties b/jpa/cachecoordination/jndi.properties
new file mode 100755
index 0000000..a182a38
--- /dev/null
+++ b/jpa/cachecoordination/jndi.properties
@@ -0,0 +1,7 @@
+java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
+java.naming.security.principal=weblogic
+java.naming.security.credentials=welcome1
+java.naming.security.authentication=none
+
+
+
diff --git a/jpa/cachecoordination/src/META-INF/application.xml b/jpa/cachecoordination/src/META-INF/application.xml
new file mode 100755
index 0000000..31e27b1
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/application.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application xmlns="http://java.sun.com/xml/ns/javaee"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+        http://java.sun.com/xml/ns/javaee/application_5.xsd"
+          version="5">
+    <description>employee</description>
+    <display-name>employee</display-name>
+    <module>
+        <ejb>employee.jar</ejb>
+    </module>
+</application>
diff --git a/jpa/cachecoordination/src/META-INF/jgroups-udp-config.xml b/jpa/cachecoordination/src/META-INF/jgroups-udp-config.xml
new file mode 100755
index 0000000..b15be2f
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/jgroups-udp-config.xml
@@ -0,0 +1,78 @@
+
+<!--
+  Default stack using IP multicasting. It is similar to the "udp"
+  stack in stacks.xml, but doesn't use streaming state transfer and flushing
+  author: Bela Ban
+-->
+
+<config xmlns="urn:org:jgroups"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups.xsd">
+    <UDP
+         mcast_port="${jgroups.udp.mcast_port:45588}"
+         ip_ttl="0"
+         tos="8"
+         ucast_recv_buf_size="5M"
+         ucast_send_buf_size="5M"
+         mcast_recv_buf_size="5M"
+         mcast_send_buf_size="5M"
+         max_bundle_size="64K"
+         max_bundle_timeout="30"
+         enable_diagnostics="true"
+         thread_naming_pattern="cl"
+
+         timer_type="new3"
+         timer.min_threads="2"
+         timer.max_threads="4"
+         timer.keep_alive_time="3000"
+         timer.queue_max_size="500"
+
+         thread_pool.enabled="true"
+         thread_pool.min_threads="2"
+         thread_pool.max_threads="8"
+         thread_pool.keep_alive_time="5000"
+         thread_pool.queue_enabled="true"
+         thread_pool.queue_max_size="10000"
+         thread_pool.rejection_policy="discard"
+
+         oob_thread_pool.enabled="true"
+         oob_thread_pool.min_threads="1"
+         oob_thread_pool.max_threads="8"
+         oob_thread_pool.keep_alive_time="5000"
+         oob_thread_pool.queue_enabled="false"
+         oob_thread_pool.queue_max_size="100"
+         oob_thread_pool.rejection_policy="discard"/>
+
+    <PING />
+    <MERGE3 max_interval="30000"
+            min_interval="10000"/>
+    <FD_SOCK/>
+    <FD_ALL/>
+    <VERIFY_SUSPECT timeout="1500"  />
+    <BARRIER />
+    <pbcast.NAKACK2 xmit_interval="500"
+                    xmit_table_num_rows="100"
+                    xmit_table_msgs_per_row="2000"
+                    xmit_table_max_compaction_time="30000"
+                    max_msg_batch_size="500"
+                    use_mcast_xmit="false"
+                    discard_delivered_msgs="true"/>
+    <UNICAST3 xmit_interval="500"
+              xmit_table_num_rows="100"
+              xmit_table_msgs_per_row="2000"
+              xmit_table_max_compaction_time="60000"
+              conn_expiry_timeout="0"
+              max_msg_batch_size="500"/>
+    <pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000"
+                   max_bytes="4M"/>
+    <pbcast.GMS print_local_addr="true" join_timeout="2000"
+                view_bundling="true"/>
+    <UFC max_credits="2M"
+         min_threshold="0.4"/>
+    <MFC max_credits="2M"
+         min_threshold="0.4"/>
+    <FRAG2 frag_size="60K"  />
+    <RSVP resend_interval="2000" timeout="10000"/>
+    <pbcast.STATE_TRANSFER />
+    <!-- pbcast.FLUSH  /-->
+</config>
diff --git a/jpa/cachecoordination/src/META-INF/orm.xml b/jpa/cachecoordination/src/META-INF/orm.xml
new file mode 100755
index 0000000..71d5f0f
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/orm.xml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings version="1.0" xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd">
+    <description>Employee model</description>
+    <entity name="Employee" class="model.Employee" access="FIELD">
+        <table name="P_EMPLOYEE"/>
+        <sequence-generator name="EMP_SEQ" sequence-name="EMP_SEQ" allocation-size="48"/>
+        <attributes>
+            <id name="id">
+                <column name="EMP_ID"/>
+                <generated-value strategy="SEQUENCE" generator="EMP_SEQ"/>
+            </id>
+            <basic name="firstName">
+                <column name="F_NAME"/>
+            </basic>
+            <basic name="lastName">
+                <column name="L_NAME"/>
+            </basic>
+            <basic name="gender">
+                <column name="GENDER"/>
+            </basic>
+            <basic name="salary">
+                <column name="SALARY"/>
+            </basic>
+            <version name="version">
+                <column name="VERSION"/>
+            </version>
+            <many-to-one name="manager" target-entity="model.Employee" fetch="LAZY">
+                <join-column name="MANAGER_ID" referenced-column-name="EMP_ID"/>
+                <cascade>
+                    <cascade-persist/>
+                </cascade>
+            </many-to-one>
+            <one-to-many name="phoneNumbers" target-entity="model.PhoneNumber" mapped-by="owner">
+                <cascade>
+                    <cascade-all/>
+                </cascade>
+            </one-to-many>
+            <one-to-many name="managedEmployees" target-entity="model.Employee" mapped-by="manager">
+                <cascade>
+                    <cascade-persist/>
+                </cascade>
+            </one-to-many>
+            <one-to-one name="address" target-entity="model.Address" fetch="LAZY">
+                <join-column name="ADDR_ID"/>
+                <cascade>
+                    <cascade-all/>
+                </cascade>
+            </one-to-one>
+            <many-to-many name="projects" target-entity="model.Project">
+                <join-table name="P_PROJ_EMP">
+                    <join-column name="EMP_ID" referenced-column-name="EMP_ID"/>
+                    <inverse-join-column name="PROJ_ID" referenced-column-name="PROJ_ID"/>
+                </join-table>
+                <cascade>
+                    <cascade-persist/>
+                </cascade>
+            </many-to-many>
+            <embedded name="period"/>
+        </attributes>
+    </entity>
+    <entity name="Address" class="model.Address" access="FIELD">
+        <table name="P_ADDRESS"/>
+        <sequence-generator name="ADDRESS_SEQ" sequence-name="ADDRESS_SEQ" allocation-size="48"/>
+        <named-query name="findAddressByCity">
+            <query>Select a from Address a where a.city = :city</query>
+        </named-query>
+        <named-query name="findAddressByStreet">
+            <query>Select a from Address a where a.street = :street</query>
+        </named-query>
+        <attributes>
+            <id name="id">
+                <column name="ADDRESS_ID"/>
+                <generated-value strategy="SEQUENCE" generator="ADDRESS_SEQ"/>
+            </id>
+            <basic name="postalCode">
+                <column name="P_CODE"/>
+            </basic>
+            <basic name="street">
+                <column name="STREET"/>
+            </basic>
+            <basic name="city">
+                <column name="CITY"/>
+            </basic>
+            <basic name="province">
+                <column name="PROVINCE"/>
+            </basic>
+            <basic name="country">
+                <column name="COUNTRY"/>
+            </basic>
+        </attributes>
+    </entity>
+    <entity name="PhoneNumber" class="model.PhoneNumber" access="FIELD">
+        <table name="P_PHONE"/>
+        <sequence-generator name="PHONE_SEQ" sequence-name="PHONE_SEQ" allocation-size="48"/>
+        <attributes>
+            <id name="id">
+                <column name="PHONE_ID"/>
+                <generated-value strategy="SEQUENCE" generator="PHONE_SEQ"/>
+            </id>
+            <basic name="type">
+                <column name="TYPE"/>
+            </basic>
+            <basic name="number">
+                <column name="P_NUMBER"/>
+            </basic>
+            <basic name="areaCode">
+                <column name="AREA_CODE"/>
+            </basic>
+            <many-to-one name="owner" target-entity="model.Employee" fetch="LAZY">
+                <join-column name="EMP_ID" referenced-column-name="EMP_ID"/>
+            </many-to-one>
+        </attributes>
+    </entity>
+    <entity name="LargeProject" class="model.LargeProject" access="FIELD">
+        <table name="P_LPROJECT"/>
+        <discriminator-value>L</discriminator-value>
+        <attributes>
+            <basic name="budget">
+                <column name="BUDGET"/>
+            </basic>
+            <basic name="milestoneVersion">
+                <column name="MILESTONE"/>
+            </basic>
+        </attributes>
+    </entity>
+    <entity name="SmallProject" class="model.SmallProject" access="FIELD">
+        <table name="P_SPROJECT"/>
+        <discriminator-value>S</discriminator-value>
+    </entity>
+    <entity name="Project" class="model.Project" access="FIELD">
+        <table name="P_PROJECT"/>
+        <inheritance strategy="JOINED"/>
+        <discriminator-value>P</discriminator-value>
+        <discriminator-column name="PROJ_TYPE"/>
+        <sequence-generator name="PROJ_SEQ" sequence-name="PROJ_SEQ" allocation-size="48"/>
+        <attributes>
+            <id name="id">
+                <column name="PROJ_ID"/>
+                <generated-value strategy="SEQUENCE" generator="PROJ_SEQ"/>
+            </id>
+            <basic name="name">
+                <column name="PROJ_NAME"/>
+            </basic>
+            <basic name="description">
+                <column name="DESCRIP"/>
+            </basic>
+            <version name="version">
+                <column name="VERSION"/>
+            </version>
+            <many-to-one name="teamLeader" target-entity="model.Employee" fetch="LAZY">
+                <join-column name="LEADER_ID"/>
+            </many-to-one>
+        </attributes>
+    </entity>
+    <embeddable class="model.EmploymentPeriod" access="FIELD">
+        <attributes>
+            <basic name="startDate">
+                <column name="START_DATE"/>
+            </basic>
+            <basic name="endDate">
+                <column name="END_DATE"/>
+            </basic>
+        </attributes>
+    </embeddable>
+</entity-mappings>
diff --git a/jpa/cachecoordination/src/META-INF/persistence-wls-jgroups.xml b/jpa/cachecoordination/src/META-INF/persistence-wls-jgroups.xml
new file mode 100755
index 0000000..fe8cbf9
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence-wls-jgroups.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+        version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+    <persistence-unit name="employee" transaction-type="JTA">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+        <properties>
+            <!-- Configure the JEE server platform. -->
+            <property name="eclipselink.target-server" value="weblogic" />
+
+            <!-- The database platform is auto-detected by default,
+                 if you want to set a specific platform this can be set. -->
+            <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+            <!-- Configure cache size. -->
+            <!--
+                Full is used for this example to ensure nothing garbage collects,
+                but is not a good practice in general Soft, SoftCache or HardCache are best
+            -->
+            <property name="eclipselink.cache.type.default" value="Full" />
+            <property name="eclipselink.cache.size.default" value="1000" />
+
+            <property name="eclipselink.cache.coordination.protocol" value="jgroups" />
+            
+            <!-- additional JGroups configuration may be passed if needed -->
+            <property name="eclipselink.cache.coordination.jgroups.config" value="META-INF/jgroups-udp-config.xml" />
+
+            <!-- Configure database to be created on startup if not already existing. -->
+            <property name="eclipselink.ddl-generation" value="create-tables" />
+
+            <!-- Configure logging for demonstration. -->
+            <property name="eclipselink.logging.logger" value="DefaultLogger" />
+            <property name="eclipselink.logging.level" value="FINEST" />
+        </properties>
+    </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/META-INF/persistence-wls-jms-cluster.xml b/jpa/cachecoordination/src/META-INF/persistence-wls-jms-cluster.xml
new file mode 100755
index 0000000..488adde
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence-wls-jms-cluster.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+        version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+    <persistence-unit name="employee" transaction-type="JTA">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+        <properties>
+            <!-- Configure the JEE server platform. -->
+            <property name="eclipselink.target-server" value="weblogic" />
+
+            <!-- The database platform is auto-detected by default,
+                 if you want to set a specific platform this can be set. -->
+            <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+            <!-- Configure cache size. -->
+            <!--
+                Full is used for this example to ensure nothing garbage collects,
+                but is not a good practice in general Soft, SoftCache or HardCache are best
+            -->
+            <property name="eclipselink.cache.type.default" value="Full" />
+            <property name="eclipselink.cache.size.default" value="1000" />
+
+            <property name="eclipselink.cache.coordination.protocol" value="jms" />
+            <property name="eclipselink.cache.coordination.jms.topic" value="jms/EmployeeTopic" />
+            <property name="eclipselink.cache.coordination.jms.factory" value="jms/EmployeeTopicConnectionFactory" />
+            <!-- As of EclipseLink 2.2 the url is not required for a cluster with a distrubted topic. -->
+            <!-- Outside of a cluster, or previous to EclipseLink 2.2, a url must be given.
+                 localhost may not work, machine name/ip may be required.
+            -->
+            <!--property name="eclipselink.cache.coordination.jms.host" value="t3://localhost:7021/" /-->
+            <!-- user/password should not be required -->
+            <!--property name="eclipselink.cache.coordination.jndi.user" value="weblogic" />
+            <property name="eclipselink.cache.coordination.jndi.password" value="welcome1" /-->
+
+            <!-- Configure database to be created on startup if not already existing. -->
+            <property name="eclipselink.ddl-generation" value="create-tables" />
+
+            <!-- Configure logging for demonstration. -->
+            <property name="eclipselink.logging.logger" value="DefaultLogger" />
+            <property name="eclipselink.logging.level" value="FINEST" />
+        </properties>
+    </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/META-INF/persistence-wls-jms.xml b/jpa/cachecoordination/src/META-INF/persistence-wls-jms.xml
new file mode 100755
index 0000000..5ee40c5
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence-wls-jms.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+        version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+    <persistence-unit name="employee" transaction-type="JTA">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+        <properties>
+            <!-- Configure the JEE server platform. -->
+            <property name="eclipselink.target-server" value="weblogic" />
+
+            <!-- The database platform is auto-detected by default,
+                 if you want to set a specific platform this can be set. -->
+            <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+            <!-- Configure cache size. -->
+            <!--
+                Full is used for this example to ensure nothing garbage collects,
+                but is not a good practice in general Soft, SoftCache or HardCache are best
+            -->
+            <property name="eclipselink.cache.type.default" value="Full" />
+            <property name="eclipselink.cache.size.default" value="1000" />
+
+            <property name="eclipselink.cache.coordination.protocol" value="jms" />
+            <property name="eclipselink.cache.coordination.jms.topic" value="jms/EmployeeTopic" />
+            <property name="eclipselink.cache.coordination.jms.factory" value="jms/EmployeeTopicConnectionFactory" />
+            <!-- localhost may not work, full machine name or ip my be required, as is required if running on multiple machines -->
+            <property name="eclipselink.cache.coordination.jms.host" value="t3://localhost:7021/" />
+            <!-- user/password should not be required -->
+            <!--property name="eclipselink.cache.coordination.jndi.user" value="weblogic" />
+            <property name="eclipselink.cache.coordination.jndi.password" value="welcome1" /-->
+
+            <!-- Configure database to be created on startup if not already existing. -->
+            <property name="eclipselink.ddl-generation" value="create-tables" />
+
+            <!-- Configure logging for demonstration. -->
+            <property name="eclipselink.logging.logger" value="DefaultLogger" />
+            <property name="eclipselink.logging.level" value="FINEST" />
+        </properties>
+    </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/META-INF/persistence-wls-rmi.xml b/jpa/cachecoordination/src/META-INF/persistence-wls-rmi.xml
new file mode 100755
index 0000000..20c70d9
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence-wls-rmi.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+        version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+    <persistence-unit name="employee" transaction-type="JTA">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+        <properties>
+            <!-- Configure the JEE server platform. -->
+            <property name="eclipselink.target-server" value="weblogic" />
+
+            <!-- 
+                 The database platform is auto-detected by default,
+                 if you want to set a specific platform this can be set.
+            -->
+            <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+            <!-- Configure cache size. -->
+            <!--
+                Full is used for this example to ensure nothing garbage collects,
+                but is not a good practice in general Soft, SoftCache or HardCache are best
+            -->
+            <property name="eclipselink.cache.type.default" value="Full" />
+            <property name="eclipselink.cache.size.default" value="1000" />
+
+            <property name="eclipselink.cache.coordination.protocol" value="rmi" />
+            <!-- As of EclipseLink 2.2 the url is not required for a cluster, as JNDI is replicated in a WLS cluster, so the local JNDI is sufficient -->
+            <!-- Outside of a cluster, or previous to EclipseLink 2.2, a url must be given,
+                 this should be the local server's url, but in a cluster could be any server's url, or use localhost (because JNDI is replicated).
+                 This can also be set as a System property, or using a SessionCustomizer, which avoids having a persistence.xml per server.
+                 localhost may not work, machine name/ip may be required.
+            -->
+            <!--property name="eclipselink.cache.coordination.rmi.url" value="t3://localhost:7021/" /-->
+
+            <!-- user/password should not be required -->
+            <!--property name="eclipselink.cache.coordination.jndi.user" value="weblogic" />
+            <property name="eclipselink.cache.coordination.jndi.password" value="welcome1" /-->
+
+            <!-- The following properties are not required, these are the defaults, but they could be configured if required. -->
+            <!--property name="eclipselink.cache.coordination.rmi.announcement-delay" value="1000" />
+            <property name="eclipselink.cache.coordination.rmi.multicast-group" value="239.192.0.0" />
+            <property name="eclipselink.cache.coordination.rmi.multicast-group.port" value="3121" />
+            <property name="eclipselink.cache.coordination.packet-time-to-live" value="2" /-->
+
+            <!-- Configure database to be created on startup if not already existing. -->
+            <property name="eclipselink.ddl-generation" value="create-tables" />
+
+            <!-- Configure logging for demonstration. -->
+            <property name="eclipselink.logging.logger" value="DefaultLogger" />
+            <property name="eclipselink.logging.level" value="FINEST" />
+        </properties>
+    </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/META-INF/persistence.xml b/jpa/cachecoordination/src/META-INF/persistence.xml
new file mode 100755
index 0000000..0362949
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+             version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+    <persistence-unit name="employee" transaction-type="JTA">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+        <properties>
+            <!-- Configure the JEE server platform. -->
+            <property name="eclipselink.target-server" value="weblogic" />
+
+            <!-- The database platform is auto-detected by default,
+                 if you want to set a specific platform this can be set. -->
+            <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+            <!-- Configure cache size. -->
+            <!--
+                Full is used for this example to ensure nothing garbage collects,
+                but is not a good practice in general Soft, SoftCache or HardCache are best
+            -->
+            <property name="eclipselink.cache.type.default" value="Full" />
+            <property name="eclipselink.cache.size.default" value="1000" />
+
+            <property name="eclipselink.cache.coordination.protocol" value="jms" />
+            <property name="eclipselink.cache.coordination.jms.topic" value="jms/EmployeeTopic" />
+            <property name="eclipselink.cache.coordination.jms.factory" value="jms/EmployeeTopicConnectionFactory" />
+            <!-- localhost may not work, full machine name or ip my be required, as is required if running on multiple machines -->
+            <property name="eclipselink.cache.coordination.jms.host" value="t3://localhost:7021/" />
+            <!-- user/password should not be required -->
+            <!--property name="eclipselink.cache.coordination.jndi.user" value="weblogic" />
+            <property name="eclipselink.cache.coordination.jndi.password" value="welcome1" /-->
+
+            <!-- Configure database to be created on startup if not already existing. -->
+            <property name="eclipselink.ddl-generation" value="create-tables" />
+
+            <!-- Configure logging for demonstration. -->
+            <property name="eclipselink.logging.logger" value="DefaultLogger" />
+            <property name="eclipselink.logging.level" value="FINEST" />
+        </properties>
+    </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/example/Transactions.java b/jpa/cachecoordination/src/example/Transactions.java
new file mode 100755
index 0000000..5d37963
--- /dev/null
+++ b/jpa/cachecoordination/src/example/Transactions.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     James Sutherland - initial impl
+ ******************************************************************************/  
+ package example;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.rmi.PortableRemoteObject;
+
+import model.*;
+
+/**
+ * This example processes updates to the same employee on different nodes in the cluster.
+ */
+public class Transactions {
+    private List<String> serverURLs;
+    private int server = 0;
+
+    public static void main(String[] args) throws Exception {
+        Transactions transactions = new Transactions();
+        transactions.updateEmployee();
+    }
+    
+    public Transactions() {
+        this.serverURLs = new ArrayList<String>();
+        // localhost may not work, machine name/ip may be required.
+        this.serverURLs.add("t3://localhost:7021/");
+        this.serverURLs.add("t3://localhost:7031/");
+        this.serverURLs.add("t3://localhost:7041/");
+    }
+
+    /**
+     * Return the next server index to use.
+     * This cycles through the servers.
+     */
+    public int nextServer() {
+        this.server++;
+        if (this.server >= this.serverURLs.size()) {
+            this.server = 0;
+        }
+        return this.server;
+    }
+
+    public EmployeeService nextEmployeeService() {
+        EmployeeService service = null;
+        int server = nextServer();
+        Properties properties = new Properties();
+        String url = this.serverURLs.get(server);
+        properties.put("java.naming.provider.url", url);
+        System.out.println("Connecting to server:" + url);
+        try {
+            Context context = new InitialContext(properties);
+            service = (EmployeeService)PortableRemoteObject.narrow(context.lookup("EmployeeService#model.EmployeeService"), EmployeeService.class);
+        } catch (Exception notFoundException) {
+            throw new Error("Lookup failed, verify lookup string is correct for your JEE server, and that deploy was successful.", notFoundException);
+        }
+        return service;
+    }
+
+    /**
+     * Update the same employee on each server.
+     */
+    public void updateEmployee() throws Exception {
+        try {
+            Employee employee = null;
+            System.out.println("Populating database.");
+            EmployeeService service = nextEmployeeService();
+            service.setup();
+            System.out.println("Preloading cache on all servers.");
+            for (int index = 0; index < 3; index++) {
+                System.out.println("Looking up next EmployeeServer.");
+                service = nextEmployeeService();
+                System.out.println("Loading all Employees into cache.");
+                employee = service.findAll().get(0);
+            }
+            System.out.println("Preloading done.");
+            Thread.sleep(5000);
+            System.out.println("Updating employee on each server.");
+            for (int index = 0; index < 10; index++) {
+                System.out.println("Looking up next EmployeeServer.");
+                service = nextEmployeeService();
+                int random = (int)(Math.random() * 1000000);
+                System.out.println("Finding employee: " + employee.getId());
+                employee = service.findById(employee.getId());
+                System.out.println("Employee name was: " + employee.getFirstName() + " " + employee.getLastName());
+                employee.setFirstName(String.valueOf(random));
+                employee.setLastName(String.valueOf(random));
+                employee.setSalary(random);
+                try {
+                    System.out.println("Updating employee: " + employee.getId());
+                    service.update(employee);
+                    System.out.println("Employee name updated to: " + employee.getFirstName() + " " + employee.getLastName());
+                    Thread.sleep(500);
+                } catch (Exception exception) {
+                    System.out.println("Updating failed (cache coordination has not yet occurred, increase sleep time).");
+                    System.out.println(exception.toString());
+                }
+            }
+        } catch (Exception error) {
+            error.printStackTrace();
+            throw error;
+        }
+    }
+}
diff --git a/jpa/cachecoordination/src/model/Address.java b/jpa/cachecoordination/src/model/Address.java
new file mode 100755
index 0000000..27799cf
--- /dev/null
+++ b/jpa/cachecoordination/src/model/Address.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/  
+package model;
+
+import java.io.*;
+
+/**
+ * <p><b>Purpose</b>: Represents the mailing address on an Employee
+ * <p><b>Description</b>: Held in a private 1:1 relationship from Employee
+ * @see Employee
+ */
+public class Address implements Serializable {
+    protected long id;
+    protected String street;
+    protected String city;
+    protected String province;
+    protected String postalCode;
+    protected String country;
+
+    public Address() {
+        this.city = "";
+        this.province = "";
+        this.postalCode = "";
+        this.street = "";
+        this.country = "";
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public String getCountry() {
+        return country;
+    }
+
+    /**
+     * Return the persistent identifier of the receiver.
+     */
+    public long getId() {
+        return id;
+    }
+
+    public String getPostalCode() {
+        return postalCode;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public String getStreet() {
+        return street;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    /**
+     * Set the persistent identifier of the receiver.
+     */
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public void setPostalCode(String postalCode) {
+        this.postalCode = postalCode;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public void internalSetStreet(String street) {
+        this.street = street;
+    }
+    
+    public void setStreet(String street) {
+        this.street = street;
+    }
+
+    /**
+     * Print the address city and province.
+     */
+    public String toString() {
+        StringWriter writer = new StringWriter();
+
+        writer.write("Address: ");
+        writer.write(getStreet());
+        writer.write(", ");
+        writer.write(getCity());
+        writer.write(", ");
+        writer.write(getProvince());
+        writer.write(", ");
+        writer.write(getCountry());
+        return writer.toString();
+    }
+}
diff --git a/jpa/cachecoordination/src/model/Employee.java b/jpa/cachecoordination/src/model/Employee.java
new file mode 100755
index 0000000..8b0da14
--- /dev/null
+++ b/jpa/cachecoordination/src/model/Employee.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/  
+package model;
+
+import java.util.*;
+import java.io.*;
+
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.QueryHint;
+
+import org.eclipse.persistence.config.QueryHints;
+
+/**
+ * <p><b>Purpose</b>: Represent a employee of an organization.
+ * <p><b>Description</b>: An Employee is a root object in the Employee Demo.
+ * It maintains relationships to all of the other objects in the system.
+ */
+public class Employee implements Serializable {
+
+    protected long id;    
+    protected long version;
+    protected String firstName;
+    protected String lastName;
+    protected String gender;
+    protected EmploymentPeriod period;
+    protected Address address;
+    protected Employee manager;
+    protected Collection managedEmployees;
+    protected Collection phoneNumbers;
+    protected Collection projects;
+    protected int salary;
+
+    public Employee() {
+        this.firstName = "";
+        this.lastName = "";
+        this.managedEmployees = new HashSet();
+        this.projects = new HashSet();
+        this.phoneNumbers = new HashSet();
+    }
+
+    /**
+     * For bi-directional relationships, it is important to maintain both sides of the relationship when changing it.
+     */
+    public void addManagedEmployee(Employee employee) {
+        getManagedEmployees().add(employee);
+        employee.setManager(this);
+    }
+
+    /**
+     * For bi-directional relationships, it is important to maintain both sides of the relationship when changing it.
+     */
+    public void addPhoneNumber(PhoneNumber phoneNumber) {
+        getPhoneNumbers().add(phoneNumber);
+        phoneNumber.setOwner(this);
+    }
+
+    public void addProject(Project project) {
+        getProjects().add(project);
+    }
+
+    public Address getAddress() {
+        return address;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public String getGender() {
+        return gender;
+    }
+
+    /**
+     * Return the persistent identifier of the receiver.
+     */
+    public long getId() {
+        return id;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public Collection getManagedEmployees() {
+        return managedEmployees;
+    }
+
+    public Employee getManager() {
+        return manager;
+    }
+
+    public EmploymentPeriod getPeriod() {
+        return period;
+    }
+
+    public Collection getPhoneNumbers() {
+        return phoneNumbers;
+    }
+
+    public Collection getProjects() {
+        return projects;
+    }
+
+    public int getSalary() {
+        return salary;
+    }
+    
+    public long getVersion() {
+        return version;
+    }
+
+    public void removeManagedEmployee(Employee employee) {
+        getManagedEmployees().remove(employee);
+        employee.setManager(null);
+    }
+
+    /**
+     * Remove the phone number.
+     * The phone number's owner must not be set to null as it is part of it primary key,
+     * and you can never change the primary key of an existing object.
+     * Only in independent relationships should you null out the back reference.
+     */
+    public void removePhoneNumber(PhoneNumber phoneNumber) {
+        getPhoneNumbers().remove(phoneNumber);
+    }
+
+    public void removeProject(Project project) {
+        getProjects().remove(project);
+    }
+
+    public void setAddress(Address address) {
+        this.address = address;
+    }
+
+    public void setFemale() {
+        setGender("Female");
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    /**
+     * Set the persistent identifier of the receiver.
+     * Note this should never be changed.
+     * Consider making the primary key set methods protected or not having them.
+     * In this demo the setId is required for testing purposes.
+     */
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public void setMale() {
+        setGender("Male");
+    }
+
+    public void setManagedEmployees(Collection managedEmployees) {
+        this.managedEmployees = managedEmployees;
+    }
+
+    public void setManager(Employee manager) {
+        this.manager = manager;
+    }
+
+    public void setPeriod(EmploymentPeriod period) {
+        this.period = period;
+    }
+
+    public void setPhoneNumbers(Collection phoneNumbers) {
+        this.phoneNumbers = phoneNumbers;
+    }
+
+    public void setProjects(Collection projects) {
+        this.projects = projects;
+    }
+
+    public void setSalary(int salary) {
+        this.salary = salary;
+    }
+    
+    public void setVersion(long version) {
+        this.version = version;
+    }
+
+    /**
+     * Print the first & last name
+     */
+    public String toString() {
+        StringWriter writer = new StringWriter();
+
+        writer.write("Employee: ");
+        writer.write(getFirstName());
+        writer.write(" ");
+        writer.write(getLastName());
+        return writer.toString();
+    }
+}
diff --git a/jpa/cachecoordination/src/model/EmployeeService.java b/jpa/cachecoordination/src/model/EmployeeService.java
new file mode 100755
index 0000000..1670f87
--- /dev/null
+++ b/jpa/cachecoordination/src/model/EmployeeService.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     James Sutherland - initial impl
+ ******************************************************************************/  
+ package model;
+
+import java.util.List;
+
+/**
+ * EmployeeService session bean interface.
+ */
+public interface EmployeeService {
+    List<Employee> findAll();
+    
+    Employee findById(long id);
+    
+    Employee fetchById(long id);
+    
+    void update(Employee employee);
+    
+    long insert(Employee employee);
+    
+    void setup();
+}
diff --git a/jpa/cachecoordination/src/model/EmployeeServiceBean.java b/jpa/cachecoordination/src/model/EmployeeServiceBean.java
new file mode 100755
index 0000000..a3dab63
--- /dev/null
+++ b/jpa/cachecoordination/src/model/EmployeeServiceBean.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     James Sutherland - initial impl
+ ******************************************************************************/  
+ package model;
+
+import java.util.List;
+
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+/**
+ * EmployeeService session bean.
+ */
+@Stateless(mappedName="EmployeeService")
+@Remote(EmployeeService.class)
+public class EmployeeServiceBean implements EmployeeService {
+    @PersistenceContext(name="employee")
+    protected EntityManager entityManager;
+
+    public List<Employee> findAll() {
+        Query query = this.entityManager.createQuery("Select e from Employee e");
+        return query.getResultList();
+    }
+    
+    public Employee findById(long id) {
+        Employee employee = this.entityManager.find(Employee.class, id);
+        employee.getAddress();
+        return employee;
+    }
+    
+    public Employee fetchById(long id) {
+        Employee employee = this.entityManager.find(Employee.class, id);
+        employee.getAddress();
+        employee.getManager();
+        return employee;
+    }
+    
+    public void update(Employee employee) {
+        this.entityManager.merge(employee);
+    }
+    
+    public long insert(Employee employee) {
+        this.entityManager.persist(employee);
+        this.entityManager.flush();
+        return employee.getId();
+    }
+    
+    public void setup() {
+        // Populate database.
+        // First delete all old records.
+        this.entityManager.createQuery("Delete from PhoneNumber p").executeUpdate();
+        this.entityManager.createQuery("Delete from Employee e").executeUpdate();
+        this.entityManager.createQuery("Delete from Address a").executeUpdate();
+        for (int j = 0; j < 100; j++) {
+            Employee empInsert = new Employee();
+            empInsert.setFirstName("Brendan");
+            empInsert.setMale();
+            empInsert.setLastName("" + j + "");
+            empInsert.setSalary(100000);
+            EmploymentPeriod employmentPeriod = new EmploymentPeriod();
+            java.sql.Date startDate = new java.sql.Date(new java.util.Date().getTime());
+            employmentPeriod.setStartDate(startDate);
+            empInsert.setPeriod(employmentPeriod);
+            empInsert.setAddress(new Address());
+            empInsert.getAddress().setCity("Nepean");
+            empInsert.getAddress().setPostalCode("N5J2N5");
+            empInsert.getAddress().setProvince("ON");
+            empInsert.getAddress().setStreet("1111 Mountain Blvd. Floor 13, suite " + j);
+            empInsert.getAddress().setCountry("Canada");
+            empInsert.addPhoneNumber(new PhoneNumber("Work Fax", "613", "2255943"));
+            empInsert.addPhoneNumber(new PhoneNumber("Home", "613", "2224599"));
+            this.entityManager.persist(empInsert);
+        }
+
+        for (int j = 0; j < 50; j++) {
+            Project project = new SmallProject();
+            project.setName("Tracker");
+            this.entityManager.persist(project);
+            project = new LargeProject();
+            project.setName("Tracker");
+            this.entityManager.persist(project);
+        }
+    }
+}
diff --git a/jpa/cachecoordination/src/model/EmploymentPeriod.java b/jpa/cachecoordination/src/model/EmploymentPeriod.java
new file mode 100755
index 0000000..cc09146
--- /dev/null
+++ b/jpa/cachecoordination/src/model/EmploymentPeriod.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/  
+package model;
+
+import java.sql.Date;
+import java.io.*;
+
+/**
+ * <p><b>Purpose</b>: Defines the period an Employee worked for the organization
+ * <p><b>Description</b>: The period holds the start date and optionally the end date if the employee has left (null otherwise).
+ * Maintained in an aggregate relationship of Employee
+ * @see Employee
+ */
+public class EmploymentPeriod implements Serializable {
+    protected Date startDate;
+    protected Date endDate;
+
+    public EmploymentPeriod() {
+    }
+
+    /**
+     * Return a new employment period instance.
+     * The constructor's purpose is to allow only valid instances of a class to be created.
+     * Valid means that the get/set and clone/toString methods should work on the instance.
+     * Arguments to constructors should be avoided unless those arguments are required to put
+     * the instance into a valid state, or represent the entire instance definition.
+     */
+    public EmploymentPeriod(Date startDate, Date endDate) {
+        this.startDate = startDate;
+        this.endDate = endDate;
+
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    /**
+     * Print the start & end date
+     */
+    public String toString() {
+        StringWriter writer = new StringWriter();
+
+        writer.write("EmploymentPeriod: ");
+        if (getStartDate() != null) {
+            writer.write(getStartDate().toString());
+        }
+        writer.write("-");
+        if (getEndDate() != null) {
+            writer.write(getEndDate().toString());
+        }
+        return writer.toString();
+    }
+}
diff --git a/jpa/cachecoordination/src/model/LargeProject.java b/jpa/cachecoordination/src/model/LargeProject.java
new file mode 100755
index 0000000..d17ff25
--- /dev/null
+++ b/jpa/cachecoordination/src/model/LargeProject.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/  
+package model;
+
+import java.io.*;
+import java.sql.Timestamp;
+
+/**
+ * <b>Purpose</b>: Larger scale projects within the Employee Demo
+ * <p><b>Description</b>: LargeProject is a concrete subclass of Project. It is instantiated for Projects with type = 'L'. The additional
+ * information (budget, & milestoneVersion) are mapped from the LPROJECT table.
+ * @see Project
+ */
+public class LargeProject extends Project {
+    protected double budget;
+    protected Timestamp milestoneVersion;
+
+    public LargeProject() {
+        this.budget = 0.0;
+    }
+
+    public double getBudget() {
+        return budget;
+    }
+
+    public Timestamp getMilestoneVersion() {
+        return milestoneVersion;
+    }
+
+    public void setBudget(double budget) {
+        this.budget = budget;
+    }
+
+    public void setMilestoneVersion(Timestamp milestoneVersion) {
+        this.milestoneVersion = milestoneVersion;
+    }
+
+    /**
+     * Print the project's data.
+     */
+    public String toString() {
+        StringWriter writer = new StringWriter();
+
+        writer.write("Large Project: ");
+        writer.write(getName());
+        writer.write(" ");
+        writer.write(getDescription());
+        writer.write(" " + getBudget());
+        writer.write(" ");
+        writer.write(String.valueOf(getMilestoneVersion()));
+        return writer.toString();
+    }
+}
diff --git a/jpa/cachecoordination/src/model/PhoneNumber.java b/jpa/cachecoordination/src/model/PhoneNumber.java
new file mode 100755
index 0000000..cfcad61
--- /dev/null
+++ b/jpa/cachecoordination/src/model/PhoneNumber.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/  
+package model;
+
+import java.io.*;
+
+/**
+ * <p><b>Purpose</b>: Describes an Employee's phone number.
+ * <p><b>Description</b>: Used in a 1:M relationship from an employee. Since many people have various numbers
+ * they can be contacted at the type describes where the phone number could reach the Employee.
+ */
+public class PhoneNumber implements Serializable {
+
+    /** Sequence id, added for Hibernate as it has issues with composite ids and caching. */
+    protected long id;
+    
+    /** Holds values such as Home, Work, Cellular, Pager, Fax, etc.  Since the combination of the Employee's ID and
+    the type field are what makes the entry in the database unique the type fields must be unique within an
+    Employee's Vector of PhoneNumbers.*/
+    protected String type;
+    protected String areaCode;
+
+    /** 7 digit number with no hyphen, this is added during toString() only*/
+    protected String number;
+
+    /** Owner maintains the 1:1 mapping to an Employee (required for 1:M relationship in Employee) */
+    protected Employee owner;
+
+    public PhoneNumber() {
+        this("home", "###", "#######");
+    }
+
+    public PhoneNumber(String type, String theAreaCode, String theNumber) {
+        this.type = type;
+        this.areaCode = theAreaCode;
+        this.number = theNumber;
+    }
+
+    public String getAreaCode() {
+        return areaCode;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public Employee getOwner() {
+        return owner;
+    }
+
+    public String getType() {
+        return type;
+    }
+    
+    public long getId() {
+        return id;
+    }
+
+    public void setAreaCode(String areaCode) {
+        this.areaCode = areaCode;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public void setOwner(Employee owner) {
+        this.owner = owner;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+    
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    /**
+     * Required for Hibernate cache to work.
+     */
+    public int hashCode() {
+        return getType().hashCode();
+    }
+
+    /**
+     * Required for Hibernate cache to work.
+     */
+    public boolean equals(Object object) {
+        if (object instanceof PhoneNumber) {
+            PhoneNumber phone = (PhoneNumber)object;
+            if (! getType().equals(phone.getType())) {
+                return false;
+            }
+            if ((getOwner() == null) || (phone.getOwner() == null) || (getOwner().getId() != phone.getOwner().getId())) {
+                return false;
+            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+    
+    /**
+     * Print the phone.
+     * Example: Phone[Work]: (613) 225-8812
+     */
+    public String toString() {
+        StringWriter writer = new StringWriter();
+
+        writer.write("PhoneNumber [");
+        writer.write(getType());
+        writer.write("]: (");
+        writer.write(this.getAreaCode());
+        writer.write(")");
+        writer.write(this.getNumber().substring(0, 3));
+        writer.write("-");
+        writer.write(this.getNumber().substring(3, 7));
+        return writer.toString();
+    }
+}
diff --git a/jpa/cachecoordination/src/model/Project.java b/jpa/cachecoordination/src/model/Project.java
new file mode 100755
index 0000000..e435010
--- /dev/null
+++ b/jpa/cachecoordination/src/model/Project.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/  
+package model;
+
+import java.io.*;
+
+/**
+ * <b>Purpose</b>: Abstract superclass for Large & Small projects in Employee Demo
+ * <p><b>Description</b>:     Project is an example of an abstract superclass. It demonstrates how class inheritance can be mapped to database tables.
+ * It's subclasses are concrete and may or may not add columns through additional tables. The PROJ_TYPE field in the
+ * database table indicates which subclass to instantiate. Projects are involved in a M:M relationship with employees.
+ * The Employee classs maintains the definition of the relation table.
+ * @see LargeProject
+ * @see SmallProject
+ */
+public abstract class Project implements Serializable {
+    protected long id;
+    protected long version;
+    protected String name;
+    protected String description;
+    protected Employee teamLeader;
+
+    public Project() {
+        this.name = "";
+        this.description = "";
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Return the persistent identifier of the receiver.
+     */
+    public long getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Employee getTeamLeader() {
+        return teamLeader;
+    }
+    
+    public long getVersion() {
+        return version;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * Set the persistent identifier of the receiver.
+     */
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setTeamLeader(Employee teamLeader) {
+        this.teamLeader = teamLeader;
+    }
+    
+    public void setVersion(long version) {
+        this.version = version;
+    }
+}
diff --git a/jpa/cachecoordination/src/model/SmallProject.java b/jpa/cachecoordination/src/model/SmallProject.java
new file mode 100755
index 0000000..f80a837
--- /dev/null
+++ b/jpa/cachecoordination/src/model/SmallProject.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/  
+package model;
+
+/**
+ * <p><b>Purpose</b>: SmallProject is a concrete subclass of Project which adds no additional attributes.
+ * <p><b>Description</b>: When the PROJ_TYPE is set to 'S' in the PROJECT table a SmallProject is instantiated.
+ * No table definition is required and the descriptor is very simple.
+ */
+public class SmallProject extends Project {
+
+    /**
+     * Print the SmallProject's information.
+     */
+    public String toString() {
+        java.io.StringWriter writer = new java.io.StringWriter();
+
+        writer.write("Small Project: ");
+        writer.write(getName());
+        writer.write(" ");
+        writer.write(getDescription());
+        writer.write("");
+        return writer.toString();
+    }
+}