You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/03/02 16:32:52 UTC

[isis] branch master updated: ISIS-1841 major refactoring: splitting out dn support into plugins

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new a65c13f  ISIS-1841 major refactoring: splitting out dn support into plugins
a65c13f is described below

commit a65c13f991de49aa610b90ba1b3ad0df998d39f4
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Mar 2 17:32:43 2018 +0100

    ISIS-1841 major refactoring: splitting out dn support into plugins
---
 core/applib/pom.xml                                |   44 +-
 .../teardown/TeardownFixtureAbstract.java          |    4 +-
 .../teardown/TeardownFixtureAbstract2.java         |    4 +-
 .../isis/applib/internal/context/_Plugin.java      |   35 +-
 .../isis/applib/internal/discover/_Discover.java   |    5 -
 .../{IsisJdoSupport.java => IsisJdoSupport0.java}  |   19 +-
 .../integtestsupport/IntegrationTestAbstract.java  |   16 +-
 .../integtestsupport/IntegrationTestAbstract3.java |   28 +-
 .../core/integtestsupport/IsisSystemForTest.java   |   27 +-
 .../core/integtestsupport/ThrowableMatchers.java   |   11 +-
 .../scenarios/ObjectFactoryForIntegration.java     |    5 +-
 core/metamodel/pom.xml                             |   27 -
 .../core/metamodel/IsisJdoMetamodelPlugin.java     |   33 +
 .../JdoMetamodelUtil.java}                         |    7 +-
 .../jaxb/XmlJavaTypeAdapterFacetFactory.java       |    4 +-
 .../metamodel/MetaModelServiceDefault.java         |    4 +-
 ...JdoDatastoreIdentityAnnotationFacetFactory.java |    4 +-
 .../JdoDiscriminatorAnnotationFacetFactory.java    |    4 +-
 ...doPersistenceCapableAnnotationFacetFactory.java |    4 +-
 .../query/JdoQueryAnnotationFacetFactory.java      |    4 +-
 .../version/JdoVersionAnnotationFacetFactory.java  |    4 +-
 ...ndatoryFromJdoColumnAnnotationFacetFactory.java |    4 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |    4 +-
 .../JdoNotPersistentAnnotationFacetFactory.java    |    4 +-
 .../JdoPrimaryKeyAnnotationFacetFactory.java       |    4 +-
 core/plugins/jdo-datanucleus-4/pom.xml             |  138 ++
 .../plugins/jdo/dn4/IsisJdoSupportPlugin4.java     |   42 +
 .../services/jdosupport/IsisJdoSupport.java}       |   22 +-
 .../services/jdosupport/IsisJdoSupport4.java       |   84 +
 .../services/jdosupport/IsisJdoSupportImpl4.java}  |   27 +-
 .../jdosupport/Persistable_datanucleusIdLong.java  |    0
 .../Persistable_datanucleusVersionLong.java        |    0
 .../Persistable_datanucleusVersionTimestamp.java   |    0
 .../Persistable_downloadJdoMetadata.java           |    7 +-
 .../core/metamodel/services/jdosupport/Util.java   |    0
 .../runtime/persistence/adapter/PojoAdapter.java   |   19 +-
 .../DataNucleusApplicationComponents4.java}        |   32 +-
 .../system/persistence/IsisLifecycleListener2.java |    0
 .../system/persistence/PersistenceSession4.java}   |   58 +-
 .../persistence/PersistenceSessionFactory4.java}   |   29 +-
 .../core/runtime/system/persistence/Utils.java     |    0
 .../CreateSchemaObjectFromClassMetadata4.java}     |   11 +-
 .../datanucleus/DataNucleusLifeCycleHelper.java    |    0
 .../jdo/datanucleus/JDOStateManagerForIsis.java    |    0
 .../persistence/IsisLifecycleListener.java         |    7 +-
 .../PersistenceQueryFindAllInstancesProcessor.java |    9 +-
 ...sistenceQueryFindUsingApplibQueryProcessor.java |   15 +-
 .../queries/PersistenceQueryProcessor.java         |    0
 .../queries/PersistenceQueryProcessorAbstract.java |   17 +-
 .../datanucleus/persistence/queries/QueryUtil.java |    0
 .../persistence/spi/JdoObjectIdSerializer.java     |    0
 .../service/eventbus/EventBusServiceJdo.java       |    4 +-
 .../typeconverters/IsisMarkupConverter.java        |    0
 .../typeconverters/IsisPasswordConverter.java      |    0
 .../valuemappings/ByteArrayBlobRdbmsMapping.java   |    0
 .../datanucleus/valuetypes/IsisBlobMapping.java    |    0
 .../datanucleus/valuetypes/IsisClobMapping.java    |    0
 .../datanucleus/valuetypes/IsisMoneyMapping.java   |    0
 ...ache.isis.core.metamodel.IsisJdoMetamodelPlugin |    1 +
 ...apache.isis.core.metamodel.IsisJdoRuntimePlugin |    1 +
 .../ObjectReflectorDefaultTest_object.java         |    0
 .../adapterfactory/pojo/PojoAdapterTest.java       |   21 +-
 .../transaction/PojoAdapterBuilder.java            |   10 +-
 .../runtime/system/ObjectMemberAbstractTest.java   |    0
 ...atastoreIdentityAnnotationFacetFactoryTest.java |    0
 ...JdoDiscriminatorAnnotationFacetFactoryTest.java |    0
 ...rsistenceCapableAnnotationFacetFactoryTest.java |    0
 .../query/JdoQueryAnnotationFacetFactoryTest.java  |    0
 .../JdoVersionAnnotationFacetFactoryTest.java      |    0
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |    0
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |    0
 ...impleObjectWithBigDecimalColumnAnnotations.java |    0
 ...impleObjectWithColumnAllowsNullAnnotations.java |    0
 ...JdoNotPersistentAnnotationFacetFactoryTest.java |    0
 .../SimpleObjectWithNotPersistentColumn.java       |    0
 ...venJdoPrimaryKeyAnnotationFacetFactoryTest.java |    0
 .../primarykey/SimpleObjectWithPrimaryKey.java     |    0
 core/plugins/jdo-datanucleus-5/pom.xml             |  135 ++
 .../plugins/jdo/dn5/IsisJdoSupportPlugin5.java     |   42 +
 .../services/jdosupport/IsisJdoSupport.java}       |   23 +-
 .../services/jdosupport/IsisJdoSupport5.java}      |   61 +-
 .../services/jdosupport/IsisJdoSupportImpl5.java}  |   40 +-
 .../jdosupport/Persistable_datanucleusIdLong.java  |    0
 .../Persistable_datanucleusVersionLong.java        |    0
 .../Persistable_datanucleusVersionTimestamp.java   |    0
 .../Persistable_downloadJdoMetadata.java           |    7 +-
 .../core/metamodel/services/jdosupport/Util.java   |    0
 .../runtime/persistence/adapter/PojoAdapter.java   |    8 +-
 .../DataNucleusApplicationComponents5.java}        |   29 +-
 .../system/persistence/IsisLifecycleListener2.java |    0
 .../system/persistence/PersistenceSession5.java}   |   57 +-
 .../persistence/PersistenceSessionFactory5.java}   |   34 +-
 .../core/runtime/system/persistence/Utils.java     |    0
 .../CreateSchemaObjectFromClassMetadata.java       |    5 +-
 .../datanucleus/DataNucleusLifeCycleHelper.java    |    0
 .../jdo/datanucleus/JDOStateManagerForIsis.java    |    0
 .../persistence/IsisLifecycleListener.java         |    4 +-
 .../PersistenceQueryFindAllInstancesProcessor.java |    6 +-
 ...sistenceQueryFindUsingApplibQueryProcessor.java |    8 +-
 .../queries/PersistenceQueryProcessor.java         |    0
 .../queries/PersistenceQueryProcessorAbstract.java |   17 +-
 .../datanucleus/persistence/queries/QueryUtil.java |    4 +-
 .../persistence/spi/JdoObjectIdSerializer.java     |    0
 .../service/eventbus/EventBusServiceJdo.java       |    0
 .../typeconverters/IsisMarkupConverter.java        |    0
 .../typeconverters/IsisPasswordConverter.java      |    0
 .../valuemappings/ByteArrayBlobRdbmsMapping.java   |    0
 .../datanucleus/valuetypes/IsisBlobMapping.java    |    0
 .../datanucleus/valuetypes/IsisClobMapping.java    |    0
 .../datanucleus/valuetypes/IsisMoneyMapping.java   |    0
 ...ache.isis.core.metamodel.IsisJdoMetamodelPlugin |    1 +
 ...apache.isis.core.metamodel.IsisJdoRuntimePlugin |    1 +
 .../ObjectReflectorDefaultTest_object.java         |    0
 .../adapterfactory/pojo/PojoAdapterTest.java       |   21 +-
 .../transaction/PojoAdapterBuilder.java            |   10 +-
 .../runtime/system/ObjectMemberAbstractTest.java   |    0
 ...atastoreIdentityAnnotationFacetFactoryTest.java |    0
 ...JdoDiscriminatorAnnotationFacetFactoryTest.java |    0
 ...rsistenceCapableAnnotationFacetFactoryTest.java |    0
 .../query/JdoQueryAnnotationFacetFactoryTest.java  |    0
 .../JdoVersionAnnotationFacetFactoryTest.java      |    0
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |    0
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |    0
 ...impleObjectWithBigDecimalColumnAnnotations.java |    0
 ...impleObjectWithColumnAllowsNullAnnotations.java |    0
 ...JdoNotPersistentAnnotationFacetFactoryTest.java |    0
 .../SimpleObjectWithNotPersistentColumn.java       |    0
 ...venJdoPrimaryKeyAnnotationFacetFactoryTest.java |    0
 .../primarykey/SimpleObjectWithPrimaryKey.java     |    0
 core/pom.xml                                       |  143 +-
 core/runtime/pom.xml                               |    7 -
 .../isis/core/metamodel/IsisJdoRuntimePlugin.java  |   28 +
 .../runtime/headless/IsisSystemBootstrapper.java   |   12 +-
 .../apache/isis/core/runtime/memento/Memento.java  |   14 +-
 .../transaction/PersistenceCommandAbstract.java    |    2 -
 .../system/persistence/PersistenceSession.java     | 2429 +-------------------
 .../persistence/PersistenceSessionFactory.java     |  203 +-
 .../system/session/IsisSessionFactoryBuilder.java  |    2 +-
 .../datanucleus/DataNucleusPropertiesAware.java    |    1 -
 .../service/support/TimestampService.java          |    9 +-
 .../objectstore/jdo/service/RegisterEntities.java  |    3 +-
 ...AnnotationFacetFactoryTest_refineMetaModel.java |    0
 core/unittestsupport/pom.xml                       |   11 +-
 143 files changed, 987 insertions(+), 3253 deletions(-)

diff --git a/core/applib/pom.xml b/core/applib/pom.xml
index 6e15804..4fcc2a6 100644
--- a/core/applib/pom.xml
+++ b/core/applib/pom.xml
@@ -100,56 +100,26 @@
             <artifactId>isis-core-schema</artifactId>
         </dependency>
 
-<!-- replaced by javaee-api -->        
-<!--         <dependency> -->
-<!--             <groupId>org.apache.geronimo.specs</groupId> -->
-<!--             <artifactId>geronimo-atinject_1.0_spec</artifactId> -->
-<!--         </dependency> -->
-<!--         <dependency> -->
-<!--             <groupId>javax.validation</groupId> -->
-<!--             <artifactId>validation-api</artifactId> -->
-<!--         </dependency> -->
-<!--         <dependency> -->
-<!--             <groupId>org.apache.geronimo.specs</groupId> -->
-<!--             <artifactId>geronimo-jta_1.1_spec</artifactId> -->
-<!--         </dependency> -->
-<!--         <dependency> -->
-<!--             <groupId>org.apache.geronimo.specs</groupId> -->
-<!--             <artifactId>geronimo-jcdi_1.0_spec</artifactId> -->
-<!--         </dependency> -->
-<!--         <dependency> -->
-<!--             <groupId>org.jboss.spec.javax.ws.rs</groupId> -->
-<!--             <artifactId>jboss-jaxrs-api_2.0_spec</artifactId> -->
-<!--         </dependency> -->
-
 		<!-- JEE API -->
 		<dependency>
 		    <groupId>javax</groupId>
 		    <artifactId>javaee-api</artifactId>
 		</dependency>
-
-        <dependency>
-            <groupId>org.hsqldb</groupId>
-            <artifactId>hsqldb</artifactId>
-            <optional>true</optional>
-        </dependency>
-
-        <!-- DataNucleus' standard JDO support -->
+		
+		<!-- JDO API -->
         <dependency>
             <groupId>javax.jdo</groupId>
             <artifactId>jdo-api</artifactId>
         </dependency>
 
-        <!-- DataNucleus' (proprietary) type-safe query support-->
-        <dependency>
-            <groupId>org.datanucleus</groupId>
-            <artifactId>datanucleus-api-jdo</artifactId>
-        </dependency>
+		<!-- HSQL-DB -->
         <dependency>
-            <groupId>org.datanucleus</groupId>
-            <artifactId>datanucleus-jdo-query</artifactId>
+            <groupId>org.hsqldb</groupId>
+            <artifactId>hsqldb</artifactId>
+            <optional>true</optional>
         </dependency>
 
+		<!-- TESTS -->
         <dependency>
             <groupId>org.apache.isis.core</groupId>
             <artifactId>isis-core-unittestsupport</artifactId>
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/teardown/TeardownFixtureAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/teardown/TeardownFixtureAbstract.java
index 8c16f2d..cda3734 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/teardown/TeardownFixtureAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/teardown/TeardownFixtureAbstract.java
@@ -23,7 +23,7 @@ import javax.jdo.metadata.TypeMetadata;
 
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.applib.internal.base._Strings;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport0;
 
 public abstract class TeardownFixtureAbstract extends FixtureScript {
 
@@ -62,6 +62,6 @@ public abstract class TeardownFixtureAbstract extends FixtureScript {
     protected void postDeleteFrom(final Class<?> cls) {}
 
     @Inject
-    private IsisJdoSupport isisJdoSupport;
+    private IsisJdoSupport0 isisJdoSupport;
 
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/teardown/TeardownFixtureAbstract2.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/teardown/TeardownFixtureAbstract2.java
index 13d5c74..0a771fc 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/teardown/TeardownFixtureAbstract2.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/teardown/TeardownFixtureAbstract2.java
@@ -27,7 +27,7 @@ import javax.jdo.metadata.InheritanceMetadata;
 import javax.jdo.metadata.TypeMetadata;
 
 import org.apache.isis.applib.internal.base._Strings;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport0;
 
 public abstract class TeardownFixtureAbstract2 extends TeardownFixtureAbstract {
 
@@ -147,5 +147,5 @@ public abstract class TeardownFixtureAbstract2 extends TeardownFixtureAbstract {
     }
 
     @Inject
-    protected IsisJdoSupport isisJdoSupport;
+    protected IsisJdoSupport0 isisJdoSupport;
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java b/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java
index a18c5f7..395c1e0 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java
@@ -66,19 +66,36 @@ public final class _Plugin {
 		return _Sets.unmodifiable(loader);   
 	}
 	
-	public static <S> S getOrElse(Class<S> service, Function<Set<S>, S> onAmbiguity, Supplier<S> onNotFound){
+	/**
+	 * Uses application scoped caching. The first successful retrieval of a plugin for given 
+	 * {@code pluginClass} is cached until application's life-cycle ends. 
+	 * 
+	 * @param pluginClass
+	 * @param onAmbiguity what to do if more than one matching plugin is found
+	 * @param onNotFound what to do if no matching plugin is found
+	 * @return
+	 */
+	public static <S> S getOrElse(Class<S> pluginClass, Function<Set<S>, S> onAmbiguity, Supplier<S> onNotFound){
 	
-		final Set<S> plugins = loadAll(service);
+		// lookup cache first 
+		return _Context.computeIfAbsent(pluginClass, __->{
+			
+			final Set<S> plugins = loadAll(pluginClass);
+			
+			if(plugins.isEmpty()) {
+				return onNotFound.get();
+			}
+			
+			if(plugins.size()>1) {
+				return onAmbiguity.apply(plugins);
+			}
+			
+			return plugins.iterator().next();	
+			
+		});
 		
-		if(plugins.isEmpty()) {
-			return onNotFound.get();
-		}
 		
-		if(plugins.size()>1) {
-			return onAmbiguity.apply(plugins);
-		}
 		
-		return plugins.iterator().next();
 	}
 	
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
index c602c1c..ec2f816 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
@@ -63,11 +63,6 @@ public final class _Discover {
 	// -- HELPER
 	
 	private static ClassDiscoveryPlugin getPlugin() {
-		return _Context.computeIfAbsent(ClassDiscoveryPlugin.class, __->loadPluginsPickAny());
-	}
-
-	private static ClassDiscoveryPlugin loadPluginsPickAny() {
-		
 		return _Plugin.getOrElse(ClassDiscoveryPlugin.class, 
 				ambiguosPlugins->{
 					final Logger LOG = LoggerFactory.getLogger(ClassDiscoveryPlugin.class);
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java b/core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport0.java
similarity index 91%
copy from core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
copy to core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport0.java
index 4ca5c10..ab89805 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport0.java
@@ -23,10 +23,9 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
+//import javax.jdo.JDOQLTypedQuery;
 import javax.jdo.PersistenceManager;
-
-import org.datanucleus.query.typesafe.BooleanExpression;
-import org.datanucleus.query.typesafe.TypesafeQuery;
+//import javax.jdo.query.BooleanExpression;
 
 import org.apache.isis.applib.annotation.Programmatic;
 
@@ -34,7 +33,7 @@ import org.apache.isis.applib.annotation.Programmatic;
 /**
  * Service that provide a number of workarounds when using JDO/DataNucleus. 
  */
-public interface IsisJdoSupport {
+public interface IsisJdoSupport0 {
 
     /**
      * Force a reload (corresponding to the JDO <tt>PersistenceManager</tt>'s <tt>refresh()</tt> method)
@@ -100,8 +99,8 @@ public interface IsisJdoSupport {
      *     </pre>
      * </p>
      */
-    @Programmatic
-    <T> List<T> executeQuery(final Class<T> cls, final BooleanExpression booleanExpression);
+//    @Programmatic
+//    <T> List<T> executeQuery(final Class<T> cls, final BooleanExpression booleanExpression);
 
     /**
      * To perform a common use-case of executing a (type-safe) query against the specified class,
@@ -119,8 +118,8 @@ public interface IsisJdoSupport {
      *     </pre>
      * </p>
      */
-    @Programmatic
-    <T> T executeQueryUnique(final Class<T> cls, final BooleanExpression booleanExpression);
+//    @Programmatic
+//    <T> T executeQueryUnique(final Class<T> cls, final BooleanExpression booleanExpression);
 
     /**
      * To support the execution of type-safe queries using DataNucleus' lower-level APIs
@@ -131,6 +130,6 @@ public interface IsisJdoSupport {
      *     of the caller.
      * </p>
      */
-    @Programmatic
-    <T> TypesafeQuery<T> newTypesafeQuery(Class<T> cls);
+//    @Programmatic
+//    <T> JDOQLTypedQuery<T> newTypesafeQuery(Class<T> cls);
 }
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
index ded4684..b888503 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
@@ -20,19 +20,12 @@ package org.apache.isis.core.integtestsupport;
 
 import java.util.List;
 
-import com.google.common.base.Throwables;
-
-import org.junit.Rule;
-import org.junit.rules.ExpectedException;
-import org.junit.rules.MethodRule;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.Statement;
-
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.fixtures.FixtureClock;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -45,6 +38,11 @@ import org.apache.isis.core.specsupport.scenarios.ScenarioExecution;
 import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.junit.Rule;
+import org.junit.rules.ExpectedException;
+import org.junit.rules.MethodRule;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.Statement;
 
 /**
  * Base class for integration tests.
@@ -224,7 +222,7 @@ public abstract class IntegrationTestAbstract {
                         endTransactionTilDone();
 
                         isft.nextSession();
-                        final List<Throwable> causalChain = Throwables.getCausalChain(e);
+                        final List<Throwable> causalChain = _Exceptions.getCausalChain(e);
                         // if underlying cause is an applib-defined exception, throw that rather than Isis' wrapper exception
                         for (final Throwable cause : causalChain) {
                             if(cause instanceof RecoverableException ||
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java
index f0a3066..1caa4a4 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java
@@ -20,8 +20,16 @@ package org.apache.isis.core.integtestsupport;
 
 import java.util.List;
 
-import com.google.common.base.Throwables;
-
+import org.apache.isis.applib.AppManifest;
+import org.apache.isis.applib.Module;
+import org.apache.isis.applib.NonRecoverableException;
+import org.apache.isis.applib.RecoverableException;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport0;
+import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.core.runtime.headless.HeadlessWithBootstrappingAbstract;
+import org.apache.isis.core.runtime.headless.IsisSystem;
+import org.apache.isis.core.runtime.headless.logging.LogConfig;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -33,16 +41,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.event.Level;
 
-import org.apache.isis.applib.AppManifest;
-import org.apache.isis.applib.Module;
-import org.apache.isis.applib.NonRecoverableException;
-import org.apache.isis.applib.RecoverableException;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
-import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.core.runtime.headless.logging.LogConfig;
-import org.apache.isis.core.runtime.headless.HeadlessWithBootstrappingAbstract;
-import org.apache.isis.core.runtime.headless.IsisSystem;
-
 /**
  * Reworked base class for integration tests, uses a {@link Module} to bootstrap, rather than an {@link AppManifest}.
  */
@@ -86,7 +84,7 @@ public abstract class IntegrationTestAbstract3 extends HeadlessWithBootstrapping
                             try {
                                 final IsisSystem isft = IsisSystem.get();
                                 isft.getService(TransactionService.class).flushTransaction(); // don't care if npe
-                                isft.getService(IsisJdoSupport.class).getJdoPersistenceManager().flush();
+                                isft.getService(IsisJdoSupport0.class).getJdoPersistenceManager().flush();
                             } catch (Exception ignore) {
                                 // ignore
                             }
@@ -125,7 +123,7 @@ public abstract class IntegrationTestAbstract3 extends HeadlessWithBootstrapping
 
                 NonRecoverableException determineIfNonRecoverableException(final Throwable e) {
                     NonRecoverableException nonRecoverableException = null;
-                    final List<Throwable> causalChain2 = Throwables.getCausalChain(e);
+                    final List<Throwable> causalChain2 = _Exceptions.getCausalChain(e);
                     for (final Throwable cause : causalChain2) {
                         if(cause instanceof NonRecoverableException) {
                             nonRecoverableException = (NonRecoverableException) cause;
@@ -137,7 +135,7 @@ public abstract class IntegrationTestAbstract3 extends HeadlessWithBootstrapping
 
                 RecoverableException determineIfRecoverableException(final Throwable e) {
                     RecoverableException recoverableException = null;
-                    final List<Throwable> causalChain = Throwables.getCausalChain(e);
+                    final List<Throwable> causalChain = _Exceptions.getCausalChain(e);
                     for (final Throwable cause : causalChain) {
                         if(cause instanceof RecoverableException) {
                             recoverableException = (RecoverableException) cause;
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
index 14aceb6..1149542 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
@@ -19,20 +19,17 @@
 
 package org.apache.isis.core.integtestsupport;
 
+import static org.junit.Assert.fail;
+
 import java.util.List;
 import java.util.Set;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-
-import org.junit.Before;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
+import java.util.stream.Collectors;
 
 import org.apache.isis.applib.AppManifest;
-import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.fixtures.FixtureClock;
 import org.apache.isis.applib.fixtures.InstallableFixture;
+import org.apache.isis.applib.internal.base._NullSafe;
+import org.apache.isis.applib.internal.collections._Lists;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -57,8 +54,9 @@ import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProvider;
 import org.apache.isis.core.security.authentication.AuthenticationRequestNameOnly;
 import org.apache.isis.core.specsupport.scenarios.DomainServiceProvider;
-
-import static org.junit.Assert.fail;
+import org.junit.Before;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
 
 /**
  * Wraps a plain {@link IsisSessionFactoryBuilder}, and provides a number of features to assist with testing.
@@ -155,10 +153,10 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
 
         private AppManifest appManifestIfAny;
 
-        private final List<Object> services = Lists.newArrayList();
-        private final List<InstallableFixture> fixtures = Lists.newArrayList();
+        private final List<Object> services = _Lists.newArrayList();
+        private final List<InstallableFixture> fixtures = _Lists.newArrayList();
 
-        private final List <Listener> listeners = Lists.newArrayList();
+        private final List <Listener> listeners = _Lists.newArrayList();
 
         private org.apache.log4j.Level level;
 
@@ -293,7 +291,8 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
         final MetaModelInvalidException mmie = IsisContext.getMetaModelInvalidExceptionIfAny();
         if(mmie != null) {
             final Set<String> validationErrors = mmie.getValidationErrors();
-            final String validationMsg = Joiner.on("\n").join(validationErrors);
+            final String validationMsg = _NullSafe.stream(validationErrors)
+            		.collect(Collectors.joining("\n"));
             fail(validationMsg);
             return;
         }
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/ThrowableMatchers.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/ThrowableMatchers.java
index d3eb5f8..d4a4587 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/ThrowableMatchers.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/ThrowableMatchers.java
@@ -18,9 +18,7 @@ package org.apache.isis.core.integtestsupport;
 
 import java.util.List;
 
-import com.google.common.base.Throwables;
-import com.google.common.collect.FluentIterable;
-
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
@@ -32,8 +30,11 @@ public class ThrowableMatchers {
         return new TypeSafeMatcher<Throwable>() {
             @Override
             protected boolean matchesSafely(final Throwable throwable) {
-                final List<Throwable> causalChain = Throwables.getCausalChain(throwable);
-                return !FluentIterable.from(causalChain).filter(type).isEmpty();
+            	final List<Throwable> causalChain = _Exceptions.getCausalChain(throwable); // non null result
+            	
+            	// legacy of return !FluentIterable.from(causalChain).filter(type).isEmpty();
+            	
+                return causalChain.stream().filter(t->t.getClass().equals(type)).findAny().isPresent();
             }
 
             @Override public void describeTo(final Description description) {
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java
index c272afe..dd56abd 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java
@@ -21,8 +21,7 @@ package org.apache.isis.core.integtestsupport.scenarios;
 import java.lang.reflect.Constructor;
 import java.util.Map;
 
-import com.google.common.collect.Maps;
-
+import org.apache.isis.applib.internal.collections._Maps;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.runtime.headless.IsisSystem;
 
@@ -30,7 +29,7 @@ import cucumber.api.java.ObjectFactory;
 import cucumber.runtime.CucumberException;
 
 public class ObjectFactoryForIntegration implements ObjectFactory {
-    private final Map<Class<?>, Object> instances = Maps.newHashMap();
+    private final Map<Class<?>, Object> instances = _Maps.newHashMap();
 
     public void start() { }
 
diff --git a/core/metamodel/pom.xml b/core/metamodel/pom.xml
index 074de72..4d76471 100644
--- a/core/metamodel/pom.xml
+++ b/core/metamodel/pom.xml
@@ -91,33 +91,6 @@
 	       <artifactId>gson</artifactId>
         </dependency>
 
-		<!-- replaced by javaee-api -->
-		<!--         <dependency> -->
-		<!--             <groupId>org.apache.geronimo.specs</groupId> -->
-		<!--             <artifactId>geronimo-servlet_3.0_spec</artifactId> -->
-		<!--             <scope>provided</scope> -->
-		<!--         </dependency> -->
-
-        <dependency>
-            <groupId>org.datanucleus</groupId>
-            <artifactId>datanucleus-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.datanucleus</groupId>
-            <artifactId>datanucleus-api-jdo</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.datanucleus</groupId>
-            <artifactId>datanucleus-jdo-query</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.datanucleus</groupId>
-            <artifactId>datanucleus-rdbms</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.datanucleus</groupId>
-            <artifactId>datanucleus-jodatime</artifactId>
-        </dependency>
         <dependency>
             <groupId>io.swagger</groupId>
             <artifactId>swagger-core</artifactId>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisJdoMetamodelPlugin.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisJdoMetamodelPlugin.java
new file mode 100644
index 0000000..0c3bd94
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisJdoMetamodelPlugin.java
@@ -0,0 +1,33 @@
+package org.apache.isis.core.metamodel;
+
+import javax.annotation.Nullable;
+
+import org.apache.isis.applib.NonRecoverableException;
+import org.apache.isis.applib.internal.context._Plugin;
+
+public interface IsisJdoMetamodelPlugin {
+
+	// -- INTERFACE
+	
+	/**
+	 * Equivalent to org.datanucleus.enhancement.Persistable.class.isAssignableFrom(cls).
+	 * @param cls
+	 * @return
+	 */
+	public boolean isPersistenceEnhanced(@Nullable Class<?> cls);
+	
+	// -- LOOKUP
+
+	public static IsisJdoMetamodelPlugin get() {
+		return _Plugin.getOrElse(IsisJdoMetamodelPlugin.class, 
+				ambigousPlugins->{
+					throw new NonRecoverableException("Ambigous plugins implementing IsisJdoMetamodelPlugin found on class path.");
+				}, 
+				()->{
+					throw new NonRecoverableException("No plugin implementing IsisJdoMetamodelPlugin found on class path.");
+				}); 
+	}
+
+	
+	
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/util/MetaInfo.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/JdoMetamodelUtil.java
similarity index 86%
rename from core/metamodel/src/main/java/org/apache/isis/core/commons/util/MetaInfo.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/JdoMetamodelUtil.java
index de58b90..3e494aa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/util/MetaInfo.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/JdoMetamodelUtil.java
@@ -16,12 +16,13 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.commons.util;
+package org.apache.isis.core.metamodel;
 
-public class MetaInfo {
+public class JdoMetamodelUtil {
 
 	public static boolean isPersistenceEnhanced(Class<?> cls) {
-		return org.datanucleus.enhancement.Persistable.class.isAssignableFrom(cls);
+		
+		return IsisJdoMetamodelPlugin.get().isPersistenceEnhanced(cls);
 	}
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetFactory.java
index dd4cd3a..1477cb8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetFactory.java
@@ -28,7 +28,7 @@ import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -238,7 +238,7 @@ public class XmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
 
             final ObjectSpecification propertyTypeSpec = property.getSpecification();
             final Class<?> propertyType = propertyTypeSpec.getCorrespondingClass();
-            if (!MetaInfo.isPersistenceEnhanced(propertyType)) {
+            if (!JdoMetamodelUtil.isPersistenceEnhanced(propertyType)) {
                 return;
             }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index df93156..49711f1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.services.command.CommandDtoProcessor;
 import org.apache.isis.applib.services.grid.GridService;
 import org.apache.isis.applib.services.metamodel.DomainMember;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
@@ -194,7 +194,7 @@ public class MetaModelServiceDefault implements MetaModelService {
             return Sort.COLLECTION;
         }
         final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
-        if(MetaInfo.isPersistenceEnhanced(correspondingClass)) {
+        if(JdoMetamodelUtil.isPersistenceEnhanced(correspondingClass)) {
             return Sort.JDO_ENTITY;
         }
         if(mode == Mode.RELAXED) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java
index ffead7e..32b2be8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java
@@ -22,7 +22,7 @@ package org.apache.isis.objectstore.jdo.metamodel.facets.object.datastoreidentit
 import javax.jdo.annotations.DatastoreIdentity;
 import javax.jdo.annotations.IdGeneratorStrategy;
 
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
@@ -40,7 +40,7 @@ public class JdoDatastoreIdentityAnnotationFacetFactory extends FacetFactoryAbst
         final Class<?> cls = processClassContext.getCls();
 
         // only applies to JDO entities; ignore any view models
-        if(!MetaInfo.isPersistenceEnhanced(cls)) {
+        if(!JdoMetamodelUtil.isPersistenceEnhanced(cls)) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
index dac67af..84ca945 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
@@ -22,7 +22,7 @@ package org.apache.isis.objectstore.jdo.metamodel.facets.object.discriminator;
 import javax.jdo.annotations.Discriminator;
 import com.google.common.base.Strings;
 
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -44,7 +44,7 @@ public class JdoDiscriminatorAnnotationFacetFactory extends FacetFactoryAbstract
 
         // only applies to JDO entities; ignore any view models
         final Class<?> cls = processClassContext.getCls();
-        if(!MetaInfo.isPersistenceEnhanced(cls)) {
+        if(!JdoMetamodelUtil.isPersistenceEnhanced(cls)) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java
index b5eda93..036012e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java
@@ -24,7 +24,7 @@ import javax.jdo.annotations.PersistenceCapable;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
@@ -42,7 +42,7 @@ public class JdoPersistenceCapableAnnotationFacetFactory extends FacetFactoryAbs
         final Class<?> cls = processClassContext.getCls();
 
         // only applies to JDO entities; ignore any view models
-        if(!MetaInfo.isPersistenceEnhanced(cls)) {
+        if(!JdoMetamodelUtil.isPersistenceEnhanced(cls)) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
index 000cc13..544a147 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
@@ -25,7 +25,7 @@ import javax.jdo.annotations.Queries;
 import javax.jdo.annotations.Query;
 
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -54,7 +54,7 @@ public class JdoQueryAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final Class<?> cls = processClassContext.getCls();
 
         // only applies to JDO entities; ignore any view models
-        if(!MetaInfo.isPersistenceEnhanced(cls)) {
+        if(!JdoMetamodelUtil.isPersistenceEnhanced(cls)) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactory.java
index 0792afb..e095f96 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactory.java
@@ -22,7 +22,7 @@ package org.apache.isis.objectstore.jdo.metamodel.facets.object.version;
 import javax.jdo.annotations.Version;
 
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
@@ -46,7 +46,7 @@ public class JdoVersionAnnotationFacetFactory extends FacetFactoryAbstract imple
         final Class<?> cls = processClassContext.getCls();
 
         // only applies to JDO entities; ignore any view models
-        if(!MetaInfo.isPersistenceEnhanced(cls)) {
+        if(!JdoMetamodelUtil.isPersistenceEnhanced(cls)) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
index f52a9e6..ed3d2cf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
@@ -26,7 +26,7 @@ import javax.jdo.annotations.IdentityType;
 import com.google.common.base.Strings;
 
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
@@ -59,7 +59,7 @@ public class MandatoryFromJdoColumnAnnotationFacetFactory extends FacetFactoryAb
 
         // only applies to JDO entities; ignore any view models
         final Class<?> cls = processMethodContext.getCls();
-        if(!MetaInfo.isPersistenceEnhanced(cls)) {
+        if(!JdoMetamodelUtil.isPersistenceEnhanced(cls)) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
index d6da153..b723cc7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -24,7 +24,7 @@ import javax.jdo.annotations.Column;
 import javax.jdo.annotations.IdentityType;
 
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
@@ -56,7 +56,7 @@ public class MaxLengthDerivedFromJdoColumnAnnotationFacetFactory extends FacetFa
 
         // only applies to JDO entities; ignore any view models
         final Class<?> cls = processMethodContext.getCls();
-        if(!MetaInfo.isPersistenceEnhanced(cls)) {
+        if(!JdoMetamodelUtil.isPersistenceEnhanced(cls)) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentAnnotationFacetFactory.java
index 9175ce8..cdecd20 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentAnnotationFacetFactory.java
@@ -20,7 +20,7 @@ package org.apache.isis.objectstore.jdo.metamodel.facets.prop.notpersistent;
 
 import javax.jdo.annotations.NotPersistent;
 
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
@@ -39,7 +39,7 @@ public class JdoNotPersistentAnnotationFacetFactory extends FacetFactoryAbstract
 
         // only applies to JDO entities; ignore any view models
         final Class<?> cls = processMethodContext.getCls();
-        if(!MetaInfo.isPersistenceEnhanced(cls)) {
+        if(!JdoMetamodelUtil.isPersistenceEnhanced(cls)) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
index 77ab1bf..410d44d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
@@ -20,7 +20,7 @@ package org.apache.isis.objectstore.jdo.metamodel.facets.prop.primarykey;
 
 import javax.jdo.annotations.PrimaryKey;
 
-import org.apache.isis.core.commons.util.MetaInfo;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
@@ -39,7 +39,7 @@ public class JdoPrimaryKeyAnnotationFacetFactory extends FacetFactoryAbstract {
 
         // ignore any view models
         final Class<?> cls = processMethodContext.getCls();
-        if(!MetaInfo.isPersistenceEnhanced(cls)) {
+        if(!JdoMetamodelUtil.isPersistenceEnhanced(cls)) {
             return;
         }
 
diff --git a/core/plugins/jdo-datanucleus-4/pom.xml b/core/plugins/jdo-datanucleus-4/pom.xml
new file mode 100644
index 0000000..180b1c5
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-4/pom.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
+	license agreements. See the NOTICE file distributed with this work for additional 
+	information regarding copyright ownership. The ASF licenses this file to 
+	you under the Apache License, Version 2.0 (the "License"); you may not use 
+	this file except in compliance with the License. You may obtain a copy of 
+	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
+	by applicable law or agreed to in writing, software distributed under the 
+	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
+	OF ANY KIND, either express or implied. See the License for the specific 
+	language governing permissions and limitations under the License. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.isis.core</groupId>
+		<artifactId>isis</artifactId>
+		<version>2.0.0-M1-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>isis-core-plugins-jdo-datanucleus-4</artifactId>
+
+	<name>Apache Isis JDO Plugin (Datanucleus 4)</name>
+	<description>
+        JDO plugin using datanucleus.
+    </description>
+
+	<properties>
+		<jar-plugin.automaticModuleName>org.apache.isis.plugins.jdo-datanucleus-4</jar-plugin.automaticModuleName>
+		<git-plugin.propertiesDir>org/apache/isis/plugins/jdo-datanucleus-4</git-plugin.propertiesDir>
+	</properties>
+
+	<build>
+		<resources>
+			<resource>
+				<filtering>false</filtering>
+				<directory>src/main/resources</directory>
+			</resource>
+			<resource>
+				<filtering>false</filtering>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**</include>
+				</includes>
+				<excludes>
+					<exclude>**/*.java</exclude>
+				</excludes>
+			</resource>
+		</resources>
+		<testResources>
+            <testResource>
+                <filtering>false</filtering>
+                <directory>src/test/resources</directory>
+            </testResource>
+            <testResource>
+                <filtering>false</filtering>
+                <directory>src/test/java</directory>
+                <includes>
+                    <include>**</include>
+                </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
+            </testResource>
+        </testResources>
+	</build>
+
+	<dependencies>
+
+		<!-- DataNucleus -->
+
+<!-- inherit from standard API -->		
+<!-- 		<dependency> -->
+<!-- 			<groupId>org.datanucleus</groupId> -->
+<!-- 			<artifactId>javax.jdo</artifactId> -->
+<!-- 			<version>${dn4-jdo-api.version}</version> -->
+<!-- 		</dependency> -->
+
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-core</artifactId>
+			<version>${dn4-core.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-api-jdo</artifactId>
+			<version>${dn4-api-jdo.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-jdo-query</artifactId>
+			<version>${dn4-jdo-query.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-rdbms</artifactId>
+			<version>${dn4-rdbms.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-jodatime</artifactId>
+			<version>${dn4-jodatime.version}</version>
+		</dependency>
+
+		<!-- Core Runtime -->
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-runtime</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		
+		<!-- TESTING -->
+		
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-runtime</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-metamodel</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+		
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-unittestsupport</artifactId>
+            <scope>test</scope>
+        </dependency>
+        
+	</dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apacha/isis/plugins/jdo/dn4/IsisJdoSupportPlugin4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apacha/isis/plugins/jdo/dn4/IsisJdoSupportPlugin4.java
new file mode 100644
index 0000000..6f3d959
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apacha/isis/plugins/jdo/dn4/IsisJdoSupportPlugin4.java
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apacha.isis.plugins.jdo.dn4;
+
+import javax.annotation.Nullable;
+
+import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
+import org.apache.isis.core.metamodel.IsisJdoRuntimePlugin;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory4;
+
+public class IsisJdoSupportPlugin4 implements IsisJdoMetamodelPlugin, IsisJdoRuntimePlugin {
+
+	@Override
+	public boolean isPersistenceEnhanced(@Nullable Class<?> cls) {
+		if(cls==null) {
+			return false;
+		}
+		return org.datanucleus.enhancement.Persistable.class.isAssignableFrom(cls);
+	}
+
+	@Override
+	public PersistenceSessionFactory getPersistenceSessionFactory(ConfigurationServiceInternal isisConfiguration) {
+		return new PersistenceSessionFactory4(isisConfiguration);
+	}
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
similarity index 69%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
index 9b92275..028dcd2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
@@ -1,4 +1,4 @@
-/**
+/*
  *  Licensed to the Apache Software Foundation (ASF) under one or more
  *  contributor license agreements.  See the NOTICE file distributed with
  *  this work for additional information regarding copyright ownership.
@@ -14,20 +14,14 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.metamodel.services.jdosupport;
-
-class Util {
 
-    private Util(){}
+package org.apache.isis.applib.services.jdosupport;
 
-    static String withSuffix(String fileName, String suffix) {
-        if(!suffix.startsWith(".")) {
-            suffix = "." + suffix;
-        }
-        if(!fileName.endsWith(suffix)) {
-            fileName += suffix;
-        }
-        return fileName;
-    }
+/**
+ * 
+ * Just an alias.
+ * 
+ */
+public interface IsisJdoSupport extends IsisJdoSupport4 {
 
 }
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport4.java
new file mode 100644
index 0000000..afa62db
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport4.java
@@ -0,0 +1,84 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.applib.services.jdosupport;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.datanucleus.query.typesafe.BooleanExpression;
+import org.datanucleus.query.typesafe.TypesafeQuery;
+
+
+/**
+ * Service that provide a number of workarounds when using JDO/DataNucleus. 
+ */
+public interface IsisJdoSupport4 extends org.apache.isis.applib.services.jdosupport.IsisJdoSupport0 {
+
+	/**
+	 * To perform the most common use-case of executing a (type-safe) query against the specified class,
+	 * filtering using the provided {@link BooleanExpression}, then automatically cloning the returned list
+	 * and closing the query.
+	 *
+	 * <p>
+	 *     Typical usage:
+	 *     <pre>
+	 *          final QToDoItem q = QToDoItem.candidate();
+	 *          return executeQuery(ToDoItem.class,
+	 *                              q.atPath.eq(atPath).and(
+	 *                              q.description.indexOf(description).gt(0))
+	 *                              );
+	 *     </pre>
+	 * </p>
+	 */
+	@Programmatic
+	<T> List<T> executeQuery(final Class<T> cls, final BooleanExpression booleanExpression);
+
+	/**
+	 * To perform a common use-case of executing a (type-safe) query against the specified class,
+	 * filtering a unique match using the provided {@link BooleanExpression}, then returning
+	 * the result and closing the query.
+	 *
+	 * <p>
+	 *     Typical usage:
+	 *     <pre>
+	 *          final QToDoItem q = QToDoItem.candidate();
+	 *          return executeQueryUnique(ToDoItem.class,
+	 *                              q.atPath.eq(atPath).and(
+	 *                              q.description.eq(description))
+	 *                              );
+	 *     </pre>
+	 * </p>
+	 */
+	@Programmatic
+	<T> T executeQueryUnique(final Class<T> cls, final BooleanExpression booleanExpression);
+
+	/**
+	 * To support the execution of type-safe queries using DataNucleus' lower-level APIs
+	 * (eg for group by and so on).
+	 *
+	 * <p>
+	 *     Responsibility for cloning any result sets and closing the query is the responsibility
+	 *     of the caller.
+	 * </p>
+	 */
+	@Programmatic
+	<T> TypesafeQuery<T> newTypesafeQuery(Class<T> cls);
+	
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/IsisJdoSupportImpl.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportImpl4.java
similarity index 94%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/IsisJdoSupportImpl.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportImpl4.java
index a9a2ac5..9986096 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/IsisJdoSupportImpl.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportImpl4.java
@@ -17,7 +17,7 @@
  *  under the License.
  */
 
-package org.apache.isis.objectstore.jdo.datanucleus.service.support;
+package org.apache.isis.applib.services.jdosupport;
 
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
@@ -32,24 +32,22 @@ import javax.jdo.Extent;
 import javax.jdo.PersistenceManager;
 import javax.jdo.datastore.JDOConnection;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.datanucleus.api.jdo.JDOPersistenceManager;
-import org.datanucleus.query.typesafe.BooleanExpression;
-import org.datanucleus.query.typesafe.TypesafeQuery;
-
 import org.apache.isis.applib.FatalException;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.runtime.persistence.ObjectPersistenceException;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.datanucleus.api.jdo.JDOPersistenceManager;
+import org.datanucleus.query.typesafe.BooleanExpression;
+import org.datanucleus.query.typesafe.TypesafeQuery;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 
 /**
@@ -64,7 +62,7 @@ import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
         nature = NatureOfService.DOMAIN,
         menuOrder = "" + Integer.MAX_VALUE
 )
-public class IsisJdoSupportImpl implements IsisJdoSupport {
+public class IsisJdoSupportImpl4 implements IsisJdoSupport4 {
     
     @Programmatic
     @Override
@@ -158,12 +156,9 @@ public class IsisJdoSupportImpl implements IsisJdoSupport {
             
             // temporarily disable concurrency checking while this method is performed
             try {
-                ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Callable<Void>() {
-                    @Override
-                    public Void call() {
-                        getJdoPersistenceManager().deletePersistentAll(instances);
-                        return null;
-                    }
+                ConcurrencyChecking.executeWithConcurrencyCheckingDisabled((Callable<Void>) () -> {
+                    getJdoPersistenceManager().deletePersistentAll(instances);
+                    return null;
                 });
             } catch (final Exception ex) {
                 throw new FatalException(ex);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusIdLong.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusIdLong.java
similarity index 100%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusIdLong.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusIdLong.java
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionLong.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionLong.java
similarity index 100%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionLong.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionLong.java
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionTimestamp.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionTimestamp.java
similarity index 100%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionTimestamp.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionTimestamp.java
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
similarity index 98%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
index ab729ff..26da55e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
@@ -24,8 +24,6 @@ import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.metadata.TypeMetadata;
 import javax.xml.bind.JAXBException;
 
-import org.datanucleus.enhancement.Persistable;
-
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Contributed;
@@ -34,8 +32,9 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport0;
 import org.apache.isis.applib.value.Clob;
+import org.datanucleus.enhancement.Persistable;
 
 @Mixin(method = "act")
 public class Persistable_downloadJdoMetadata {
@@ -81,6 +80,6 @@ public class Persistable_downloadJdoMetadata {
     }
 
     @javax.inject.Inject
-    IsisJdoSupport jdoSupport;
+    IsisJdoSupport0 jdoSupport;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
similarity index 100%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
similarity index 97%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index 0e935a8..fab2a31 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -19,9 +19,8 @@
 
 package org.apache.isis.core.runtime.persistence.adapter;
 
-import org.datanucleus.enhancement.Persistable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.Ensure;
@@ -42,10 +41,10 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.Specification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
+import org.datanucleus.enhancement.Persistable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
 
@@ -55,7 +54,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
 
     private final AuthenticationSession authenticationSession;
     private final SpecificationLoader specificationLoader;
-    private final PersistenceSession persistenceSession;
+    private final PersistenceSession4 persistenceSession;
 
     /**
      * can be {@link #replacePojo(Object) replace}d.
@@ -76,7 +75,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
             final Oid oid,
             final AuthenticationSession authenticationSession,
             final SpecificationLoader specificationLoader,
-            final PersistenceSession persistenceSession) {
+            final PersistenceSession4 persistenceSession) {
 
         this.persistenceSession = persistenceSession;
         this.specificationLoader = specificationLoader;
@@ -421,7 +420,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
      *
      * <p>
      *     Specifically, if an action which has been annotated (is copied by {@link org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet action invocation facet}), and for a parented collection
-     *     (is copied by the {@link PersistenceSession} when {@link PersistenceSession#adapterFor(Object, ObjectAdapter, OneToManyAssociation) creating} an adapter for a collection.
+     *     (is copied by the {@link PersistenceSession5} when {@link PersistenceSession5#adapterFor(Object, ObjectAdapter, OneToManyAssociation) creating} an adapter for a collection.
      * </p>
      */
     @Override
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents4.java
similarity index 97%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents4.java
index 4e8d9fa..d6a0608 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents4.java
@@ -25,39 +25,38 @@ import java.util.Set;
 import javax.jdo.JDOHelper;
 import javax.jdo.PersistenceManagerFactory;
 
-import com.google.common.base.Joiner;
-import com.google.common.collect.Maps;
-
-import org.datanucleus.PersistenceNucleusContext;
-import org.datanucleus.PropertyNames;
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.datanucleus.metadata.MetaDataListener;
-import org.datanucleus.metadata.MetaDataManager;
-import org.datanucleus.store.StoreManager;
-import org.datanucleus.store.schema.SchemaAwareStoreManager;
-
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.objectstore.jdo.datanucleus.CreateSchemaObjectFromClassMetadata;
+import org.apache.isis.objectstore.jdo.datanucleus.CreateSchemaObjectFromClassMetadata4;
 import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusLifeCycleHelper;
 import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPropertiesAware;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoNamedQuery;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoQueryFacet;
+import org.datanucleus.PersistenceNucleusContext;
+import org.datanucleus.PropertyNames;
+import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.datanucleus.metadata.MetaDataListener;
+import org.datanucleus.metadata.MetaDataManager;
+import org.datanucleus.store.StoreManager;
+import org.datanucleus.store.schema.SchemaAwareStoreManager;
 
-public class DataNucleusApplicationComponents implements ApplicationScopedComponent {
+import com.google.common.base.Joiner;
+import com.google.common.collect.Maps;
+
+public class DataNucleusApplicationComponents4 implements ApplicationScopedComponent {
 
     public static final String CLASS_METADATA_LOADED_LISTENER_KEY = "classMetadataLoadedListener";
-    static final String CLASS_METADATA_LOADED_LISTENER_DEFAULT = CreateSchemaObjectFromClassMetadata.class.getName();
+    static final String CLASS_METADATA_LOADED_LISTENER_DEFAULT = CreateSchemaObjectFromClassMetadata4.class.getName();
 
     ///////////////////////////////////////////////////////////////////////////
     // JRebel support
     ///////////////////////////////////////////////////////////////////////////
 
-    private static DataNucleusApplicationComponents instance;
+    private static DataNucleusApplicationComponents4 instance;
     
     /**
      * For JRebel plugin
@@ -89,7 +88,7 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
     private Map<String, JdoNamedQuery> namedQueryByName;
     private PersistenceManagerFactory persistenceManagerFactory;
 
-    public DataNucleusApplicationComponents(
+    public DataNucleusApplicationComponents4(
             final IsisConfiguration configuration,
             final SpecificationLoader specificationLoader,
             final Map<String, String> datanucleusProps,
@@ -271,3 +270,4 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
     
 
 }
+
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener2.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener2.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener2.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener2.java
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
similarity index 98%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
index d0698af..3a9404c 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
@@ -18,6 +18,10 @@
  */
 package org.apache.isis.core.runtime.system.persistence;
 
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+
 import java.lang.reflect.Array;
 import java.lang.reflect.Modifier;
 import java.sql.Timestamp;
@@ -35,15 +39,8 @@ import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.identity.SingleFieldIdentity;
 import javax.jdo.listener.InstanceLifecycleListener;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.datanucleus.enhancement.Persistable;
-import org.datanucleus.exceptions.NucleusObjectNotFoundException;
-import org.datanucleus.identity.DatastoreIdImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import org.apache.isis.applib.internal.collections._Lists;
+import org.apache.isis.applib.internal.collections._Maps;
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
@@ -60,7 +57,6 @@ import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.applib.services.metrics.MetricsService;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.components.SessionScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.ensure.IsisAssertException;
@@ -116,7 +112,6 @@ import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureAbstract;
@@ -135,24 +130,25 @@ import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.Persisten
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.spi.JdoObjectIdSerializer;
+import org.datanucleus.enhancement.Persistable;
+import org.datanucleus.exceptions.NucleusObjectNotFoundException;
+import org.datanucleus.identity.DatastoreIdImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 /**
  * A wrapper around the JDO {@link PersistenceManager}, which also manages concurrency
  * and maintains an identity map of {@link ObjectAdapter adapter}s and {@link Oid
  * identities} for each and every POJO that is being used by the framework.
  */
-public class PersistenceSession implements
-        TransactionalResource,
-        SessionScopedComponent,
-        AdapterManager,
+public class PersistenceSession4 implements PersistenceSession,
         IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     // -- constants
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession.class);
+    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession4.class);
 
     /**
      * @see #isFixturesInstalled()
@@ -167,8 +163,8 @@ public class PersistenceSession implements
      */
     public static final String DATANUCLEUS_PROPERTIES_ROOT = ROOT_KEY + "impl.";
 
-    public static final String SERVICE_IDENTIFIER = "1";
-
+    //defined on PersistenceSession interface 
+    //public static final String SERVICE_IDENTIFIER = "1";
     
 
     // -- constructor, fields, finalize()
@@ -211,7 +207,7 @@ public class PersistenceSession implements
     /**
      * populated only when {@link #open()}ed.
      */
-    private final Map<Class<?>, PersistenceQueryProcessor<?>> persistenceQueryProcessorByClass = Maps.newHashMap();
+    private final Map<Class<?>, PersistenceQueryProcessor<?>> persistenceQueryProcessorByClass = _Maps.newHashMap();
 
 
     private final boolean concurrencyCheckingGloballyEnabled;
@@ -221,7 +217,7 @@ public class PersistenceSession implements
      * Initialize the object store so that calls to this object store access
      * persisted objects and persist changes to the object that are saved.
      */
-    public PersistenceSession(
+    public PersistenceSession4(
             final ServicesInjector servicesInjector,
             final AuthenticationSession authenticationSession,
             final PersistenceManagerFactory jdoPersistenceManagerFactory,
@@ -771,7 +767,7 @@ public class PersistenceSession implements
 
     public List<ObjectAdapter> getServices() {
         final List<Object> services = servicesInjector.getRegisteredServices();
-        final List<ObjectAdapter> serviceAdapters = Lists.newArrayList();
+        final List<ObjectAdapter> serviceAdapters = _Lists.newArrayList();
         for (final Object servicePojo : services) {
             ObjectAdapter serviceAdapter = getAdapterFor(servicePojo);
             if(serviceAdapter == null) {
@@ -970,7 +966,7 @@ public class PersistenceSession implements
             return zip(rootOids, Collections.emptyList());
         }
 
-        final List<Object> dnOids = Lists.newArrayList();
+        final List<Object> dnOids = _Lists.newArrayList();
         for (final RootOid rootOid : rootOids) {
             final Object id = JdoObjectIdSerializer.toJdoObjectId(rootOid);
             if(id instanceof SingleFieldIdentity) {
@@ -1110,7 +1106,7 @@ public class PersistenceSession implements
      * Makes an {@link ObjectAdapter} persistent. The specified object should be
      * stored away via this object store's persistence mechanism, and have a
      * new and unique OID assigned to it. The object, should also be added to
-     * the {@link PersistenceSession} as the object is implicitly 'in use'.
+     * the {@link PersistenceSession4} as the object is implicitly 'in use'.
      *
      * <p>
      * If the object has any associations then each of these, where they aren't
@@ -1138,7 +1134,7 @@ public class PersistenceSession implements
                 makePersistentTransactionAssumed(adapter);
 
                 // clear out the map of transient -> persistent
-                PersistenceSession.this.persistentByTransient.clear();
+                PersistenceSession4.this.persistentByTransient.clear();
             }
 
         });
@@ -1282,7 +1278,7 @@ public class PersistenceSession implements
 
     // -- getAggregateRoot, remappedFrom
 
-    private Map<Oid, Oid> persistentByTransient = Maps.newHashMap();
+    private Map<Oid, Oid> persistentByTransient = _Maps.newHashMap();
 
     public ObjectAdapter getAggregateRoot(final ParentedCollectionOid collectionOid) {
         final Oid rootOid = collectionOid.getRootOid();
@@ -1555,9 +1551,9 @@ public class PersistenceSession implements
             final List<RootOid> rootOids,
             final ConcurrencyChecking concurrencyChecking) {
 
-        final Map<RootOid, ObjectAdapter> adapterByOid = Maps.newLinkedHashMap();
+        final Map<RootOid, ObjectAdapter> adapterByOid = _Maps.newLinkedHashMap();
 
-        List<RootOid> notYetLoadedOids = Lists.newArrayList();
+        List<RootOid> notYetLoadedOids = _Lists.newArrayList();
         for (RootOid rootOid : rootOids) {
             // attempt to locate adapter for the Oid
             ObjectAdapter adapter = getAdapterFor(rootOid);
@@ -1816,7 +1812,7 @@ public class PersistenceSession implements
      *
      * <p>
      * Note that there is no management of {@link Version}s here. That is
-     * because the {@link PersistenceSession} is expected to manage this.
+     * because the {@link PersistenceSession4} is expected to manage this.
      *
      * @param hintRootOid - allow a different persistent root oid to be provided.
      */
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory4.java
similarity index 92%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory4.java
index ad72168..f4a70e2 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory4.java
@@ -24,21 +24,20 @@ import java.util.Set;
 
 import javax.jdo.PersistenceManagerFactory;
 
-import org.datanucleus.PropertyNames;
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
 import org.apache.isis.objectstore.jdo.datanucleus.JDOStateManagerForIsis;
 import org.apache.isis.objectstore.jdo.service.RegisterEntities;
+import org.datanucleus.PropertyNames;
+import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  *
@@ -49,13 +48,14 @@ import org.apache.isis.objectstore.jdo.service.RegisterEntities;
  * must be annotated using {@link Programmatic}.
  * </p>
  */
-public class PersistenceSessionFactory implements ApplicationScopedComponent, FixturesInstalledFlag {
+public class PersistenceSessionFactory4 implements 
+PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstalledFlag {
 
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSessionFactory.class);
+    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSessionFactory4.class);
 
-    private final IsisConfigurationDefault configuration;
+    private final ConfigurationServiceInternal configuration;
 
-    public PersistenceSessionFactory(final IsisConfigurationDefault isisConfiguration) {
+    public PersistenceSessionFactory4(final ConfigurationServiceInternal isisConfiguration) {
         this.configuration = isisConfiguration;
     }
 
@@ -63,7 +63,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
     public static final String DATANUCLEUS_CONFIG_PREFIX = "isis.persistor.datanucleus.impl"; // reserved for datanucleus' own config props
 
 
-    private DataNucleusApplicationComponents applicationComponents;
+    private DataNucleusApplicationComponents4 applicationComponents;
 
     @Programmatic
     public void init(final SpecificationLoader specificationLoader) {
@@ -75,7 +75,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
         return this.applicationComponents != null;
     }
 
-    private DataNucleusApplicationComponents createDataNucleusApplicationComponents(
+    private DataNucleusApplicationComponents4 createDataNucleusApplicationComponents(
             final IsisConfiguration configuration, final SpecificationLoader specificationLoader) {
 
         if (applicationComponents == null || applicationComponents.isStale()) {
@@ -90,7 +90,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
             final RegisterEntities registerEntities = new RegisterEntities(specificationLoader);
             final Set<String> classesToBePersisted = registerEntities.getEntityTypes();
 
-            applicationComponents = new DataNucleusApplicationComponents(jdoObjectstoreConfig, specificationLoader,
+            applicationComponents = new DataNucleusApplicationComponents4(jdoObjectstoreConfig, specificationLoader,
                     datanucleusProps, classesToBePersisted);
         }
 
@@ -177,7 +177,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
         final PersistenceManagerFactory persistenceManagerFactory =
                 applicationComponents.getPersistenceManagerFactory();
 
-        return new PersistenceSession(
+        return new PersistenceSession4(
                 servicesInjector,
                 authenticationSession, persistenceManagerFactory,
                 fixturesInstalledFlag);
@@ -199,3 +199,4 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
 
 
 }
+
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/Utils.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/Utils.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/Utils.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/Utils.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata4.java
similarity index 96%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata4.java
index fdffb95..7020e9b 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata4.java
@@ -25,8 +25,7 @@ import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Map;
 
-import com.google.common.base.Strings;
-
+import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPropertiesAware;
 import org.datanucleus.ClassLoaderResolver;
 import org.datanucleus.enhancer.EnhancementNucleusContextImpl;
 import org.datanucleus.metadata.AbstractClassMetaData;
@@ -35,12 +34,14 @@ import org.datanucleus.store.encryption.ConnectionEncryptionProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Strings;
+
 /**
  * Implementation note: the methods in this class are <tt>protected</tt> to allow for easy subclassing.
  */
-public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, DataNucleusPropertiesAware {
+public class CreateSchemaObjectFromClassMetadata4 implements MetaDataListener, DataNucleusPropertiesAware {
 
-    private static final Logger LOG = LoggerFactory.getLogger(CreateSchemaObjectFromClassMetadata.class);
+    private static final Logger LOG = LoggerFactory.getLogger(CreateSchemaObjectFromClassMetadata4.class);
 
     // -- persistenceManagerFactory, properties
 
@@ -195,7 +196,7 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
                 ClassLoaderResolver clr = new EnhancementNucleusContextImpl("JDO", properties).getClassLoaderResolver(null);
                 try
                 {
-                    Class decrypterCls = clr.classForName(decrypterName);
+                    Class<?> decrypterCls = clr.classForName(decrypterName);
                     ConnectionEncryptionProvider decrypter = (ConnectionEncryptionProvider) decrypterCls.newInstance();
                     password = decrypter.decrypt(password);
                 }
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
similarity index 94%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
index 47fd736..03b1ba6 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
@@ -18,12 +18,11 @@
  */
 package org.apache.isis.objectstore.jdo.datanucleus.persistence;
 
+import org.apache.isis.core.runtime.system.persistence.IsisLifecycleListener2;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.isis.core.runtime.system.persistence.IsisLifecycleListener2;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-
 /**
  * @deprecated - retained only for backward compatibility of logging (in logging.properties file).
  */
@@ -32,7 +31,7 @@ public class IsisLifecycleListener extends IsisLifecycleListener2 {
 
     public static final Logger LOG = LoggerFactory.getLogger(IsisLifecycleListener.class);
 
-    public IsisLifecycleListener(final PersistenceSession persistenceSession) {
+    public IsisLifecycleListener(final PersistenceSession4 persistenceSession) {
         super(persistenceSession);
         throw new RuntimeException("Use IsisLifecycleListener2 instead");
     }
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
similarity index 98%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
index 4f10cc4..3d5d44f 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
@@ -22,19 +22,18 @@ import java.util.List;
 
 import javax.jdo.Query;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class PersistenceQueryFindAllInstancesProcessor extends PersistenceQueryProcessorAbstract<PersistenceQueryFindAllInstances> {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFindAllInstancesProcessor.class);
 
-    public PersistenceQueryFindAllInstancesProcessor(final PersistenceSession persistenceSession) {
+    public PersistenceQueryFindAllInstancesProcessor(final PersistenceSession4 persistenceSession) {
         super(persistenceSession);
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
similarity index 99%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
index d6c3b4e..e4bc83f 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
@@ -24,25 +24,24 @@ import java.util.Map;
 
 import javax.jdo.Query;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
 import org.apache.isis.objectstore.jdo.datanucleus.metamodel.JdoPropertyUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDefault> {
     
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFindUsingApplibQueryProcessor.class);
 
-    public PersistenceQueryFindUsingApplibQueryProcessor(final PersistenceSession persistenceSession) {
+    public PersistenceQueryFindUsingApplibQueryProcessor(final PersistenceSession4 persistenceSession) {
         super(persistenceSession);
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessor.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessor.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessor.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessor.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
similarity index 90%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
index 1c93252..2014fe7 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
@@ -22,30 +22,29 @@ import java.util.List;
 
 import javax.jdo.listener.InstanceLifecycleEvent;
 
-import com.google.common.collect.Lists;
-
-import org.datanucleus.enhancement.Persistable;
-
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.runtime.system.persistence.IsisLifecycleListener2;
 import org.apache.isis.core.runtime.system.persistence.PersistenceQuery;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
+import org.datanucleus.enhancement.Persistable;
+
+import com.google.common.collect.Lists;
 
 public abstract class PersistenceQueryProcessorAbstract<T extends PersistenceQuery>
         implements PersistenceQueryProcessor<T> {
 
 
-    final PersistenceSession persistenceSession;
+    final PersistenceSession4 persistenceSession;
 
-    protected PersistenceQueryProcessorAbstract(final PersistenceSession persistenceSession) {
+    protected PersistenceQueryProcessorAbstract(final PersistenceSession4 persistenceSession) {
         this.persistenceSession = persistenceSession;
     }
 
 
     /**
      * Traversing the provided list causes (or should cause) the
-     * {@link IsisLifecycleListener#postLoad(InstanceLifecycleEvent) {
+     * {@link IsisLifecycleListener2#postLoad(InstanceLifecycleEvent) {
      * to be called.
      */
     protected List<ObjectAdapter> loadAdapters(final List<?> pojos) {
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java
similarity index 95%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java
index 3764689..d634874 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java
@@ -46,10 +46,10 @@ import org.apache.isis.objectstore.jdo.datanucleus.JDOStateManagerForIsis.Hint;
 public class EventBusServiceJdo extends EventBusServiceDefault {
 
     /**
-     * skip if called in any way by way of the {@link JDOStateManagerForIsis}.
+     * skip if called in any way by way of the {@link JDOStateManagerForIsis5}.
      * 
      * <p>
-     * The {@link JDOStateManagerForIsis} sets a {@link JDOStateManagerForIsis#hint threadlocal}
+     * The {@link JDOStateManagerForIsis5} sets a {@link JDOStateManagerForIsis5#hint threadlocal}
      * if it has been called.
      */
     @Programmatic
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisPasswordConverter.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisPasswordConverter.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisPasswordConverter.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisPasswordConverter.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisBlobMapping.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisBlobMapping.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisBlobMapping.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisBlobMapping.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisClobMapping.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisClobMapping.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisClobMapping.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisClobMapping.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisMoneyMapping.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisMoneyMapping.java
similarity index 100%
copy from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisMoneyMapping.java
copy to core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisMoneyMapping.java
diff --git a/core/plugins/jdo-datanucleus-4/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin b/core/plugins/jdo-datanucleus-4/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin
new file mode 100644
index 0000000..3ff30b8
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-4/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin
@@ -0,0 +1 @@
+org.apacha.isis.plugins.jdo.dn4.IsisJdoSupportPlugin4
\ No newline at end of file
diff --git a/core/plugins/jdo-datanucleus-4/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoRuntimePlugin b/core/plugins/jdo-datanucleus-4/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoRuntimePlugin
new file mode 100644
index 0000000..3ff30b8
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-4/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoRuntimePlugin
@@ -0,0 +1 @@
+org.apacha.isis.plugins.jdo.dn4.IsisJdoSupportPlugin4
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
similarity index 98%
copy from core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
index 2c68c1b..2c2a5b7 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
+++ b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
@@ -19,13 +19,10 @@
 
 package org.apache.isis.core.runtime.persistence.adapterfactory.pojo;
 
-import java.util.Date;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
 
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
+import java.util.Date;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -36,12 +33,14 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PojoAdapterBuilder;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
 
 public class PojoAdapterTest {
 
@@ -60,7 +59,7 @@ public class PojoAdapterTest {
     @Mock
     private AuthenticationSession mockAuthenticationSession;
     @Mock
-    private PersistenceSession mockPersistenceSession;
+    private PersistenceSession4 mockPersistenceSession;
 
     @Before
     public void setUp() throws Exception {
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
similarity index 97%
copy from core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
index 164e2c0..14dedef 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
+++ b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
@@ -21,8 +21,6 @@ package org.apache.isis.core.runtime.persistence.objectstore.transaction;
 
 import java.util.Iterator;
 
-import com.google.common.base.Splitter;
-
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
@@ -32,11 +30,13 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
+
+import com.google.common.base.Splitter;
 
 public class PojoAdapterBuilder {
 
-    private PersistenceSession persistenceSession;
+    private PersistenceSession4 persistenceSession;
 
     private PojoAdapterBuilder(){
     }
@@ -163,7 +163,7 @@ public class PojoAdapterBuilder {
         return this;
     }
 
-    public PojoAdapterBuilder with(PersistenceSession persistenceSession) {
+    public PojoAdapterBuilder with(PersistenceSession4 persistenceSession) {
         this.persistenceSession = persistenceSession;
         return this;
     }
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
similarity index 100%
copy from core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactoryTest.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactoryTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithBigDecimalColumnAnnotations.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithBigDecimalColumnAnnotations.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithBigDecimalColumnAnnotations.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithBigDecimalColumnAnnotations.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAllowsNullAnnotations.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAllowsNullAnnotations.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAllowsNullAnnotations.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAllowsNullAnnotations.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/SimpleObjectWithNotPersistentColumn.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/SimpleObjectWithNotPersistentColumn.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/SimpleObjectWithNotPersistentColumn.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/SimpleObjectWithNotPersistentColumn.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/SimpleObjectWithPrimaryKey.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/SimpleObjectWithPrimaryKey.java
similarity index 100%
copy from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/SimpleObjectWithPrimaryKey.java
copy to core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/SimpleObjectWithPrimaryKey.java
diff --git a/core/plugins/jdo-datanucleus-5/pom.xml b/core/plugins/jdo-datanucleus-5/pom.xml
new file mode 100644
index 0000000..b25f61e
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-5/pom.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
+	license agreements. See the NOTICE file distributed with this work for additional 
+	information regarding copyright ownership. The ASF licenses this file to 
+	you under the Apache License, Version 2.0 (the "License"); you may not use 
+	this file except in compliance with the License. You may obtain a copy of 
+	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
+	by applicable law or agreed to in writing, software distributed under the 
+	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
+	OF ANY KIND, either express or implied. See the License for the specific 
+	language governing permissions and limitations under the License. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.isis.core</groupId>
+		<artifactId>isis</artifactId>
+		<version>2.0.0-M1-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>isis-core-plugins-jdo-datanucleus-5</artifactId>
+
+	<name>Apache Isis JDO Plugin (Datanucleus 5)</name>
+	<description>
+        JDO plugin using datanucleus.
+    </description>
+
+	<properties>
+		<jar-plugin.automaticModuleName>org.apache.isis.plugins.jdo-datanucleus-5</jar-plugin.automaticModuleName>
+		<git-plugin.propertiesDir>org/apache/isis/plugins/jdo-datanucleus-5</git-plugin.propertiesDir>
+	</properties>
+
+	<build>
+		<resources>
+			<resource>
+				<filtering>false</filtering>
+				<directory>src/main/resources</directory>
+			</resource>
+			<resource>
+				<filtering>false</filtering>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**</include>
+				</includes>
+				<excludes>
+					<exclude>**/*.java</exclude>
+				</excludes>
+			</resource>
+		</resources>
+		<testResources>
+            <testResource>
+                <filtering>false</filtering>
+                <directory>src/test/resources</directory>
+            </testResource>
+            <testResource>
+                <filtering>false</filtering>
+                <directory>src/test/java</directory>
+                <includes>
+                    <include>**</include>
+                </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
+            </testResource>
+        </testResources>
+	</build>
+
+	<dependencies>
+
+		<!-- DataNucleus -->
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>javax.jdo</artifactId>
+			<version>${dn5-jdo-api.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-core</artifactId>
+			<version>${dn5-core.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-api-jdo</artifactId>
+			<version>${dn5-api-jdo.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-jdo-query</artifactId>
+			<version>${dn5-jdo-query.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-rdbms</artifactId>
+			<version>${dn5-rdbms.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.datanucleus</groupId>
+			<artifactId>datanucleus-jodatime</artifactId>
+			<version>${dn5-jodatime.version}</version>
+		</dependency>
+
+		<!-- Core Runtime -->
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-runtime</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		
+		<!-- TESTING -->
+		
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-runtime</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-metamodel</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+		
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-unittestsupport</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+	</dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apacha/isis/plugins/jdo/dn5/IsisJdoSupportPlugin5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apacha/isis/plugins/jdo/dn5/IsisJdoSupportPlugin5.java
new file mode 100644
index 0000000..3eedf3f
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apacha/isis/plugins/jdo/dn5/IsisJdoSupportPlugin5.java
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apacha.isis.plugins.jdo.dn5;
+
+import javax.annotation.Nullable;
+
+import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
+import org.apache.isis.core.metamodel.IsisJdoRuntimePlugin;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory5;
+
+public class IsisJdoSupportPlugin5 implements IsisJdoMetamodelPlugin, IsisJdoRuntimePlugin {
+
+	@Override
+	public boolean isPersistenceEnhanced(@Nullable Class<?> cls) {
+		if(cls==null) {
+			return false;
+		}
+		return org.datanucleus.enhancement.Persistable.class.isAssignableFrom(cls);
+	}
+
+	@Override
+	public PersistenceSessionFactory getPersistenceSessionFactory(ConfigurationServiceInternal isisConfiguration) {
+		return new PersistenceSessionFactory5(isisConfiguration);
+	}
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
similarity index 69%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
copy to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
index 9b92275..de412b7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
@@ -1,4 +1,4 @@
-/**
+/*
  *  Licensed to the Apache Software Foundation (ASF) under one or more
  *  contributor license agreements.  See the NOTICE file distributed with
  *  this work for additional information regarding copyright ownership.
@@ -14,20 +14,13 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.metamodel.services.jdosupport;
-
-class Util {
-
-    private Util(){}
+package org.apache.isis.applib.services.jdosupport;
 
-    static String withSuffix(String fileName, String suffix) {
-        if(!suffix.startsWith(".")) {
-            suffix = "." + suffix;
-        }
-        if(!fileName.endsWith(suffix)) {
-            fileName += suffix;
-        }
-        return fileName;
-    }
+/**
+ * 
+ * Just an alias.
+ *
+ */
+public interface IsisJdoSupport extends IsisJdoSupport5 {
 
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport5.java
similarity index 54%
rename from core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport5.java
index 4ca5c10..8c5e2b2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport5.java
@@ -19,70 +19,17 @@
 
 package org.apache.isis.applib.services.jdosupport;
 
-import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 
-import javax.jdo.PersistenceManager;
-
-import org.datanucleus.query.typesafe.BooleanExpression;
-import org.datanucleus.query.typesafe.TypesafeQuery;
+import javax.jdo.JDOQLTypedQuery;
+import javax.jdo.query.BooleanExpression;
 
 import org.apache.isis.applib.annotation.Programmatic;
 
-
 /**
  * Service that provide a number of workarounds when using JDO/DataNucleus. 
  */
-public interface IsisJdoSupport {
-
-    /**
-     * Force a reload (corresponding to the JDO <tt>PersistenceManager</tt>'s <tt>refresh()</tt> method)
-     * of a domain objects.
-     * 
-     * <p>
-     * In fact, this may just reset the lazy-load state of the domain object, but the effect is the same: 
-     * to cause the object's state to be reloaded from the database.
-     * 
-     * <p>
-     * The particular example that led to this method being added was a 1:m bidirectional relationship,
-     * analogous to <tt>Customer <-> * Order</tt>.  Persisting the child <tt>Order</tt> object did not cause
-     * the parent <tt>Customer</tt>'s collection of orders to be updated.  In fact, JDO does not make any
-     * such guarantee to do so.  Options are therefore either to maintain the collection in code, or to
-     * refresh the parent.
-     */
-    @Programmatic
-    <T> T refresh(T domainObject);
-    
-    @Programmatic
-    void ensureLoaded(Collection<?> collectionOfDomainObjects);
-    
-    @Programmatic
-    PersistenceManager getJdoPersistenceManager();
-
-    @Programmatic
-    List<Map<String, Object>> executeSql(String sql);
-
-    @Programmatic
-    Integer executeUpdate(String sql);
-
-    /**
-     * Force the deletion of all instances of the specified class.
-     * 
-     * <p>
-     * Note: this is intended primarily for testing purposes, eg clearing existing data as part of
-     * installing fixtures.  It will generate a <tt>SQL DELETE</tt> for each instance.  To perform
-     * a bulk deletion with a single <tt>SQL DELETE</tt>, use {@link #executeUpdate(String)}.  
-     * 
-     * <p>
-     * Implementation note: It can occasionally be the case that Isis' internal adapter for the domain object is
-     * still in memory.  JDO/DataNucleus seems to bump up the version of the object prior to its deletion, 
-     * which under normal circumstances would cause Isis to throw a concurrency exception.  Therefore
-     * To prevent this from happening (ie to <i>force</i> the deletion of all instances), concurrency checking
-     * is temporarily disabled while this method is performed. 
-     */
-    @Programmatic
-    void deleteAll(Class<?>... pcClasses);
+public interface IsisJdoSupport5 extends org.apache.isis.applib.services.jdosupport.IsisJdoSupport0 {
 
     /**
      * To perform the most common use-case of executing a (type-safe) query against the specified class,
@@ -132,5 +79,5 @@ public interface IsisJdoSupport {
      * </p>
      */
     @Programmatic
-    <T> TypesafeQuery<T> newTypesafeQuery(Class<T> cls);
+    <T> JDOQLTypedQuery<T> newTypesafeQuery(Class<T> cls);
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/IsisJdoSupportImpl.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportImpl5.java
similarity index 85%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/IsisJdoSupportImpl.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportImpl5.java
index a9a2ac5..8a0a07d 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/IsisJdoSupportImpl.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportImpl5.java
@@ -17,7 +17,7 @@
  *  under the License.
  */
 
-package org.apache.isis.objectstore.jdo.datanucleus.service.support;
+package org.apache.isis.applib.services.jdosupport;
 
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
@@ -29,21 +29,15 @@ import java.util.Map;
 import java.util.concurrent.Callable;
 
 import javax.jdo.Extent;
+import javax.jdo.JDOQLTypedQuery;
 import javax.jdo.PersistenceManager;
 import javax.jdo.datastore.JDOConnection;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.datanucleus.api.jdo.JDOPersistenceManager;
-import org.datanucleus.query.typesafe.BooleanExpression;
-import org.datanucleus.query.typesafe.TypesafeQuery;
+import javax.jdo.query.BooleanExpression;
 
 import org.apache.isis.applib.FatalException;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -51,9 +45,12 @@ import org.apache.isis.core.runtime.persistence.ObjectPersistenceException;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
 
 /**
- * This service provdes a number of utility methods to supplement/support the capabilities of the JDO Objectstore.
+ * This service provides a number of utility methods to supplement/support the capabilities of the JDO Objectstore.
  *
  * <p>
  * This implementation has no UI and there are no other implementations of the service API, and so it is annotated
@@ -64,7 +61,7 @@ import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
         nature = NatureOfService.DOMAIN,
         menuOrder = "" + Integer.MAX_VALUE
 )
-public class IsisJdoSupportImpl implements IsisJdoSupport {
+public class IsisJdoSupportImpl5 implements IsisJdoSupport5 {
     
     @Programmatic
     @Override
@@ -158,12 +155,9 @@ public class IsisJdoSupportImpl implements IsisJdoSupport {
             
             // temporarily disable concurrency checking while this method is performed
             try {
-                ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Callable<Void>() {
-                    @Override
-                    public Void call() {
-                        getJdoPersistenceManager().deletePersistentAll(instances);
-                        return null;
-                    }
+                ConcurrencyChecking.executeWithConcurrencyCheckingDisabled((Callable<Void>) () -> {
+                    getJdoPersistenceManager().deletePersistentAll(instances);
+                    return null;
                 });
             } catch (final Exception ex) {
                 throw new FatalException(ex);
@@ -176,31 +170,31 @@ public class IsisJdoSupportImpl implements IsisJdoSupport {
     @Programmatic
     @Override
     public <T> List<T> executeQuery(final Class<T> cls, final BooleanExpression expression) {
-        final TypesafeQuery<T> query = newTypesafeQuery(cls).filter(expression);
+        final JDOQLTypedQuery<T> query = newTypesafeQuery(cls).filter(expression);
         return executeListAndClose(query);
     }
 
     @Programmatic
     @Override
     public <T> T executeQueryUnique(final Class<T> cls, final BooleanExpression expression) {
-        final TypesafeQuery<T> query = newTypesafeQuery(cls).filter(expression);
+        final JDOQLTypedQuery<T> query = newTypesafeQuery(cls).filter(expression);
         return executeUniqueAndClose(query);
     }
 
     @Programmatic
     @Override
-    public <T> TypesafeQuery<T> newTypesafeQuery(Class<T> cls) {
-        return ((JDOPersistenceManager)getJdoPersistenceManager()).newTypesafeQuery(cls);
+    public <T> JDOQLTypedQuery<T> newTypesafeQuery(Class<T> cls) {
+        return getJdoPersistenceManager().newJDOQLTypedQuery(cls);
     }
 
-    private static <T> List<T> executeListAndClose(final TypesafeQuery<T> query) {
+    private static <T> List<T> executeListAndClose(final JDOQLTypedQuery<T> query) {
         final List<T> elements = query.executeList();
         final List<T> list = Lists.newArrayList(elements);
         query.closeAll();
         return list;
     }
 
-    private static <T> T executeUniqueAndClose(final TypesafeQuery<T> query) {
+    private static <T> T executeUniqueAndClose(final JDOQLTypedQuery<T> query) {
         final T result = query.executeUnique();
         query.closeAll();
         return result;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusIdLong.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusIdLong.java
similarity index 100%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusIdLong.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusIdLong.java
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionLong.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionLong.java
similarity index 100%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionLong.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionLong.java
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionTimestamp.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionTimestamp.java
similarity index 100%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionTimestamp.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_datanucleusVersionTimestamp.java
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
similarity index 98%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
index ab729ff..26da55e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
@@ -24,8 +24,6 @@ import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.metadata.TypeMetadata;
 import javax.xml.bind.JAXBException;
 
-import org.datanucleus.enhancement.Persistable;
-
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Contributed;
@@ -34,8 +32,9 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport0;
 import org.apache.isis.applib.value.Clob;
+import org.datanucleus.enhancement.Persistable;
 
 @Mixin(method = "act")
 public class Persistable_downloadJdoMetadata {
@@ -81,6 +80,6 @@ public class Persistable_downloadJdoMetadata {
     }
 
     @javax.inject.Inject
-    IsisJdoSupport jdoSupport;
+    IsisJdoSupport0 jdoSupport;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
similarity index 100%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Util.java
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
similarity index 97%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index 0e935a8..f5cb832 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -42,7 +42,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.Specification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
@@ -55,7 +55,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
 
     private final AuthenticationSession authenticationSession;
     private final SpecificationLoader specificationLoader;
-    private final PersistenceSession persistenceSession;
+    private final PersistenceSession5 persistenceSession;
 
     /**
      * can be {@link #replacePojo(Object) replace}d.
@@ -76,7 +76,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
             final Oid oid,
             final AuthenticationSession authenticationSession,
             final SpecificationLoader specificationLoader,
-            final PersistenceSession persistenceSession) {
+            final PersistenceSession5 persistenceSession) {
 
         this.persistenceSession = persistenceSession;
         this.specificationLoader = specificationLoader;
@@ -421,7 +421,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
      *
      * <p>
      *     Specifically, if an action which has been annotated (is copied by {@link org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet action invocation facet}), and for a parented collection
-     *     (is copied by the {@link PersistenceSession} when {@link PersistenceSession#adapterFor(Object, ObjectAdapter, OneToManyAssociation) creating} an adapter for a collection.
+     *     (is copied by the {@link PersistenceSession5} when {@link PersistenceSession5#adapterFor(Object, ObjectAdapter, OneToManyAssociation) creating} an adapter for a collection.
      * </p>
      */
     @Override
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents5.java
similarity index 98%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents5.java
index 4e8d9fa..fab3dd2 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents5.java
@@ -25,17 +25,6 @@ import java.util.Set;
 import javax.jdo.JDOHelper;
 import javax.jdo.PersistenceManagerFactory;
 
-import com.google.common.base.Joiner;
-import com.google.common.collect.Maps;
-
-import org.datanucleus.PersistenceNucleusContext;
-import org.datanucleus.PropertyNames;
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.datanucleus.metadata.MetaDataListener;
-import org.datanucleus.metadata.MetaDataManager;
-import org.datanucleus.store.StoreManager;
-import org.datanucleus.store.schema.SchemaAwareStoreManager;
-
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.factory.InstanceUtil;
@@ -47,8 +36,18 @@ import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusLifeCycleHelper;
 import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPropertiesAware;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoNamedQuery;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoQueryFacet;
+import org.datanucleus.PersistenceNucleusContext;
+import org.datanucleus.PropertyNames;
+import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.datanucleus.metadata.MetaDataListener;
+import org.datanucleus.metadata.MetaDataManager;
+import org.datanucleus.store.StoreManager;
+import org.datanucleus.store.schema.SchemaAwareStoreManager;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Maps;
 
-public class DataNucleusApplicationComponents implements ApplicationScopedComponent {
+public class DataNucleusApplicationComponents5 implements ApplicationScopedComponent {
 
     public static final String CLASS_METADATA_LOADED_LISTENER_KEY = "classMetadataLoadedListener";
     static final String CLASS_METADATA_LOADED_LISTENER_DEFAULT = CreateSchemaObjectFromClassMetadata.class.getName();
@@ -57,7 +56,7 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
     // JRebel support
     ///////////////////////////////////////////////////////////////////////////
 
-    private static DataNucleusApplicationComponents instance;
+    private static DataNucleusApplicationComponents5 instance;
     
     /**
      * For JRebel plugin
@@ -89,7 +88,7 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
     private Map<String, JdoNamedQuery> namedQueryByName;
     private PersistenceManagerFactory persistenceManagerFactory;
 
-    public DataNucleusApplicationComponents(
+    public DataNucleusApplicationComponents5(
             final IsisConfiguration configuration,
             final SpecificationLoader specificationLoader,
             final Map<String, String> datanucleusProps,
@@ -160,7 +159,7 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
                 // (if the configured StoreMgr supports it, and if requested in isis.properties)
                 //
                 datanucleusProps.put(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_ALL, "false"); // turn off, cos want to do the schema object ourselves...
-                datanucleusProps.put(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_SCHEMA, "false");
+                datanucleusProps.put(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_DATABASE, "false");
                 datanucleusProps.put(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_TABLES, "true"); // but have DN do everything else...
                 datanucleusProps.put(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_COLUMNS, "true");
                 datanucleusProps.put(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_CONSTRAINTS, "true");
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener2.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener2.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener2.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener2.java
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
similarity index 98%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
copy to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index d0698af..39fba0e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -18,6 +18,10 @@
  */
 package org.apache.isis.core.runtime.system.persistence;
 
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+
 import java.lang.reflect.Array;
 import java.lang.reflect.Modifier;
 import java.sql.Timestamp;
@@ -35,15 +39,8 @@ import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.identity.SingleFieldIdentity;
 import javax.jdo.listener.InstanceLifecycleListener;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.datanucleus.enhancement.Persistable;
-import org.datanucleus.exceptions.NucleusObjectNotFoundException;
-import org.datanucleus.identity.DatastoreIdImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import org.apache.isis.applib.internal.collections._Lists;
+import org.apache.isis.applib.internal.collections._Maps;
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
@@ -60,7 +57,6 @@ import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.applib.services.metrics.MetricsService;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.components.SessionScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.ensure.IsisAssertException;
@@ -116,7 +112,6 @@ import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureAbstract;
@@ -135,24 +130,25 @@ import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.Persisten
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.spi.JdoObjectIdSerializer;
+import org.datanucleus.enhancement.Persistable;
+import org.datanucleus.exceptions.NucleusObjectNotFoundException;
+import org.datanucleus.identity.DatastoreIdImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 /**
  * A wrapper around the JDO {@link PersistenceManager}, which also manages concurrency
  * and maintains an identity map of {@link ObjectAdapter adapter}s and {@link Oid
  * identities} for each and every POJO that is being used by the framework.
  */
-public class PersistenceSession implements
-        TransactionalResource,
-        SessionScopedComponent,
-        AdapterManager,
+public class PersistenceSession5 implements PersistenceSession,
         IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     // -- constants
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession.class);
+    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5.class);
 
     /**
      * @see #isFixturesInstalled()
@@ -167,7 +163,8 @@ public class PersistenceSession implements
      */
     public static final String DATANUCLEUS_PROPERTIES_ROOT = ROOT_KEY + "impl.";
 
-    public static final String SERVICE_IDENTIFIER = "1";
+    //defined on PersistenceSession interface 
+    //public static final String SERVICE_IDENTIFIER = "1";
 
     
 
@@ -211,7 +208,7 @@ public class PersistenceSession implements
     /**
      * populated only when {@link #open()}ed.
      */
-    private final Map<Class<?>, PersistenceQueryProcessor<?>> persistenceQueryProcessorByClass = Maps.newHashMap();
+    private final Map<Class<?>, PersistenceQueryProcessor<?>> persistenceQueryProcessorByClass = _Maps.newHashMap();
 
 
     private final boolean concurrencyCheckingGloballyEnabled;
@@ -221,7 +218,7 @@ public class PersistenceSession implements
      * Initialize the object store so that calls to this object store access
      * persisted objects and persist changes to the object that are saved.
      */
-    public PersistenceSession(
+    public PersistenceSession5(
             final ServicesInjector servicesInjector,
             final AuthenticationSession authenticationSession,
             final PersistenceManagerFactory jdoPersistenceManagerFactory,
@@ -771,7 +768,7 @@ public class PersistenceSession implements
 
     public List<ObjectAdapter> getServices() {
         final List<Object> services = servicesInjector.getRegisteredServices();
-        final List<ObjectAdapter> serviceAdapters = Lists.newArrayList();
+        final List<ObjectAdapter> serviceAdapters = _Lists.newArrayList();
         for (final Object servicePojo : services) {
             ObjectAdapter serviceAdapter = getAdapterFor(servicePojo);
             if(serviceAdapter == null) {
@@ -970,7 +967,7 @@ public class PersistenceSession implements
             return zip(rootOids, Collections.emptyList());
         }
 
-        final List<Object> dnOids = Lists.newArrayList();
+        final List<Object> dnOids = _Lists.newArrayList();
         for (final RootOid rootOid : rootOids) {
             final Object id = JdoObjectIdSerializer.toJdoObjectId(rootOid);
             if(id instanceof SingleFieldIdentity) {
@@ -1110,7 +1107,7 @@ public class PersistenceSession implements
      * Makes an {@link ObjectAdapter} persistent. The specified object should be
      * stored away via this object store's persistence mechanism, and have a
      * new and unique OID assigned to it. The object, should also be added to
-     * the {@link PersistenceSession} as the object is implicitly 'in use'.
+     * the {@link PersistenceSession5} as the object is implicitly 'in use'.
      *
      * <p>
      * If the object has any associations then each of these, where they aren't
@@ -1138,7 +1135,7 @@ public class PersistenceSession implements
                 makePersistentTransactionAssumed(adapter);
 
                 // clear out the map of transient -> persistent
-                PersistenceSession.this.persistentByTransient.clear();
+                PersistenceSession5.this.persistentByTransient.clear();
             }
 
         });
@@ -1282,7 +1279,7 @@ public class PersistenceSession implements
 
     // -- getAggregateRoot, remappedFrom
 
-    private Map<Oid, Oid> persistentByTransient = Maps.newHashMap();
+    private Map<Oid, Oid> persistentByTransient = _Maps.newHashMap();
 
     public ObjectAdapter getAggregateRoot(final ParentedCollectionOid collectionOid) {
         final Oid rootOid = collectionOid.getRootOid();
@@ -1555,9 +1552,9 @@ public class PersistenceSession implements
             final List<RootOid> rootOids,
             final ConcurrencyChecking concurrencyChecking) {
 
-        final Map<RootOid, ObjectAdapter> adapterByOid = Maps.newLinkedHashMap();
+        final Map<RootOid, ObjectAdapter> adapterByOid = _Maps.newLinkedHashMap();
 
-        List<RootOid> notYetLoadedOids = Lists.newArrayList();
+        List<RootOid> notYetLoadedOids = _Lists.newArrayList();
         for (RootOid rootOid : rootOids) {
             // attempt to locate adapter for the Oid
             ObjectAdapter adapter = getAdapterFor(rootOid);
@@ -1816,7 +1813,7 @@ public class PersistenceSession implements
      *
      * <p>
      * Note that there is no management of {@link Version}s here. That is
-     * because the {@link PersistenceSession} is expected to manage this.
+     * because the {@link PersistenceSession5} is expected to manage this.
      *
      * @param hintRootOid - allow a different persistent root oid to be provided.
      */
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory5.java
similarity index 90%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
copy to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory5.java
index ad72168..24d0c2f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory5.java
@@ -24,38 +24,38 @@ import java.util.Set;
 
 import javax.jdo.PersistenceManagerFactory;
 
-import org.datanucleus.PropertyNames;
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
 import org.apache.isis.objectstore.jdo.datanucleus.JDOStateManagerForIsis;
 import org.apache.isis.objectstore.jdo.service.RegisterEntities;
+import org.datanucleus.PropertyNames;
+import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  *
- * Factory for {@link PersistenceSession}.
+ * Factory for {@link PersistenceSession5}.
  *
  * <p>
  * Implementing class is added to {@link ServicesInjector} as an (internal) domain service; all public methods
  * must be annotated using {@link Programmatic}.
  * </p>
  */
-public class PersistenceSessionFactory implements ApplicationScopedComponent, FixturesInstalledFlag {
+public class PersistenceSessionFactory5 
+implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstalledFlag {
 
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSessionFactory.class);
+    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSessionFactory5.class);
 
-    private final IsisConfigurationDefault configuration;
+    private final ConfigurationServiceInternal configuration;
 
-    public PersistenceSessionFactory(final IsisConfigurationDefault isisConfiguration) {
+    public PersistenceSessionFactory5(final ConfigurationServiceInternal isisConfiguration) {
         this.configuration = isisConfiguration;
     }
 
@@ -63,7 +63,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
     public static final String DATANUCLEUS_CONFIG_PREFIX = "isis.persistor.datanucleus.impl"; // reserved for datanucleus' own config props
 
 
-    private DataNucleusApplicationComponents applicationComponents;
+    private DataNucleusApplicationComponents5 applicationComponents;
 
     @Programmatic
     public void init(final SpecificationLoader specificationLoader) {
@@ -75,7 +75,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
         return this.applicationComponents != null;
     }
 
-    private DataNucleusApplicationComponents createDataNucleusApplicationComponents(
+    private DataNucleusApplicationComponents5 createDataNucleusApplicationComponents(
             final IsisConfiguration configuration, final SpecificationLoader specificationLoader) {
 
         if (applicationComponents == null || applicationComponents.isStale()) {
@@ -90,7 +90,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
             final RegisterEntities registerEntities = new RegisterEntities(specificationLoader);
             final Set<String> classesToBePersisted = registerEntities.getEntityTypes();
 
-            applicationComponents = new DataNucleusApplicationComponents(jdoObjectstoreConfig, specificationLoader,
+            applicationComponents = new DataNucleusApplicationComponents5(jdoObjectstoreConfig, specificationLoader,
                     datanucleusProps, classesToBePersisted);
         }
 
@@ -106,7 +106,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
         putIfNotPresent(props, "javax.jdo.PersistenceManagerFactoryClass", JDOPersistenceManagerFactory.class.getName());
 
         // previously we defaulted this property to "true", but that could cause the target database to be modified
-        putIfNotPresent(props, PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_SCHEMA, Boolean.FALSE.toString());
+        putIfNotPresent(props, PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_DATABASE, Boolean.FALSE.toString());
 
         putIfNotPresent(props, PropertyNames.PROPERTY_SCHEMA_VALIDATE_ALL, Boolean.TRUE.toString());
         putIfNotPresent(props, PropertyNames.PROPERTY_CACHE_L2_TYPE, "none");
@@ -169,7 +169,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
      * Called by {@link org.apache.isis.core.runtime.system.session.IsisSessionFactory#openSession(AuthenticationSession)}.
      */
     @Programmatic
-    public PersistenceSession createPersistenceSession(
+    public PersistenceSession5 createPersistenceSession(
             final ServicesInjector servicesInjector,
             final AuthenticationSession authenticationSession) {
 
@@ -177,7 +177,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi
         final PersistenceManagerFactory persistenceManagerFactory =
                 applicationComponents.getPersistenceManagerFactory();
 
-        return new PersistenceSession(
+        return new PersistenceSession5(
                 servicesInjector,
                 authenticationSession, persistenceManagerFactory,
                 fixturesInstalledFlag);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/Utils.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/Utils.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/Utils.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/Utils.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
similarity index 97%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
index fdffb95..13297d6 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
@@ -27,11 +27,12 @@ import java.util.Map;
 
 import com.google.common.base.Strings;
 
+import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPropertiesAware;
 import org.datanucleus.ClassLoaderResolver;
 import org.datanucleus.enhancer.EnhancementNucleusContextImpl;
 import org.datanucleus.metadata.AbstractClassMetaData;
 import org.datanucleus.metadata.MetaDataListener;
-import org.datanucleus.store.encryption.ConnectionEncryptionProvider;
+import org.datanucleus.store.ConnectionEncryptionProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -195,7 +196,7 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
                 ClassLoaderResolver clr = new EnhancementNucleusContextImpl("JDO", properties).getClassLoaderResolver(null);
                 try
                 {
-                    Class decrypterCls = clr.classForName(decrypterName);
+                    Class<?> decrypterCls = clr.classForName(decrypterName);
                     ConnectionEncryptionProvider decrypter = (ConnectionEncryptionProvider) decrypterCls.newInstance();
                     password = decrypter.decrypt(password);
                 }
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
similarity index 94%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
index 47fd736..84f6c8e 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
@@ -22,7 +22,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.core.runtime.system.persistence.IsisLifecycleListener2;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
 
 /**
  * @deprecated - retained only for backward compatibility of logging (in logging.properties file).
@@ -32,7 +32,7 @@ public class IsisLifecycleListener extends IsisLifecycleListener2 {
 
     public static final Logger LOG = LoggerFactory.getLogger(IsisLifecycleListener.class);
 
-    public IsisLifecycleListener(final PersistenceSession persistenceSession) {
+    public IsisLifecycleListener(final PersistenceSession5 persistenceSession) {
         super(persistenceSession);
         throw new RuntimeException("Use IsisLifecycleListener2 instead");
     }
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
similarity index 95%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
index 4f10cc4..7cdfb3a 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
@@ -28,13 +28,13 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
 
 public class PersistenceQueryFindAllInstancesProcessor extends PersistenceQueryProcessorAbstract<PersistenceQueryFindAllInstances> {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFindAllInstancesProcessor.class);
 
-    public PersistenceQueryFindAllInstancesProcessor(final PersistenceSession persistenceSession) {
+    public PersistenceQueryFindAllInstancesProcessor(final PersistenceSession5 persistenceSession) {
         super(persistenceSession);
     }
 
@@ -43,7 +43,7 @@ public class PersistenceQueryFindAllInstancesProcessor extends PersistenceQueryP
         final ObjectSpecification specification = persistenceQuery.getSpecification();
         
         Class<?> cls = specification.getCorrespondingClass();
-        final Query jdoQuery = persistenceSession.newJdoQuery(cls);
+        final Query<?> jdoQuery = persistenceSession.newJdoQuery(cls);
         
         // http://www.datanucleus.org/servlet/jira/browse/NUCCORE-1103
         jdoQuery.addExtension("datanucleus.multivaluedFetch", "none");
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
similarity index 96%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
index d6c3b4e..8972502 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
@@ -35,14 +35,14 @@ import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
 import org.apache.isis.objectstore.jdo.datanucleus.metamodel.JdoPropertyUtils;
 
 public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDefault> {
     
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFindUsingApplibQueryProcessor.class);
 
-    public PersistenceQueryFindUsingApplibQueryProcessor(final PersistenceSession persistenceSession) {
+    public PersistenceQueryFindUsingApplibQueryProcessor(final PersistenceSession5 persistenceSession) {
         super(persistenceSession);
     }
 
@@ -74,7 +74,7 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
         final OneToOneAssociation pkOtoa = JdoPropertyUtils.getPrimaryKeyPropertyFor(objectSpec);
         final String pkOtoaId = pkOtoa.getId();
         final String filter = pkOtoaId + "==" + map.get(pkOtoaId);
-        final Query jdoQuery = persistenceSession.newJdoQuery(cls, filter);
+        final Query<?> jdoQuery = persistenceSession.newJdoQuery(cls, filter);
 
         // http://www.datanucleus.org/servlet/jira/browse/NUCCORE-1103
         jdoQuery.addExtension("datanucleus.multivaluedFetch", "none");
@@ -100,7 +100,7 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
         final ObjectSpecification objectSpec = persistenceQuery.getSpecification();
 
         final Class<?> cls = objectSpec.getCorrespondingClass();
-        final Query jdoQuery = persistenceSession.newJdoNamedQuery(cls, queryName);
+        final Query<?> jdoQuery = persistenceSession.newJdoNamedQuery(cls, queryName);
         
         // http://www.datanucleus.org/servlet/jira/browse/NUCCORE-1103
         jdoQuery.addExtension("datanucleus.multivaluedFetch", "none");
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessor.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessor.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessor.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessor.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
similarity index 90%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
index 1c93252..df8f8cf 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
@@ -22,30 +22,29 @@ import java.util.List;
 
 import javax.jdo.listener.InstanceLifecycleEvent;
 
-import com.google.common.collect.Lists;
-
-import org.datanucleus.enhancement.Persistable;
-
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.runtime.system.persistence.IsisLifecycleListener2;
 import org.apache.isis.core.runtime.system.persistence.PersistenceQuery;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
+import org.datanucleus.enhancement.Persistable;
+
+import com.google.common.collect.Lists;
 
 public abstract class PersistenceQueryProcessorAbstract<T extends PersistenceQuery>
         implements PersistenceQueryProcessor<T> {
 
 
-    final PersistenceSession persistenceSession;
+    final PersistenceSession5 persistenceSession;
 
-    protected PersistenceQueryProcessorAbstract(final PersistenceSession persistenceSession) {
+    protected PersistenceQueryProcessorAbstract(final PersistenceSession5 persistenceSession) {
         this.persistenceSession = persistenceSession;
     }
 
 
     /**
      * Traversing the provided list causes (or should cause) the
-     * {@link IsisLifecycleListener#postLoad(InstanceLifecycleEvent) {
+     * {@link IsisLifecycleListener2#postLoad(InstanceLifecycleEvent) {
      * to be called.
      */
     protected List<ObjectAdapter> loadAdapters(final List<?> pojos) {
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
similarity index 96%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
index 70864ee..b1801c9 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
@@ -32,7 +32,7 @@ public final class QueryUtil {
 
     private QueryUtil() {}
 
-    public static Query createQuery(
+    public static Query<?> createQuery(
             final PersistenceManager persistenceManager,
             final String alias,
             final String select,
@@ -47,7 +47,7 @@ public final class QueryUtil {
         final String queryString = buf.toString();
         LOG.debug("creating query: {}", queryString);
 
-        final Query jdoQuery = persistenceManager.newQuery(queryString);
+        final Query<?> jdoQuery = persistenceManager.newQuery(queryString);
         
         // http://www.datanucleus.org/servlet/jira/browse/NUCCORE-1103
         jdoQuery.addExtension("datanucleus.multivaluedFetch", "none");
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/eventbus/EventBusServiceJdo.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisPasswordConverter.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisPasswordConverter.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisPasswordConverter.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisPasswordConverter.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisBlobMapping.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisBlobMapping.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisBlobMapping.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisBlobMapping.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisClobMapping.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisClobMapping.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisClobMapping.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisClobMapping.java
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisMoneyMapping.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisMoneyMapping.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisMoneyMapping.java
rename to core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisMoneyMapping.java
diff --git a/core/plugins/jdo-datanucleus-5/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin b/core/plugins/jdo-datanucleus-5/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin
new file mode 100644
index 0000000..92645f8
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-5/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin
@@ -0,0 +1 @@
+org.apacha.isis.plugins.jdo.dn5.IsisJdoSupportPlugin5
\ No newline at end of file
diff --git a/core/plugins/jdo-datanucleus-5/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoRuntimePlugin b/core/plugins/jdo-datanucleus-5/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoRuntimePlugin
new file mode 100644
index 0000000..92645f8
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-5/src/main/resources/META-INF/services/org.apache.isis.core.metamodel.IsisJdoRuntimePlugin
@@ -0,0 +1 @@
+org.apacha.isis.plugins.jdo.dn5.IsisJdoSupportPlugin5
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
similarity index 98%
rename from core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
index 2c68c1b..faafc59 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
+++ b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
@@ -19,13 +19,10 @@
 
 package org.apache.isis.core.runtime.persistence.adapterfactory.pojo;
 
-import java.util.Date;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
 
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
+import java.util.Date;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -36,12 +33,14 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PojoAdapterBuilder;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
 
 public class PojoAdapterTest {
 
@@ -60,7 +59,7 @@ public class PojoAdapterTest {
     @Mock
     private AuthenticationSession mockAuthenticationSession;
     @Mock
-    private PersistenceSession mockPersistenceSession;
+    private PersistenceSession5 mockPersistenceSession;
 
     @Before
     public void setUp() throws Exception {
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
similarity index 97%
rename from core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
index 164e2c0..125ebb6 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
+++ b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
@@ -21,8 +21,6 @@ package org.apache.isis.core.runtime.persistence.objectstore.transaction;
 
 import java.util.Iterator;
 
-import com.google.common.base.Splitter;
-
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
@@ -32,11 +30,13 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
+
+import com.google.common.base.Splitter;
 
 public class PojoAdapterBuilder {
 
-    private PersistenceSession persistenceSession;
+    private PersistenceSession5 persistenceSession;
 
     private PojoAdapterBuilder(){
     }
@@ -163,7 +163,7 @@ public class PojoAdapterBuilder {
         return this;
     }
 
-    public PojoAdapterBuilder with(PersistenceSession persistenceSession) {
+    public PojoAdapterBuilder with(PersistenceSession5 persistenceSession) {
         this.persistenceSession = persistenceSession;
         return this;
     }
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
similarity index 100%
rename from core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactoryTest.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactoryTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithBigDecimalColumnAnnotations.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithBigDecimalColumnAnnotations.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithBigDecimalColumnAnnotations.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithBigDecimalColumnAnnotations.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAllowsNullAnnotations.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAllowsNullAnnotations.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAllowsNullAnnotations.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAllowsNullAnnotations.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/SimpleObjectWithNotPersistentColumn.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/SimpleObjectWithNotPersistentColumn.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/SimpleObjectWithNotPersistentColumn.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/SimpleObjectWithNotPersistentColumn.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/SimpleObjectWithPrimaryKey.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/SimpleObjectWithPrimaryKey.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/SimpleObjectWithPrimaryKey.java
rename to core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/SimpleObjectWithPrimaryKey.java
diff --git a/core/pom.xml b/core/pom.xml
index 268ecf2..a7c6645 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -87,24 +87,31 @@
 [5] https://github.com/Eonasdan/bootstrap-datetimepicker/blob/master/LICENSE
 [6] https://github.com/moment/moment/blob/develop/LICENSE</license.additional-notes>
 
-        <!-- Datanucleus Objectstore -->
+        <!-- JDO API -->
+        
         <jdo-api.version>3.1</jdo-api.version>
-
-        <datanucleus-core.version>4.1.7</datanucleus-core.version>
-        <datanucleus-api-jdo.version>4.1.1</datanucleus-api-jdo.version>
-        <datanucleus-jdo-query.version>4.0.5</datanucleus-jdo-query.version>
-        <datanucleus-rdbms.version>4.1.9</datanucleus-rdbms.version>
-
-        <datanucleus-jodatime.version>4.1.0-release</datanucleus-jodatime.version>
-	<!--
-	    ISIS-1288: seen integration tests to fail;
-	    domain object date holding 1-Aug-2015 after xactn retrieved as 31-Jul-2015
-
-        https://github.com/datanucleus/datanucleus-jodatime/commit/b85795a1bf5f92909a95d2c8f8822bba2ba38b5f
-
-        <datanucleus-jodatime.version>4.1.1</datanucleus-jodatime.version>
-	-->
-        <datanucleus-maven-plugin.version>4.0.2</datanucleus-maven-plugin.version>
+        
+        <!-- Datanucleus JDO Plugin dn5 -->
+
+		<dn5-jdo-api.version>3.2.0-m7</dn5-jdo-api.version>
+        <dn5-core.version>5.1.6</dn5-core.version>
+        <dn5-api-jdo.version>5.1.4</dn5-api-jdo.version>
+        <dn5-jdo-query.version>5.0.4</dn5-jdo-query.version>
+        <dn5-rdbms.version>5.1.6</dn5-rdbms.version>
+        <dn5-jodatime.version>5.1.0-release</dn5-jodatime.version>
+        <dn5-maven-plugin.version>5.0.2</dn5-maven-plugin.version>
+
+		<!-- Datanucleus JDO Plugin dn4 -->
+
+		<dn4-jdo-api.version>3.1</dn4-jdo-api.version>
+        <dn4-core.version>4.1.7</dn4-core.version>
+        <dn4-api-jdo.version>4.1.1</dn4-api-jdo.version>
+        <dn4-jdo-query.version>4.0.5</dn4-jdo-query.version>
+        <dn4-rdbms.version>4.1.9</dn4-rdbms.version>
+        <dn4-jodatime.version>4.1.0-release</dn4-jodatime.version>
+        <dn4-maven-plugin.version>4.0.2</dn4-maven-plugin.version>
+        
+        <!-- ... -->
 
         <shiro.version>1.2.6</shiro.version>
 
@@ -2014,61 +2021,21 @@ ${license.additional-notes}
             </dependency>
 
             <!-- JEE API -->
-            
-            	<dependency>
-				    <groupId>javax</groupId>
-				    <artifactId>javaee-api</artifactId>
-				    <version>${javaee.version}</version>
-				</dependency>
-            
-<!--             <dependency> -->
-<!--                 <groupId>org.apache.geronimo.specs</groupId> -->
-<!--                 <artifactId>geronimo-jsp_2.1_spec</artifactId> -->
-<!--                 <version>${geronimo-jsp_2.1_spec.version}</version> -->
-<!--             </dependency> -->
-<!--               <dependency> -->
-<!--                 <groupId>org.apache.geronimo.specs</groupId> -->
-<!--                 <artifactId>geronimo-jta_1.1_spec</artifactId> -->
-<!--                 <version>${geronimo-jta_1.1_spec.version}</version> -->
-<!--               </dependency> -->
-<!--             <dependency> -->
-<!--                 <groupId>org.apache.geronimo.specs</groupId> -->
-<!--                 <artifactId>geronimo-jta_1.0.1B_spec</artifactId> -->
-<!--                 <version>${geronimo-jta_1.0.1B_spec.version}</version> -->
-<!--             </dependency> -->
-<!--             <dependency> -->
-<!--                 <groupId>org.apache.geronimo.specs</groupId> -->
-<!--                 <artifactId>geronimo-servlet_3.0_spec</artifactId> -->
-<!--                 <version>${geronimo-servlet_3.0_spec.version}</version> -->
-<!--             </dependency> -->
-<!--             <dependency> -->
-<!--                 <groupId>org.apache.geronimo.specs</groupId> -->
-<!--                 <artifactId>geronimo-annotation_1.0_spec</artifactId> -->
-<!--                 <version>${geronimo-annotation_1.0_spec.version}</version> -->
-<!--             </dependency> -->
-<!--             <dependency> -->
-<!--                 <groupId>org.apache.geronimo.specs</groupId> -->
-<!--                 <artifactId>geronimo-activation_1.1_spec</artifactId> -->
-<!--                 <version>${geronimo-activation_1.1_spec.version}</version> -->
-<!--             </dependency> -->
-<!--             <dependency> -->
-<!--                 <groupId>org.apache.geronimo.specs</groupId> -->
-<!--                 <artifactId>geronimo-javamail_1.4_spec</artifactId> -->
-<!--                 <version>${geronimo-javamail_1.4_spec.version}</version> -->
-<!--             </dependency> -->
-<!--             <dependency> -->
-<!--                 <groupId>org.apache.geronimo.specs</groupId> -->
-<!--                 <artifactId>geronimo-atinject_1.0_spec</artifactId> -->
-<!--                 <version>${geronimo-atinject_1.0_spec.version}</version> -->
-<!--             </dependency> -->
-<!--             <dependency> -->
-<!--                 <groupId>org.apache.geronimo.specs</groupId> -->
-<!--                 <artifactId>geronimo-jcdi_1.0_spec</artifactId> -->
-<!--                 <version>${geronimo-jcdi_1.0_spec.version}</version> -->
-<!--             </dependency> -->
+           	<dependency>
+			    <groupId>javax</groupId>
+			    <artifactId>javaee-api</artifactId>
+			    <version>${javaee.version}</version>
+			</dependency>
+			
+			<!-- JDO API -->
+			<dependency>
+	            <groupId>javax.jdo</groupId>
+	            <artifactId>jdo-api</artifactId>
+	            <version>${jdo-api.version}</version>
+	            <scope></scope> <!-- TODO provided by plugin -->
+        	</dependency>
 
 			<!-- JAX-RS API -->
-
             <dependency>
                 <groupId>org.jboss.spec.javax.ws.rs</groupId>
                 <artifactId>jboss-jaxrs-api_2.0_spec</artifactId>
@@ -2076,47 +2043,13 @@ ${license.additional-notes}
             </dependency>
 
 
-            <!-- javax APIs -->
-            
+            <!-- VALIDATION API -->
             <dependency>
                 <groupId>javax.validation</groupId>
                 <artifactId>validation-api</artifactId>
                 <version>${validation-api.version}</version>
             </dependency>
 
-
-            <!-- DataNucleus -->
-            <dependency>
-                <groupId>javax.jdo</groupId>
-                <artifactId>jdo-api</artifactId>
-                <version>${jdo-api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.datanucleus</groupId>
-                <artifactId>datanucleus-core</artifactId>
-                <version>${datanucleus-core.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.datanucleus</groupId>
-                <artifactId>datanucleus-api-jdo</artifactId>
-                <version>${datanucleus-api-jdo.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.datanucleus</groupId>
-                <artifactId>datanucleus-jdo-query</artifactId>
-                <version>${datanucleus-jdo-query.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.datanucleus</groupId>
-                <artifactId>datanucleus-rdbms</artifactId>
-                <version>${datanucleus-rdbms.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.datanucleus</groupId>
-                <artifactId>datanucleus-jodatime</artifactId>
-                <version>${datanucleus-jodatime.version}</version>
-            </dependency>
-
             <dependency>
                 <groupId>io.swagger</groupId>
                 <artifactId>swagger-core</artifactId>
diff --git a/core/runtime/pom.xml b/core/runtime/pom.xml
index dd5ff41..41b84f4 100644
--- a/core/runtime/pom.xml
+++ b/core/runtime/pom.xml
@@ -126,13 +126,6 @@
             <artifactId>javassist</artifactId>
         </dependency>
 
-<!-- replaced by javaee-api -->
-<!--         <dependency> -->
-<!--             <groupId>org.apache.geronimo.specs</groupId> -->
-<!--             <artifactId>geronimo-servlet_3.0_spec</artifactId> -->
-<!--             <scope>provided</scope> -->
-<!--         </dependency> -->
-
 	</dependencies>
 
     <profiles>
diff --git a/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java b/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java
new file mode 100644
index 0000000..cf028b8
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java
@@ -0,0 +1,28 @@
+package org.apache.isis.core.metamodel;
+
+import org.apache.isis.applib.NonRecoverableException;
+import org.apache.isis.applib.internal.context._Plugin;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
+
+public interface IsisJdoRuntimePlugin {
+
+	// -- INTERFACE
+	
+	public PersistenceSessionFactory getPersistenceSessionFactory(ConfigurationServiceInternal configuration);
+	
+	// -- LOOKUP
+
+	public static IsisJdoRuntimePlugin get() {
+		return _Plugin.getOrElse(IsisJdoRuntimePlugin.class, 
+				ambigousPlugins->{
+					throw new NonRecoverableException("Ambigous plugins implementing IsisJdoRuntimePlugin found on class path.");
+				}, 
+				()->{
+					throw new NonRecoverableException("No plugin implementing IsisJdoRuntimePlugin found on class path.");
+				}); 
+	}
+
+	
+	
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
index a6847c8..b698b50 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
@@ -23,9 +23,6 @@ import java.util.UUID;
 
 import javax.jdo.PersistenceManagerFactory;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.AppManifest2;
 import org.apache.isis.applib.AppManifestAbstract2;
@@ -33,13 +30,15 @@ import org.apache.isis.applib.Module;
 import org.apache.isis.applib.fixtures.TickingFixtureClock;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.applib.fixturescripts.FixtureScripts;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport0;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.runtime.headless.logging.LogConfig;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.objectstore.jdo.datanucleus.IsisConfigurationForJdoIntegTests;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class IsisSystemBootstrapper {
 
@@ -150,7 +149,8 @@ public class IsisSystemBootstrapper {
     private static IsisSystem setupSystem(final AppManifest2 appManifest2) {
 
         final IsisConfigurationForJdoIntegTests configuration = new IsisConfigurationForJdoIntegTests();
-        configuration.putDataNucleusProperty("javax.jdo.option.ConnectionURL","jdbc:hsqldb:mem:test-" + UUID.randomUUID().toString());
+        configuration.putDataNucleusProperty("javax.jdo.option.ConnectionURL","jdbc:hsqldb:mem:test-" + UUID.randomUUID()
+        .toString());
         final IsisSystem.Builder isftBuilder =
                 new IsisSystem.Builder()
                         .withLoggingAt(org.apache.log4j.Level.INFO)
@@ -182,7 +182,7 @@ public class IsisSystemBootstrapper {
         final IsisSessionFactory isisSessionFactory = lookupService(IsisSessionFactory.class);
 
         // TODO: this ought to be part of isisSessionFactory's responsibilities
-        final IsisJdoSupport isisJdoSupport = lookupService(IsisJdoSupport.class);
+        final IsisJdoSupport0 isisJdoSupport = lookupService(IsisJdoSupport0.class);
         final PersistenceManagerFactory pmf =
                 isisJdoSupport.getJdoPersistenceManager().getPersistenceManagerFactory();
         isisSessionFactory.destroyServicesAndShutdown();
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
index 04a9eba..bf65edb 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
@@ -22,11 +22,7 @@ package org.apache.isis.core.runtime.memento;
 import java.io.Serializable;
 import java.util.List;
 
-import com.google.common.collect.Lists;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import org.apache.isis.applib.internal.collections._Lists;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.exceptions.UnknownTypeException;
@@ -41,14 +37,16 @@ import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Holds the state for the specified object in serializable form.
@@ -65,7 +63,7 @@ public class Memento implements Serializable {
 
     private final static OidMarshaller OID_MARSHALLER = OidMarshaller.INSTANCE;
 
-    private final List<Oid> transientObjects = Lists.newArrayList();
+    private final List<Oid> transientObjects = _Lists.newArrayList();
 
 
     private Data data;
@@ -345,7 +343,7 @@ public class Memento implements Serializable {
     private void updateOneToManyAssociation(final ObjectAdapter objectAdapter, final OneToManyAssociation otma, final CollectionData collectionData) {
         final ObjectAdapter collection = otma.get(objectAdapter, InteractionInitiatedBy.FRAMEWORK);
         final CollectionFacet facet = CollectionFacetUtils.getCollectionFacetFromSpec(collection);
-        final List<ObjectAdapter> original = Lists.newArrayList();
+        final List<ObjectAdapter> original = _Lists.newArrayList();
         for (final ObjectAdapter adapter : facet.iterable(collection)) {
             original.add(adapter);
         }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PersistenceCommandAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PersistenceCommandAbstract.java
index 2a6b4a0..ab23417 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PersistenceCommandAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PersistenceCommandAbstract.java
@@ -19,9 +19,7 @@
 
 package org.apache.isis.core.runtime.persistence.objectstore.transaction;
 
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.runtime.system.context.IsisContext;
 
 public abstract class PersistenceCommandAbstract implements PersistenceCommand {
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index d0698af..5ce1987 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -1,2448 +1,69 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
 package org.apache.isis.core.runtime.system.persistence;
 
-import java.lang.reflect.Array;
-import java.lang.reflect.Modifier;
-import java.sql.Timestamp;
-import java.text.MessageFormat;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 
-import javax.jdo.FetchGroup;
-import javax.jdo.FetchPlan;
 import javax.jdo.PersistenceManager;
-import javax.jdo.PersistenceManagerFactory;
-import javax.jdo.identity.SingleFieldIdentity;
-import javax.jdo.listener.InstanceLifecycleListener;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.datanucleus.enhancement.Persistable;
-import org.datanucleus.exceptions.NucleusObjectNotFoundException;
-import org.datanucleus.identity.DatastoreIdImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.bookmark.BookmarkService;
-import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.command.CommandContext;
-import org.apache.isis.applib.services.command.spi.CommandService;
-import org.apache.isis.applib.services.eventbus.AbstractLifecycleEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
-import org.apache.isis.applib.services.factory.FactoryService;
-import org.apache.isis.applib.services.iactn.Interaction;
-import org.apache.isis.applib.services.iactn.InteractionContext;
-import org.apache.isis.applib.services.metrics.MetricsService;
-import org.apache.isis.applib.services.user.UserService;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.applib.services.bookmark.BookmarkService.FieldResetPolicy;
 import org.apache.isis.core.commons.components.SessionScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.commons.ensure.IsisAssertException;
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.factory.InstanceUtil;
-import org.apache.isis.core.commons.util.ToString;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
-import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.ElementSpecificationProviderFromTypeOfFacet;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
-import org.apache.isis.core.metamodel.facets.object.callbacks.CallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.LifecycleEventFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedLifecycleEventFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedLifecycleEventFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingLifecycleEventFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingLifecycleEventFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedLifecycleEventFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingLifecycleEventFacet;
-import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
-import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
-import org.apache.isis.core.metamodel.spec.FreeStandingList;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
-import org.apache.isis.core.runtime.persistence.NotPersistableException;
-import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
-import org.apache.isis.core.runtime.persistence.PojoRecreationException;
-import org.apache.isis.core.runtime.persistence.PojoRefreshException;
-import org.apache.isis.core.runtime.persistence.UnsupportedFindException;
-import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
-import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
-import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
-import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureAbstract;
-import org.apache.isis.core.runtime.services.RequestScopedService;
-import org.apache.isis.core.runtime.services.changes.ChangedObjectsServiceInternal;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.OidAdapterHashMap;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.PojoAdapterHashMap;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.RootAndCollectionAdapters;
-import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
-import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
-import org.apache.isis.core.runtime.system.transaction.TransactionalClosureWithReturn;
-import org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusCreateObjectCommand;
-import org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusDeleteObjectCommand;
-import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindAllInstancesProcessor;
-import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
-import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor;
-import org.apache.isis.objectstore.jdo.datanucleus.persistence.spi.JdoObjectIdSerializer;
-
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-
-/**
- * A wrapper around the JDO {@link PersistenceManager}, which also manages concurrency
- * and maintains an identity map of {@link ObjectAdapter adapter}s and {@link Oid
- * identities} for each and every POJO that is being used by the framework.
- */
-public class PersistenceSession implements
-        TransactionalResource,
-        SessionScopedComponent,
-        AdapterManager,
-        IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
-
-    // -- constants
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession.class);
-
-    /**
-     * @see #isFixturesInstalled()
-     */
-    public static final String INSTALL_FIXTURES_KEY = OptionHandlerFixtureAbstract.DATANUCLEUS_INSTALL_FIXTURES_KEY;
-    public static final boolean INSTALL_FIXTURES_DEFAULT = false;
-
-    private static final String ROOT_KEY = OptionHandlerFixtureAbstract.DATANUCLEUS_ROOT_KEY;
-
-    /**
-     * Append regular <a href="http://www.datanucleus.org/products/accessplatform/persistence_properties.html">datanucleus properties</a> to this key
-     */
-    public static final String DATANUCLEUS_PROPERTIES_ROOT = ROOT_KEY + "impl.";
-
-    public static final String SERVICE_IDENTIFIER = "1";
-
-    
-
-    // -- constructor, fields, finalize()
-
-    private final FixturesInstalledFlag fixturesInstalledFlag;
-
-    private final PersistenceQueryFactory persistenceQueryFactory;
-    private final IsisConfiguration configuration;
-    private final SpecificationLoader specificationLoader;
-    private final AuthenticationSession authenticationSession;
-
-    private final ServicesInjector servicesInjector;
-
-    private final CommandContext commandContext;
-    private final CommandService commandService;
-
-    private final InteractionContext interactionContext;
-    private final EventBusService eventBusService ;
-    private final ChangedObjectsServiceInternal changedObjectsServiceInternal;
-    private final FactoryService factoryService;
-    private final MetricsService metricsService;
-    private final ClockService clockService;
-    private final UserService userService;
-
-
-    /**
-     * Used to create the {@link #persistenceManager} when {@link #open()}ed.
-     */
-    private final PersistenceManagerFactory jdoPersistenceManagerFactory;
-
-    // not final only for testing purposes
-    private IsisTransactionManager transactionManager;
-
-
-    /**
-     * populated only when {@link #open()}ed.
-     */
-    private PersistenceManager persistenceManager;
-
-    /**
-     * populated only when {@link #open()}ed.
-     */
-    private final Map<Class<?>, PersistenceQueryProcessor<?>> persistenceQueryProcessorByClass = Maps.newHashMap();
-
-
-    private final boolean concurrencyCheckingGloballyEnabled;
-
-
-    /**
-     * Initialize the object store so that calls to this object store access
-     * persisted objects and persist changes to the object that are saved.
-     */
-    public PersistenceSession(
-            final ServicesInjector servicesInjector,
-            final AuthenticationSession authenticationSession,
-            final PersistenceManagerFactory jdoPersistenceManagerFactory,
-            final FixturesInstalledFlag fixturesInstalledFlag) {
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("creating {}", this);
-        }
-
-        this.servicesInjector = servicesInjector;
-        this.jdoPersistenceManagerFactory = jdoPersistenceManagerFactory;
-        this.fixturesInstalledFlag = fixturesInstalledFlag;
-
-        // injected
-        this.configuration = servicesInjector.getConfigurationServiceInternal();
-        this.specificationLoader = servicesInjector.getSpecificationLoader();
-        this.authenticationSession = authenticationSession;
-
-        this.commandContext = lookupService(CommandContext.class);
-        this.commandService = lookupService(CommandService.class);
-        this.interactionContext = lookupService(InteractionContext.class);
-        this.eventBusService = lookupService(EventBusService.class);
-        this.changedObjectsServiceInternal = lookupService(ChangedObjectsServiceInternal.class);
-        this.metricsService = lookupService(MetricsService.class);
-        this.factoryService = lookupService(FactoryService.class);
-        this.clockService = lookupService(ClockService.class);
-        this.userService = lookupService(UserService.class);
-
-        // sub-components
-        final AdapterManager adapterManager = this;
-        this.persistenceQueryFactory = new PersistenceQueryFactory(adapterManager, this.specificationLoader);
-        this.transactionManager = new IsisTransactionManager(this, authenticationSession, servicesInjector);
-
-        this.state = State.NOT_INITIALIZED;
-
-        final boolean concurrencyCheckingGloballyDisabled =
-                this.configuration.getBoolean("isis.persistor.disableConcurrencyChecking", false);
-        this.concurrencyCheckingGloballyEnabled = !concurrencyCheckingGloballyDisabled;
-
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        LOG.debug("finalizing persistence session");
-    }
-
-    
-
-
-    // -- open
-
-    /**
-     * Only populated once {@link #open()}'d
-     */
-    public PersistenceManager getPersistenceManager() {
-        return persistenceManager;
-    }
-
-    /**
-     * Injects components, calls open on subcomponents, and then creates service
-     * adapters.
-     */
-    public void open() {
-        ensureNotOpened();
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("opening {}", this);
-        }
-
-        oidAdapterMap.open();
-        pojoAdapterMap.open();
-
-        persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
-
-        final IsisLifecycleListener2.PersistenceSessionLifecycleManagement psLifecycleMgmt = this;
-        final IsisLifecycleListener2 isisLifecycleListener = new IsisLifecycleListener2(psLifecycleMgmt);
-        persistenceManager.addInstanceLifecycleListener(isisLifecycleListener, (Class[]) null);
-
-        persistenceQueryProcessorByClass.put(
-                PersistenceQueryFindAllInstances.class,
-                new PersistenceQueryFindAllInstancesProcessor(this));
-        persistenceQueryProcessorByClass.put(
-                PersistenceQueryFindUsingApplibQueryDefault.class,
-                new PersistenceQueryFindUsingApplibQueryProcessor(this));
-
-        initServices();
-
-        // tell the proxy of all request-scoped services to instantiate the underlying
-        // services, store onto the thread-local and inject into them...
-        startRequestOnRequestScopedServices();
-
-        // ... and invoke all @PostConstruct
-        postConstructOnRequestScopedServices();
-
-        if(metricsService instanceof InstanceLifecycleListener) {
-            final InstanceLifecycleListener metricsService = (InstanceLifecycleListener) this.metricsService;
-            persistenceManager.addInstanceLifecycleListener(metricsService, (Class[]) null);
-        }
-
-
-        final Command command = createCommand();
-        final UUID transactionId = UUID.randomUUID();
-        final Interaction interaction = factoryService.instantiate(Interaction.class);
-
-        final Timestamp timestamp = clockService.nowAsJavaSqlTimestamp();
-        final String userName = userService.getUser().getName();
-
-        command.setTimestamp(timestamp);
-        command.setUser(userName);
-        command.setTransactionId(transactionId);
-
-        interaction.setTransactionId(transactionId);
-
-        commandContext.setCommand(command);
-        interactionContext.setInteraction(interaction);
-
-        this.state = State.OPEN;
-    }
-
-    private void postConstructOnRequestScopedServices() {
-        for (final Object service : servicesInjector.getRegisteredServices()) {
-            if(service instanceof RequestScopedService) {
-                ((RequestScopedService)service).__isis_postConstruct();
-            }
-        }
-    }
-
-    private void startRequestOnRequestScopedServices() {
-        for (final Object service : servicesInjector.getRegisteredServices()) {
-            if(service instanceof RequestScopedService) {
-                ((RequestScopedService)service).__isis_startRequest(servicesInjector);
-            }
-        }
-    }
-
-    /**
-     * Creates {@link ObjectAdapter adapters} for the service list, ensuring that these are mapped correctly,
-     * and have the same OIDs as in any previous sessions.
-     */
-    private void initServices() {
-        final List<Object> registeredServices = servicesInjector.getRegisteredServices();
-        for (final Object service : registeredServices) {
-            final ObjectAdapter serviceAdapter = adapterFor(service);
-            remapAsPersistentIfRequired(serviceAdapter);
-        }
-    }
-
-    private void remapAsPersistentIfRequired(final ObjectAdapter serviceAdapter) {
-        if (serviceAdapter.getOid().isTransient()) {
-            remapAsPersistent(serviceAdapter, null);
-        }
-    }
-
-    private Command createCommand() {
-        final Command command = commandService.create();
-
-        servicesInjector.injectServicesInto(command);
-        return command;
-    }
-
-    
-
-    // -- close
-
-    /**
-     * Closes the subcomponents.
-     *
-     * <p>
-     * Automatically {@link IsisTransactionManager#endTransaction() ends
-     * (commits)} the current (Isis) {@link IsisTransaction}. This in turn commits the underlying
-     * JDO transaction.
-     *
-     * <p>
-     * The corresponding DataNucleus entity is then closed.
-     */
-    public void close() {
-
-        if (state == State.CLOSED) {
-            // nothing to do
-            return;
-        }
-
-        completeCommandFromInteractionAndClearDomainEvents();
-        transactionManager.flushTransaction();
-
-        try {
-            final IsisTransaction currentTransaction = transactionManager.getCurrentTransaction();
-            if (currentTransaction != null && !currentTransaction.getState().isComplete()) {
-                if(currentTransaction.getState().canCommit()) {
-                    transactionManager.endTransaction();
-                } else if(currentTransaction.getState().canAbort()) {
-                    transactionManager.abortTransaction();
-                }
-            }
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error("close: failed to end transaction; continuing to avoid memory leakage");
-        }
-
-        // tell the proxy of all request-scoped services to invoke @PreDestroy
-        // (if any) on all underlying services stored on their thread-locals...
-        preDestroyOnRequestScopedServices();
-
-        // ... and then remove those underlying services from the thread-local
-        endRequestOnRequestScopeServices();
-
-        try {
-            persistenceManager.close();
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error(
-                "close: failed to close JDO persistenceManager; continuing to avoid memory leakage");
-        }
-
-        try {
-            oidAdapterMap.close();
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
-        }
-
-        try {
-            pojoAdapterMap.close();
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
-        }
-
-        this.state = State.CLOSED;
-    }
-
-    private void endRequestOnRequestScopeServices() {
-        for (final Object service : servicesInjector.getRegisteredServices()) {
-            if(service instanceof RequestScopedService) {
-                ((RequestScopedService)service).__isis_endRequest();
-            }
-        }
-    }
-
-    private void preDestroyOnRequestScopedServices() {
-        for (final Object service : servicesInjector.getRegisteredServices()) {
-            if(service instanceof RequestScopedService) {
-                ((RequestScopedService)service).__isis_preDestroy();
-            }
-        }
-    }
-
-    private void completeCommandFromInteractionAndClearDomainEvents() {
-
-        final Command command = commandContext.getCommand();
-        final Interaction interaction = interactionContext.getInteraction();
-
-
-        if(command.getStartedAt() != null && command.getCompletedAt() == null) {
-            // the guard is in case we're here as the result of a redirect following a previous exception;just ignore.
-
-            final Timestamp completedAt;
-            final Interaction.Execution priorExecution = interaction.getPriorExecution();
-            if (priorExecution != null) {
-                // copy over from the most recent (which will be the top-level) interaction
-                completedAt = priorExecution.getCompletedAt();
-            } else {
-                // this could arise as the result of calling SessionManagementService#nextSession within an action
-                // the best we can do is to use the current time
-
-                // REVIEW: as for the interaction object, it is left somewhat high-n-dry.
-                completedAt = clockService.nowAsJavaSqlTimestamp();
-            }
-
-            command.setCompletedAt(completedAt);
-        }
-
-        // ensureCommandsPersistedIfDirtyXactn
-
-        // ensure that any changed objects means that the command should be persisted
-        if(command.getMemberIdentifier() != null) {
-            if(metricsService.numberObjectsDirtied() > 0) {
-                command.setPersistHint(true);
-            }
-        }
-
-
-        commandService.complete(command);
-
-        command.flushActionDomainEvents();
-
-        interaction.clear();
-    }
-
-
-    
-
-    // -- QuerySubmitter impl, findInstancesInTransaction
-
-    public <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query) {
-        final ObjectAdapter instances = findInstancesInTransaction(query, QueryCardinality.MULTIPLE);
-        return CollectionFacetUtils.convertToAdapterList(instances);
-    }
-
-    public <T> ObjectAdapter firstMatchingQuery(final Query<T> query) {
-        final ObjectAdapter instances = findInstancesInTransaction(query, QueryCardinality.SINGLE);
-        final List<ObjectAdapter> list = CollectionFacetUtils.convertToAdapterList(instances);
-        return list.size() > 0 ? list.get(0) : null;
-    }
-
-    /**
-     * Finds and returns instances that match the specified query.
-     *
-     * <p>
-     * The {@link QueryCardinality} determines whether all instances or just the
-     * first matching instance is returned.
-     *
-     * @throws org.apache.isis.core.runtime.persistence.UnsupportedFindException
-     *             if the criteria is not support by this persistor
-     */
-    private <T> ObjectAdapter findInstancesInTransaction(final Query<T> query, final QueryCardinality cardinality) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("findInstances using (applib) Query: {}", query);
-        }
-
-        // TODO: unify PersistenceQuery and PersistenceQueryProcessor
-        final PersistenceQuery persistenceQuery = createPersistenceQueryFor(query, cardinality);
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("maps to (core runtime) PersistenceQuery: {}", persistenceQuery);
-        }
-
-        final PersistenceQueryProcessor<? extends PersistenceQuery> processor = lookupProcessorFor(persistenceQuery);
-
-        final List<ObjectAdapter> instances = transactionManager.executeWithinTransaction(
-                new TransactionalClosureWithReturn<List<ObjectAdapter>>() {
-                    @Override
-                    public List<ObjectAdapter> execute() {
-                        return processPersistenceQuery(processor, persistenceQuery);
-                    }
-                });
-        final ObjectSpecification specification = persistenceQuery.getSpecification();
-        final FreeStandingList results = new FreeStandingList(specification, instances);
-        return adapterFor(results);
-    }
-
-    /**
-     * Converts the {@link Query applib representation of a query} into the
-     * {@link PersistenceQuery NOF-internal representation}.
-     */
-    private final PersistenceQuery createPersistenceQueryFor(
-            final Query<?> query,
-            final QueryCardinality cardinality) {
-
-        final PersistenceQuery persistenceQuery =
-                persistenceQueryFactory.createPersistenceQueryFor(query, cardinality);
-        if (persistenceQuery == null) {
-            throw new IllegalArgumentException("Unknown Query type: " + query.getDescription());
-        }
-
-        return persistenceQuery;
-    }
-
-    private PersistenceQueryProcessor<? extends PersistenceQuery> lookupProcessorFor(final PersistenceQuery persistenceQuery) {
-        final Class<? extends PersistenceQuery> persistenceQueryClass = persistenceQuery.getClass();
-        final PersistenceQueryProcessor<? extends PersistenceQuery> processor =
-                persistenceQueryProcessorByClass.get(persistenceQueryClass);
-        if (processor == null) {
-            throw new UnsupportedFindException(MessageFormat.format(
-                    "Unsupported PersistenceQuery class: {0}", persistenceQueryClass.getName()));
-        }
-        return processor;
-    }
-    @SuppressWarnings("unchecked")
-    private <Q extends PersistenceQuery> List<ObjectAdapter> processPersistenceQuery(
-            final PersistenceQueryProcessor<Q> persistenceQueryProcessor,
-            final PersistenceQuery persistenceQuery) {
-        return persistenceQueryProcessor.process((Q) persistenceQuery);
-    }
-
-    public IsisConfiguration getConfiguration() {
-        return configuration;
-    }
-
-
-    
-
-    // -- State
-
-    private enum State {
-        NOT_INITIALIZED, OPEN, CLOSED
-    }
-
-    private State state;
-
-    protected void ensureNotOpened() {
-        if (state != State.NOT_INITIALIZED) {
-            throw new IllegalStateException("Persistence session has already been initialized");
-        }
-    }
-
-    public void ensureOpened() {
-        ensureStateIs(State.OPEN);
-    }
-
-    private void ensureStateIs(final State stateRequired) {
-        if (state == stateRequired) {
-            return;
-        }
-        throw new IllegalStateException("State is: " + state + "; should be: " + stateRequired);
-    }
-
-
-    
-
-    // -- createTransientInstance, createViewModelInstance
-
-    /**
-     * Create a root or standalone {@link ObjectAdapter adapter}.
-     *
-     * <p>
-     * Creates a new instance of the specified type and returns it in an adapter.
-     *
-     * <p>
-     * The returned object will be initialised (had the relevant callback
-     * lifecycle methods invoked).
-     *
-     * <p>
-     * While creating the object it will be initialised with default values and
-     * its created lifecycle method (its logical constructor) will be invoked.
-     *
-     * <p>
-     * This method is ultimately delegated to by the
-     * {@link org.apache.isis.applib.DomainObjectContainer}.
-     */
-    public ObjectAdapter createTransientInstance(final ObjectSpecification objectSpec) {
-        return createInstance(objectSpec, Variant.TRANSIENT, null);
-    }
-
-    public ObjectAdapter createViewModelInstance(final ObjectSpecification objectSpec, final String memento) {
-        return createInstance(objectSpec, Variant.VIEW_MODEL, memento);
-    }
-
-    private enum Variant {
-        TRANSIENT,
-        VIEW_MODEL
-    }
-
-    private ObjectAdapter createInstance(
-            final ObjectSpecification spec,
-            final Variant variant,
-            final String memento) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("creating {} instance of {}", variant, spec);
-        }
-        final Object pojo;
-
-        if(variant == Variant.VIEW_MODEL) {
-            pojo = recreateViewModel(spec, memento);
-        } else {
-            pojo = instantiateAndInjectServices(spec);
-
-        }
-
-        final ObjectAdapter adapter = adapterFor(pojo);
-        return initializePropertiesAndDoCallback(adapter);
-    }
-
-    private Object recreateViewModel(final ObjectSpecification spec, final String memento) {
-        final ViewModelFacet facet = spec.getFacet(ViewModelFacet.class);
-        if(facet == null) {
-            throw new IllegalArgumentException("spec does not have ViewModelFacet; spec is " + spec.getFullIdentifier());
-        }
-
-        final Object viewModelPojo;
-        if(facet.getRecreationMechanism().isInitializes()) {
-            viewModelPojo = instantiateAndInjectServices(spec);
-            facet.initialize(viewModelPojo, memento);
-        } else {
-            viewModelPojo = facet.instantiate(spec.getCorrespondingClass(), memento);
-        }
-        return viewModelPojo;
-    }
-
-    public Object instantiateAndInjectServices(final ObjectSpecification objectSpec) {
-
-        final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
-        if (correspondingClass.isArray()) {
-            return Array.newInstance(correspondingClass.getComponentType(), 0);
-        }
-
-        final Class<?> cls = correspondingClass;
-        if (Modifier.isAbstract(cls.getModifiers())) {
-            throw new IsisException("Cannot create an instance of an abstract class: " + cls);
-        }
-        
-        final Object newInstance;
-        try {
-            newInstance = cls.newInstance();
-        } catch (final IllegalAccessException | InstantiationException e) {
-            throw new IsisException("Failed to create instance of type " + objectSpec.getFullIdentifier(), e);
-        }
-
-        servicesInjector.injectServicesInto(newInstance);
-        return newInstance;
-
-    }
-
-    private ObjectAdapter initializePropertiesAndDoCallback(final ObjectAdapter adapter) {
-
-        // initialize new object
-        final List<ObjectAssociation> fields = adapter.getSpecification().getAssociations(Contributed.EXCLUDED);
-        for (ObjectAssociation field : fields) {
-            field.toDefault(adapter);
-        }
-        final Object pojo = adapter.getObject();
-        servicesInjector.injectServicesInto(pojo);
-
-        CallbackFacet.Util.callCallback(adapter, CreatedCallbackFacet.class);
-
-        if (Command.class.isAssignableFrom(pojo.getClass())) {
-
-            // special case... the command object is created while the transaction is being started and before
-            // the event bus service is initialized (nb: we initialize services *within* a transaction).  To resolve
-            // this catch-22 situation, we simply suppress the posting of this event for this domain class.
-
-            // this seems the least unpleasant of the various options available:
-            // * we could have put a check in the EventBusService to ignore the post if not yet initialized;
-            //   however this might hide other genuine errors
-            // * we could have used the thread-local in JdoStateManagerForIsis and the "skip(...)" hook in EventBusServiceJdo
-            //   to have this event be skipped; but that seems like co-opting some other design
-            // * we could have the transaction initialize the EventBusService as a "special case" before creating the Command;
-            //   but then do we worry about it being re-init'd later by the ServicesInitializer?
-
-            // so, doing it this way is this simplest, least obscure.
-
-            if(LOG.isDebugEnabled()) {
-                LOG.debug("Skipping postEvent for creation of Command pojo");
-            }
-
-        } else {
-            postLifecycleEventIfRequired(adapter, CreatedLifecycleEventFacet.class);
-        }
-
-        return adapter;
-    }
-
-
-    
-
-    // -- getServices, getService
-
-    public List<ObjectAdapter> getServices() {
-        final List<Object> services = servicesInjector.getRegisteredServices();
-        final List<ObjectAdapter> serviceAdapters = Lists.newArrayList();
-        for (final Object servicePojo : services) {
-            ObjectAdapter serviceAdapter = getAdapterFor(servicePojo);
-            if(serviceAdapter == null) {
-                throw new IllegalStateException("ObjectAdapter for service " + servicePojo + " does not exist?!?");
-            }
-            serviceAdapters.add(serviceAdapter);
-        }
-        return serviceAdapters;
-    }
-
-    
-
-    // -- helper: postEvent
-
-    void postLifecycleEventIfRequired(
-            final ObjectAdapter adapter,
-            final Class<? extends LifecycleEventFacet> lifecycleEventFacetClass) {
-        final LifecycleEventFacet facet = adapter.getSpecification().getFacet(lifecycleEventFacetClass);
-        if(facet != null) {
-            final Class<? extends AbstractLifecycleEvent<?>> eventType = facet.getEventType();
-            final Object instance = InstanceUtil.createInstance(eventType);
-            final Object pojo = adapter.getObject();
-            postEvent((AbstractLifecycleEvent) instance, pojo);
-        }
-    }
-
-    void postEvent(final AbstractLifecycleEvent<Object> event, final Object pojo) {
-        event.setSource(pojo);
-        eventBusService.post(event);
-    }
-    
-
-
-
-    // -- fixture installation
-
-    /**
-     * Determine if the object store has been initialized with its set of start
-     * up objects.
-     * 
-     * <p>
-     * This method is called only once after the init has been called. If this flag
-     * returns <code>false</code> the framework will run the fixtures to
-     * initialise the persistor.
-     * 
-     * <p>
-     * Returns the cached value of {@link #isFixturesInstalled()
-     * whether fixtures are installed} from the
-     * {@link PersistenceSessionFactory}.
-     * <p>
-     * This caching is important because if we've determined, for a given run,
-     * that fixtures are not installed, then we don't want to change our mind by
-     * asking the object store again in another session.
-     * 
-     * @see FixturesInstalledFlag
-     */
-    public boolean isFixturesInstalled() {
-        if (fixturesInstalledFlag.isFixturesInstalled() == null) {
-            fixturesInstalledFlag.setFixturesInstalled(objectStoreIsFixturesInstalled());
-        }
-        return fixturesInstalledFlag.isFixturesInstalled();
-    }
-
-
-    /**
-     * Determine if the object store has been initialized with its set of start
-     * up objects.
-     *
-     * <p>
-     * This method is called only once after the session is opened called. If it returns <code>false</code> then the
-     * framework will run the fixtures to initialise the object store.
-     *
-     * <p>
-     * Implementation looks for the {@link #INSTALL_FIXTURES_KEY} in the injected {@link #configuration configuration}.
-     *
-     * <p>
-     * By default this is not expected to be there, but utilities can add in on
-     * the fly during bootstrapping if required.
-     */
-    public boolean objectStoreIsFixturesInstalled() {
-        final boolean installFixtures = configuration.getBoolean(INSTALL_FIXTURES_KEY, INSTALL_FIXTURES_DEFAULT);
-        LOG.info("isFixturesInstalled: {} = {}", INSTALL_FIXTURES_KEY, installFixtures);
-        return !installFixtures;
-    }
-
-    
-
-    // -- loadObject
-
-    /**
-     * Loads the object identified by the specified {@link RootOid}.
-     *
-     * <p>
-     * That is, it retrieves the object identified by the specified {@link RootOid} from the object
-     * store, {@link AdapterManager#mapRecreatedPojo(org.apache.isis.core.metamodel.adapter.oid.Oid, Object) mapped by
-     * the adapter manager}.
-     *
-     * <p>The cache should be checked first and, if the object is cached,
-     * the cached version should be returned. It is important that if this
-     * method is called again, while the originally returned object is in
-     * working memory, then this method must return that same Java object.
-     *
-     * <p>
-     * Assuming that the object is not cached then the data for the object
-     * should be retrieved from the persistence mechanism and the object
-     * recreated (as describe previously). The specified OID should then be
-     * assigned to the recreated object by calling its <method>setOID </method>.
-     * Before returning the object its resolved flag should also be set by
-     * calling its <method>setResolved </method> method as well.
-     *
-     * <p>
-     * If the persistence mechanism does not known of an object with the
-     * specified {@link RootOid} then a {@link org.apache.isis.core.runtime.persistence.ObjectNotFoundException} should be
-     * thrown.
-     *
-     * <p>
-     * Note that the OID could be for an internal collection, and is
-     * therefore related to the parent object (using a {@link ParentedCollectionOid}).
-     * The elements for an internal collection are commonly stored as
-     * part of the parent object, so to get element the parent object needs to
-     * be retrieved first, and the internal collection can be got from that.
-     *
-     * <p>
-     * Returns the stored {@link ObjectAdapter} object.
-     *
-     *
-     * @return the requested {@link ObjectAdapter} that has the specified
-     *         {@link RootOid}.
-     *
-     * @throws org.apache.isis.core.runtime.persistence.ObjectNotFoundException
-     *             when no object corresponding to the oid can be found
-     */
-    public ObjectAdapter loadObjectInTransaction(final RootOid oid) {
-
-        // can be either a view model or a persistent entity.
-
-        ensureThatArg(oid, is(notNullValue()));
-
-        final ObjectAdapter adapter = getAdapterFor(oid);
-        if (adapter != null) {
-            return adapter;
-        }
-
-        return transactionManager.executeWithinTransaction(
-                new TransactionalClosureWithReturn<ObjectAdapter>() {
-                    @Override
-                    public ObjectAdapter execute() {
-                        LOG.debug("getObject; oid={}", oid);
-
-                        final Object pojo = loadPersistentPojo(oid);
-                        return mapRecreatedPojo(oid, pojo);
-                    }
-                });
-    }
-
-
-    
-
-    // -- loadPersistentPojo
-
-    private Object loadPersistentPojo(final RootOid rootOid) {
-
-        Object result;
-        try {
-            final Class<?> cls = clsOf(rootOid);
-            final Object jdoObjectId = JdoObjectIdSerializer.toJdoObjectId(rootOid);
-            FetchPlan fetchPlan = persistenceManager.getFetchPlan();
-            fetchPlan.addGroup(FetchGroup.DEFAULT);
-            result = persistenceManager.getObjectById(cls, jdoObjectId);
-        } catch (final RuntimeException e) {
-
-            Class<ExceptionRecognizer> serviceClass = ExceptionRecognizer.class;
-            final List<ExceptionRecognizer> exceptionRecognizers = lookupServices(serviceClass);
-            for (ExceptionRecognizer exceptionRecognizer : exceptionRecognizers) {
-                final ExceptionRecognizer.Recognition recognition =
-                        exceptionRecognizer.recognize2(e);
-                if(recognition != null) {
-                    if(recognition.getCategory() == ExceptionRecognizer.Category.NOT_FOUND) {
-                        throw new ObjectNotFoundException(rootOid, e);
-                    }
-                }
-            }
-
-            throw e;
-        }
-
-        if (result == null) {
-            throw new ObjectNotFoundException(rootOid);
-        }
-        return result;
-    }
-
-    private Map<RootOid,Object> loadPersistentPojos(final List<RootOid> rootOids) {
-
-        if(rootOids.isEmpty()) {
-            return zip(rootOids, Collections.emptyList());
-        }
-
-        final List<Object> dnOids = Lists.newArrayList();
-        for (final RootOid rootOid : rootOids) {
-            final Object id = JdoObjectIdSerializer.toJdoObjectId(rootOid);
-            if(id instanceof SingleFieldIdentity) {
-                dnOids.add(id);
-            } else if (id instanceof String && ((String) id).contains("[OID]")) {
-                final DatastoreIdImpl datastoreId = new DatastoreIdImpl((String)id);
-                dnOids.add(datastoreId);
-            } else {
-                // application identity
-                final DatastoreIdImpl datastoreId = new DatastoreIdImpl(clsOf(rootOid).getName(), id);
-                dnOids.add(datastoreId);
-            }
-        }
-        FetchPlan fetchPlan = persistenceManager.getFetchPlan();
-        fetchPlan.addGroup(FetchGroup.DEFAULT);
-        final List<Object> persistentPojos = Lists.newArrayList();
-        try {
-            final Collection<Object> pojos = persistenceManager.getObjectsById(dnOids, true);
-            for (final Object pojo : pojos) {
-                try {
-                    persistentPojos.add(pojo);
-                } catch(Exception ex) {
-                    persistentPojos.add(null);
-                }
-            }
-        } catch(NucleusObjectNotFoundException nonfe) {
-            // at least one not found; fall back to loading one by one
-            for (final Object dnOid : dnOids) {
-                try {
-                    final Object persistentPojo = persistenceManager.getObjectById(dnOid);
-                    persistentPojos.add(persistentPojo);
-                } catch(Exception ex) {
-                    persistentPojos.add(null);
-                }
-            }
-        }
-        Map<RootOid, Object> pojoByOid = zip(rootOids, persistentPojos);
-        return pojoByOid;
-    }
-
-    private static Map<RootOid, Object> zip(final List<RootOid> rootOids, final Collection<Object> pojos) {
-        final Map<RootOid,Object> pojoByOid = Maps.newLinkedHashMap();
-        int i = 0;
-        for (final Object pojo : pojos) {
-            final RootOid rootOid = rootOids.get(i++);
-            pojoByOid.put(rootOid, pojo);
-        }
-        return pojoByOid;
-    }
-
-    private Class<?> clsOf(final RootOid oid) {
-        final ObjectSpecification objectSpec = getSpecificationLoader().lookupBySpecId(oid.getObjectSpecId());
-        return objectSpec.getCorrespondingClass();
-    }
-
-    
-
-    // -- lazilyLoaded
-
-
-    public ObjectAdapter mapPersistent(final Persistable pojo) {
-        if (persistenceManager.getObjectId(pojo) == null) {
-            return null;
-        }
-        final RootOid oid = createPersistentOrViewModelOid(pojo);
-        final ObjectAdapter adapter = mapRecreatedPojo(oid, pojo);
-        return adapter;
-    }
-
-
-    
-
-    // -- refreshRootInTransaction, refreshRoot, resolve
-
-    /**
-     * Re-initialises the fields of an object. If the object is unresolved then
-     * the object's missing data should be retrieved from the persistence
-     * mechanism and be used to set up the value objects and associations.
-     */
-    public void refreshRootInTransaction(final ObjectAdapter adapter) {
-        Assert.assertTrue("only resolve object that is persistent", adapter, adapter.representsPersistent());
-        getTransactionManager().executeWithinTransaction(new TransactionalClosure() {
-
-            @Override
-            public void execute() {
-
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("resolveImmediately; oid={}", adapter.getOid().enString());
-                }
-
-                if (!adapter.representsPersistent()) {
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("; not persistent - ignoring");
-                    }
-                    return;
-                }
-
-                refreshRoot(adapter);
-            }
-
-        });
-    }
-
-    /**
-     * Forces a reload (refresh in JDO terminology) of the domain object wrapped in the {@link ObjectAdapter}.
-     */
-    public void refreshRoot(final ObjectAdapter adapter) {
-
-        final Object domainObject = adapter.getObject();
-        if (domainObject == null) {
-            // REVIEW: is this possible?
-            throw new PojoRefreshException(adapter.getOid());
-        }
-
-        try {
-            persistenceManager.refresh(domainObject);
-        } catch (final RuntimeException e) {
-            throw new PojoRefreshException(adapter.getOid(), e);
-        }
-
-        // possibly redundant because also called in the post-load event
-        // listener, but (with JPA impl) found it was required if we were ever to
-        // get an eager left-outer-join as the result of a refresh (sounds possible).
-        initializeMapAndCheckConcurrency((Persistable) domainObject);
-    }
-
-    public void resolve(final Object parent) {
-        final ObjectAdapter adapter = adapterFor(parent);
-        refreshRootInTransaction(adapter);
-    }
-
-    
-
-    // -- makePersistent
-
-    /**
-     * Makes an {@link ObjectAdapter} persistent. The specified object should be
-     * stored away via this object store's persistence mechanism, and have a
-     * new and unique OID assigned to it. The object, should also be added to
-     * the {@link PersistenceSession} as the object is implicitly 'in use'.
-     *
-     * <p>
-     * If the object has any associations then each of these, where they aren't
-     * already persistent, should also be made persistent by recursively calling
-     * this method.
-     *
-     * <p>
-     * If the object to be persisted is a collection, then each element of that
-     * collection, that is not already persistent, should be made persistent by
-     * recursively calling this method.
-     */
-    public void makePersistentInTransaction(final ObjectAdapter adapter) {
-        if (adapter.representsPersistent()) {
-            throw new NotPersistableException("Object already persistent: " + adapter);
-        }
-        final ObjectSpecification specification = adapter.getSpecification();
-        if (specification.isService()) {
-            throw new NotPersistableException("Cannot persist services: " + adapter);
-        }
-
-        getTransactionManager().executeWithinTransaction(new TransactionalClosure() {
-
-            @Override
-            public void execute() {
-                makePersistentTransactionAssumed(adapter);
-
-                // clear out the map of transient -> persistent
-                PersistenceSession.this.persistentByTransient.clear();
-            }
-
-        });
-    }
-
-    private void makePersistentTransactionAssumed(final ObjectAdapter adapter) {
-        if (alreadyPersistedOrNotPersistable(adapter)) {
-            return;
-        }
-        LOG.debug("persist {}", adapter);
-
-        // previously we called the PersistingCallback here.
-        // this is now done in the JDO framework synchronizer.
-        //
-        // the guard below used to be because (apparently)
-        // the callback might have caused the adapter to become persistent.
-        // leaving it in as think it does no harm...
-        if (alreadyPersistedOrNotPersistable(adapter)) {
-            return;
-        }
-        addCreateObjectCommand(adapter);
-    }
-
-    /**
-     * {@link #newCreateObjectCommand(ObjectAdapter) Create}s a {@link CreateObjectCommand}, and adds to the
-     * {@link IsisTransactionManager}.
-     */
-    private void addCreateObjectCommand(final ObjectAdapter object) {
-        final CreateObjectCommand createObjectCommand = newCreateObjectCommand(object);
-        transactionManager.addCommand(createObjectCommand);
-    }
-
-
-
-    private static boolean alreadyPersistedOrNotPersistable(final ObjectAdapter adapter) {
-        return adapter.representsPersistent() || objectSpecNotPersistable(adapter);
-    }
-
-
-    private static boolean objectSpecNotPersistable(final ObjectAdapter adapter) {
-        return adapter.isParentedCollection();
-    }
-
-
-    
-
-    // -- ObjectPersistor impl
-    public void makePersistent(final ObjectAdapter adapter) {
-        makePersistentInTransaction(adapter);
-    }
-
-    public void remove(final ObjectAdapter adapter) {
-        destroyObjectInTransaction(adapter);
-    }
-    
 
+public interface PersistenceSession extends AdapterManager, TransactionalResource, SessionScopedComponent {
 
-    // -- destroyObjectInTransaction
+	String SERVICE_IDENTIFIER = "1";
 
-    /**
-     * Removes the specified object from the system. The specified object's data
-     * should be removed from the persistence mechanism.
-     */
-    public void destroyObjectInTransaction(final ObjectAdapter adapter) {
-        final ObjectSpecification spec = adapter.getSpecification();
-        if (spec.isParented()) {
-            return;
-        }
-        LOG.debug("destroyObject {}", adapter);
-        transactionManager.executeWithinTransaction(new TransactionalClosure() {
-            @Override
-            public void execute() {
-                final DestroyObjectCommand command = newDestroyObjectCommand(adapter);
-                transactionManager.addCommand(command);
-            }
-        });
-    }
+	boolean isFixturesInstalled();
 
-    
+	IsisTransactionManager getTransactionManager();
 
-    // -- newXxxCommand
-    /**
-     * Makes an {@link ObjectAdapter} persistent. The specified object should be
-     * stored away via this object store's persistence mechanism, and have an
-     * new and unique OID assigned to it (by calling the object's
-     * <code>setOid</code> method). The object, should also be added to the
-     * cache as the object is implicitly 'in use'.
-     *
-     * <p>
-     * If the object has any associations then each of these, where they aren't
-     * already persistent, should also be made persistent by recursively calling
-     * this method.
-     * </p>
-     *
-     * <p>
-     * If the object to be persisted is a collection, then each element of that
-     * collection, that is not already persistent, should be made persistent by
-     * recursively calling this method.
-     * </p>
-     *
-     */
-    private CreateObjectCommand newCreateObjectCommand(final ObjectAdapter adapter) {
-        ensureOpened();
+	Object instantiateAndInjectServices(ObjectSpecification spec);
 
-        LOG.debug("create object - creating command for: {}", adapter);
-        if (adapter.representsPersistent()) {
-            throw new IllegalArgumentException("Adapter is persistent; adapter: " + adapter);
-        }
-        return new DataNucleusCreateObjectCommand(adapter, persistenceManager);
-    }
+	List<ObjectAdapter> getServices();
 
-    private DestroyObjectCommand newDestroyObjectCommand(final ObjectAdapter adapter) {
-        ensureOpened();
+	void makePersistentInTransaction(ObjectAdapter adapter);
 
-        LOG.debug("destroy object - creating command for: {}", adapter);
-        if (!adapter.representsPersistent()) {
-            throw new IllegalArgumentException("Adapter is not persistent; adapter: " + adapter);
-        }
-        return new DataNucleusDeleteObjectCommand(adapter, persistenceManager);
-    }
-    
+	void destroyObjectInTransaction(ObjectAdapter adapter);
 
-    // -- execute
-    public void execute(final List<PersistenceCommand> commands) {
+	ObjectAdapter createTransientInstance(ObjectSpecification spec);
 
-        // previously we used to check that there were some commands, and skip processing otherwise.
-        // we no longer do that; it could be (is quite likely) that DataNucleus has some dirty objects anyway that
-        // don't have commands wrapped around them...
+	ObjectAdapter createViewModelInstance(ObjectSpecification spec, String memento);
 
-        executeCommands(commands);
-    }
+	Object lookup(Bookmark bookmark, FieldResetPolicy fieldResetPolicy);
 
-    private void executeCommands(final List<PersistenceCommand> commands) {
+	void resolve(Object parent);
 
-        for (final PersistenceCommand command : commands) {
-            command.execute(null);
-        }
-        persistenceManager.flush();
-    }
-    
+	<T> List<ObjectAdapter> allMatchingQuery(final Query<T> query);
+	<T> ObjectAdapter firstMatchingQuery(final Query<T> query);
 
-    // -- getAggregateRoot, remappedFrom
+	ServicesInjector getServicesInjector();
 
-    private Map<Oid, Oid> persistentByTransient = Maps.newHashMap();
+	void execute(List<PersistenceCommand> persistenceCommandList);
 
-    public ObjectAdapter getAggregateRoot(final ParentedCollectionOid collectionOid) {
-        final Oid rootOid = collectionOid.getRootOid();
-        ObjectAdapter rootadapter = getAdapterFor(rootOid);
-        if(rootadapter == null) {
-            final Oid parentOidNowPersisted = remappedFrom(rootOid);
-            rootadapter = getAdapterFor(parentOidNowPersisted);
-        }
-        return rootadapter;
-    }
+	void open();
 
-    /**
-     * To support ISIS-234; keep track, for the duration of the transaction only,
-     * of the old transient {@link Oid}s and their corresponding persistent {@link Oid}s.
-     */
-    private Oid remappedFrom(final Oid transientOid) {
-        return persistentByTransient.get(transientOid);
-    }
+	void close();
 
+	ObjectAdapter adapterForAny(RootOid rootOid);
 
-    
+	ObjectAdapter adapterFor(RootOid oid, ConcurrencyChecking concurrencyChecking);
 
-    // -- transactions
-    public void startTransaction() {
-        final javax.jdo.Transaction transaction = persistenceManager.currentTransaction();
-        if (transaction.isActive()) {
-            throw new IllegalStateException("Transaction already active");
-        }
-        transaction.begin();
-    }
+	Map<RootOid, ObjectAdapter> adaptersFor(List<RootOid> rootOids);
 
-    public void endTransaction() {
-        final javax.jdo.Transaction transaction = persistenceManager.currentTransaction();
-        if (transaction.isActive()) {
-            transaction.commit();
-        }
-    }
-
-    public void abortTransaction() {
-        final javax.jdo.Transaction transaction = persistenceManager.currentTransaction();
-        if (transaction.isActive()) {
-            transaction.rollback();
-        }
-    }
-
-    
-
-
-    // -- dependencies (from constructor)
-
-    protected SpecificationLoader getSpecificationLoader() {
-        return specificationLoader;
-    }
-    protected AuthenticationSession getAuthenticationSession() {
-        return authenticationSession;
-    }
-
-    /**
-     * The configured {@link ServicesInjector}.
-     */
-    public ServicesInjector getServicesInjector() {
-        return servicesInjector;
-    }
-
-
-    
-
-    // -- transactionManager
-
-
-    /**
-     * The configured {@link IsisTransactionManager}.
-     */
-    public IsisTransactionManager getTransactionManager() {
-        return transactionManager;
-    }
-
-//    // for testing only
-//    void setTransactionManager(final IsisTransactionManager transactionManager) {
-//        this.transactionManager = transactionManager;
-//    }
-
-
-    
-
-
-    // -- jdoPersistenceManager delegate methods
-    public javax.jdo.Query newJdoQuery(Class<?> cls) {
-        return persistenceManager.newQuery(cls);
-    }
-
-    public javax.jdo.Query newJdoNamedQuery (Class<?> cls, String queryName) {
-        return persistenceManager.newNamedQuery(cls, queryName);
-    }
-
-    public javax.jdo.Query newJdoQuery (Class<?> cls, String filter) {
-        return persistenceManager.newQuery(cls, filter);
-    }
-    // endregion
-
-    // -- AdapterManager implementation
-
-    private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
-    private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
-
-    @Override
-    public ObjectAdapter getAdapterFor(final Object pojo) {
-        ensureThatArg(pojo, is(notNullValue()));
-
-        return pojoAdapterMap.getAdapter(pojo);
-    }
-
-    @Override
-    public ObjectAdapter getAdapterFor(final Oid oid) {
-        ensureThatArg(oid, is(notNullValue()));
-        ensureMapsConsistent(oid);
-
-        return oidAdapterMap.getAdapter(oid);
-    }
-
-
-    private ObjectAdapter existingOrValueAdapter(Object pojo) {
-
-        // attempt to locate adapter for the pojo
-        ObjectAdapter adapter = getAdapterFor(pojo);
-        if (adapter != null) {
-            return adapter;
-        }
-
-        // pojo may have been lazily loaded by object store, but we haven't yet seen it
-        if (pojo instanceof Persistable) {
-            adapter = mapPersistent((Persistable) pojo);
-
-            // TODO: could return null if the pojo passed in !dnIsPersistent() || !dnIsDetached()
-            // in which case, we would ought to map as a transient object, rather than fall through and treat as a value?
-        } else {
-            adapter = null;
-        }
-
-        if(adapter != null) {
-            return adapter;
-        }
-
-        // need to create (and possibly map) the adapter.
-        final ObjectSpecification objSpec = specificationLoader.loadSpecification(pojo.getClass());
-
-        // we create value facets as standalone (so not added to maps)
-        if (objSpec.containsFacet(ValueFacet.class)) {
-            adapter = createStandaloneAdapter(pojo);
-            return adapter;
-        }
-
-        return null;
-    }
-
-
-
-    /**
-     * Fail early if any problems.
-     */
-    private void ensureMapsConsistent(final ObjectAdapter adapter) {
-        if (adapter.isValue()) {
-            return;
-        }
-        if (adapter.isParentedCollection()) {
-            return;
-        }
-        ensurePojoAdapterMapConsistent(adapter);
-        ensureOidAdapterMapConsistent(adapter);
-    }
-
-    /**
-     * Fail early if any problems.
-     */
-    private void ensureMapsConsistent(final Oid oid) {
-        ensureThatArg(oid, is(notNullValue()));
-
-        final ObjectAdapter adapter = oidAdapterMap.getAdapter(oid);
-        if (adapter == null) {
-            return;
-        }
-        ensureOidAdapterMapConsistent(adapter);
-        ensurePojoAdapterMapConsistent(adapter);
-    }
-
-    private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
-        final Object adapterPojo = adapter.getObject();
-        final ObjectAdapter adapterAccordingToMap = pojoAdapterMap.getAdapter(adapterPojo);
-
-        if(adapterPojo == null) {
-            // nothing to check
-            return;
-        }
-        ensureMapConsistent(adapter, adapterAccordingToMap, "PojoAdapterMap");
-    }
-
-    private void ensureOidAdapterMapConsistent(final ObjectAdapter adapter) {
-        final Oid adapterOid = adapter.getOid();
-        final ObjectAdapter adapterAccordingToMap = oidAdapterMap.getAdapter(adapterOid);
-
-        if(adapterOid == null) {
-            // nothing to check
-            return;
-        }
-        ensureMapConsistent(adapter, adapterAccordingToMap, "OidAdapterMap");
-    }
-
-    private void ensureMapConsistent(
-            final ObjectAdapter adapter,
-            final ObjectAdapter adapterAccordingToMap,
-            final String mapName) {
-
-        final Oid adapterOid = adapter.getOid();
-
-        // take care not to touch the pojo, since it might have been deleted.
-
-        if(adapterAccordingToMap == null) {
-            throw new IllegalStateException("mismatch in "
-                    + mapName
-                    + ": provided adapter's OID: " + adapterOid + "; but no adapter found in map");
-        }
-        ensureThatArg(
-                adapter, is(adapterAccordingToMap),
-                "mismatch in "
-                        + mapName
-                        + ": provided adapter's OID: " + adapterOid + ", \n"
-                        + "but map's adapter's OID was: " + adapterAccordingToMap.getOid());
-    }
-
-    public ObjectAdapter adapterForAny(RootOid rootOid) {
-
-        final ObjectSpecId specId = rootOid.getObjectSpecId();
-        final ObjectSpecification spec = getSpecificationLoader().lookupBySpecId(specId);
-        if(spec == null) {
-            // eg "NONEXISTENT:123"
-            return null;
-        }
-
-        if(spec.containsFacet(ViewModelFacet.class)) {
-
-            // this is a hack; the RO viewer when rendering the URL for the view model loses the "view model" indicator
-            // ("*") from the specId, meaning that the marshalling logic above in RootOidDefault.deString() creates an
-            // oid in the wrong state.  The code below checks for this and recreates the oid with the current state of 'view model'
-            if(!rootOid.isViewModel()) {
-                rootOid = new RootOid(rootOid.getObjectSpecId(), rootOid.getIdentifier(), Oid.State.VIEWMODEL);
-            }
-
-            try {
-                return adapterFor(rootOid);
-            } catch(final ObjectNotFoundException ex) {
-                return null;
-            } catch(final PojoRecreationException ex) {
-                return null;
-            }
-        } else {
-            try {
-                ObjectAdapter objectAdapter = loadObjectInTransaction(rootOid);
-                return objectAdapter.isTransient() ? null : objectAdapter;
-            } catch(final ObjectNotFoundException ex) {
-                return null;
-            }
-        }
-    }
-
-    public Map<RootOid, ObjectAdapter> adaptersFor(final List<RootOid> rootOids) {
-        return adaptersFor(rootOids, ConcurrencyChecking.NO_CHECK);
-    }
-
-    public Map<RootOid,ObjectAdapter> adaptersFor(
-            final List<RootOid> rootOids,
-            final ConcurrencyChecking concurrencyChecking) {
-
-        final Map<RootOid, ObjectAdapter> adapterByOid = Maps.newLinkedHashMap();
-
-        List<RootOid> notYetLoadedOids = Lists.newArrayList();
-        for (RootOid rootOid : rootOids) {
-            // attempt to locate adapter for the Oid
-            ObjectAdapter adapter = getAdapterFor(rootOid);
-            // handle view models or transient
-            if (adapter == null) {
-                if (rootOid.isTransient() || rootOid.isViewModel()) {
-                    final Object pojo = recreatePojoTransientOrViewModel(rootOid);
-                    adapter = mapRecreatedPojo(rootOid, pojo);
-                    sync(concurrencyChecking, adapter, rootOid);
-                }
-            }
-            if (adapter != null) {
-                adapterByOid.put(rootOid, adapter);
-            } else {
-                // persistent oid, to load in bulk
-                notYetLoadedOids.add(rootOid);
-            }
-        }
-
-        // recreate, in bulk, all those not yet loaded
-        final Map<RootOid, Object> pojoByOid = loadPersistentPojos(notYetLoadedOids);
-        for (Map.Entry<RootOid, Object> entry : pojoByOid.entrySet()) {
-            final RootOid rootOid = entry.getKey();
-            final Object pojo = entry.getValue();
-            if(pojo != null) {
-                ObjectAdapter adapter;
-                try {
-                    adapter = mapRecreatedPojo(rootOid, pojo);
-                    adapterByOid.put(rootOid, adapter);
-                } catch(ObjectNotFoundException ex) {
-                    throw ex; // just rethrow
-                } catch(RuntimeException ex) {
-                    throw new PojoRecreationException(rootOid, ex);
-                }
-                sync(concurrencyChecking, adapter, rootOid);
-            } else {
-                // null indicates it couldn't be loaded
-                // do nothing here...
-            }
-        }
-
-        return adapterByOid;
-    }
-
-    /**
-     * As per {@link #adapterFor(RootOid, ConcurrencyChecking)}, with
-     * {@link ConcurrencyChecking#NO_CHECK no checking}.
-     *
-     * <p>
-     * This method  will <i>always</i> return an object, possibly indicating it is persistent; so make sure that you
-     * know that the oid does indeed represent an object you know exists.
-     * </p>
-     */
-    public ObjectAdapter adapterFor(final RootOid rootOid) {
-        return adapterFor(rootOid, ConcurrencyChecking.NO_CHECK);
-    }
-
-
-    /**
-     * Either returns an existing {@link ObjectAdapter adapter} (as per
-     * {@link #getAdapterFor(Oid)}), otherwise re-creates an adapter with the
-     * specified (persistent) {@link Oid}.
-     *
-     * <p>
-     * Typically called when the {@link Oid} is already known, that is, when
-     * resolving an already-persisted object. Is also available for
-     * <tt>Memento</tt> support however, so {@link Oid} could also represent a
-     * {@link Oid#isTransient() transient} object.
-     *
-     * <p>
-     * The pojo itself is recreated by delegating to a {@link AdapterManager}.
-     *
-     * <p>
-     * The {@link ConcurrencyChecking} parameter determines whether concurrency checking is performed.
-     * If it is requested, then a check is made to ensure that the {@link Oid#getVersion() version}
-     * of the {@link RootOid oid} of the recreated adapter is the same as that of the provided {@link RootOid oid}.
-     * If the version differs, then a {@link ConcurrencyException} is thrown.
-     *
-     * <p>
-     * ALSO, even if a {@link ConcurrencyException}, then the provided {@link RootOid oid}'s {@link Version version}
-     * will be {@link RootOid#setVersion(Version) set} to the current
-     * value.  This allows the client to retry if they wish.
-     *
-     * @throws {@link org.apache.isis.core.runtime.persistence.ObjectNotFoundException} if the object does not exist.
-     */
-    public ObjectAdapter adapterFor(
-            final RootOid rootOid,
-            final ConcurrencyChecking concurrencyChecking) {
-
-        // attempt to locate adapter for the Oid
-        ObjectAdapter adapter = getAdapterFor(rootOid);
-        if (adapter == null) {
-            // else recreate
-            try {
-                final Object pojo;
-                if(rootOid.isTransient() || rootOid.isViewModel()) {
-                    pojo = recreatePojoTransientOrViewModel(rootOid);
-                } else {
-                    pojo = loadPersistentPojo(rootOid);
-                }
-                adapter = mapRecreatedPojo(rootOid, pojo);
-            } catch(ObjectNotFoundException ex) {
-                throw ex; // just rethrow
-            } catch(RuntimeException ex) {
-                throw new PojoRecreationException(rootOid, ex);
-            }
-        }
-
-        // sync versions of original, with concurrency checking if required
-        sync(concurrencyChecking, adapter, rootOid);
-
-        return adapter;
-    }
-
-
-
-    private void sync(
-            final ConcurrencyChecking concurrencyChecking,
-            final ObjectAdapter adapter, final RootOid rootOid) {
-        // sync versions of original, with concurrency checking if required
-        Oid adapterOid = adapter.getOid();
-        if(adapterOid instanceof RootOid) {
-            final RootOid recreatedOid = (RootOid) adapterOid;
-            final RootOid originalOid = rootOid;
-
-            try {
-                if(concurrencyChecking.isChecking()) {
-
-                    // check for exception, but don't throw if suppressed through thread-local
-                    final Version otherVersion = originalOid.getVersion();
-                    final Version thisVersion = recreatedOid.getVersion();
-                    if( thisVersion != null &&
-                            otherVersion != null &&
-                            thisVersion.different(otherVersion)) {
-
-                        if(concurrencyCheckingGloballyEnabled && ConcurrencyChecking.isCurrentlyEnabled()) {
-                            LOG.info("concurrency conflict detected on {} ({})", recreatedOid, otherVersion);
-                            final String currentUser = authenticationSession.getUserName();
-                            throw new ConcurrencyException(currentUser, recreatedOid, thisVersion, otherVersion);
-                        } else {
-                            LOG.info("concurrency conflict detected but suppressed, on {} ({})", recreatedOid, otherVersion);
-                        }
-                    }
-                }
-            } finally {
-                final Version originalVersion = originalOid.getVersion();
-                final Version recreatedVersion = recreatedOid.getVersion();
-                if(recreatedVersion != null && (
-                        originalVersion == null ||
-                                recreatedVersion.different(originalVersion))
-                        ) {
-                    if(LOG.isDebugEnabled()) {
-                        LOG.debug("updating version in oid, on {} ({}) to ({})", originalOid, originalVersion, recreatedVersion);
-                    }
-                    originalOid.setVersion(recreatedVersion);
-                }
-            }
-        }
-    }
-
-    private Object recreatePojoTransientOrViewModel(final RootOid rootOid) {
-        final ObjectSpecification spec =
-                specificationLoader.lookupBySpecId(rootOid.getObjectSpecId());
-        final Object pojo;
-
-        if(rootOid.isViewModel()) {
-
-            final String memento = rootOid.getIdentifier();
-            pojo = recreateViewModel(spec, memento);
-
-        } else {
-            pojo = instantiateAndInjectServices(spec);
-
-        }
-        return pojo;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ObjectAdapter adapterFor(final Object pojo) {
-
-        if(pojo == null) {
-            return null;
-        }
-        final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo);
-        if(existingOrValueAdapter != null) {
-            return existingOrValueAdapter;
-        }
-
-        final ObjectAdapter newAdapter = createTransientOrViewModelRootAdapter(pojo);
-
-        return mapAndInjectServices(newAdapter);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ObjectAdapter adapterFor(final Object pojo, final ObjectAdapter parentAdapter, final OneToManyAssociation collection) {
-
-        assert parentAdapter != null;
-        assert collection != null;
-
-        final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo);
-        if(existingOrValueAdapter != null) {
-            return existingOrValueAdapter;
-        }
-
-        // the List, Set etc. instance gets wrapped in its own adapter
-        final ObjectAdapter newAdapter = createCollectionAdapter(pojo, parentAdapter, collection);
-
-        return mapAndInjectServices(newAdapter);
-    }
-
-    /**
-     * Creates an {@link ObjectAdapter adapter} to represent a collection
-     * of the parent.
-     *
-     * <p>
-     * The returned adapter will have a {@link ParentedCollectionOid}; its version
-     * and its persistence are the same as its owning parent.
-     *
-     * <p>
-     * Should only be called if the pojo is known not to be
-     * {@link #getAdapterFor(Object) mapped}.
-     */
-    private ObjectAdapter createCollectionAdapter(
-            final Object pojo,
-            final ObjectAdapter parentAdapter,
-            final OneToManyAssociation otma) {
-
-        ensureMapsConsistent(parentAdapter);
-        Assert.assertNotNull(pojo);
-
-        final Oid parentOid = parentAdapter.getOid();
-
-        // persistence of collection follows the parent
-        final ParentedCollectionOid collectionOid = new ParentedCollectionOid((RootOid) parentOid, otma);
-        final ObjectAdapter collectionAdapter = createCollectionAdapter(pojo, collectionOid);
-
-        // we copy over the type onto the adapter itself
-        // [not sure why this is really needed, surely we have enough info in
-        // the adapter
-        // to look this up on the fly?]
-        final TypeOfFacet facet = otma.getFacet(TypeOfFacet.class);
-        collectionAdapter.setElementSpecificationProvider(ElementSpecificationProviderFromTypeOfFacet.createFrom(facet));
-
-        return collectionAdapter;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>
-     * Note that there is no management of {@link Version}s here. That is
-     * because the {@link PersistenceSession} is expected to manage this.
-     *
-     * @param hintRootOid - allow a different persistent root oid to be provided.
-     */
-    public void remapAsPersistent(final ObjectAdapter adapter, RootOid hintRootOid) {
-
-        final ObjectAdapter rootAdapter = adapter.getAggregateRoot();  // TODO: REVIEW: think this is redundant; would seem this method is only ever called for roots anyway.
-        final RootOid transientRootOid = (RootOid) rootAdapter.getOid();
-
-        // no longer true, because isTransient now looks directly at the underlying pojo's state (for entities)
-        // and doesn't apply for services.
-        //        Ensure.ensureThatArg(rootAdapter.isTransient(), is(true), "root adapter should be transient; oid:" + transientRootOid);
-        //        Ensure.ensureThatArg(transientRootOid.isTransient(), is(true), "root adapter's OID should be transient; oid:" + transientRootOid);
-
-        final RootAndCollectionAdapters rootAndCollectionAdapters = new RootAndCollectionAdapters(adapter, this);
-
-        LOG.debug("remapAsPersistent: {}", transientRootOid);
-        LOG.debug("removing root adapter from oid map");
-
-        boolean removed = oidAdapterMap.remove(transientRootOid);
-        if (!removed) {
-            LOG.warn("could not remove oid: {}", transientRootOid);
-            // should we fail here with a more serious error?
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("removing collection adapter(s) from oid map");
-        }
-        for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
-            final Oid collectionOid = collectionAdapter.getOid();
-            removed = oidAdapterMap.remove(collectionOid);
-            if (!removed) {
-                LOG.warn("could not remove collectionOid: {}", collectionOid);
-                // should we fail here with a more serious error?
-            }
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("updating the Oid");
-        }
-
-        // intended for testing (bit nasty)
-        final RootOid persistedRootOid;
-        if(hintRootOid != null) {
-            if(hintRootOid.isTransient()) {
-                throw new IsisAssertException("hintRootOid must be persistent");
-            }
-            final ObjectSpecId hintRootOidObjectSpecId = hintRootOid.getObjectSpecId();
-            final ObjectSpecId adapterObjectSpecId = adapter.getSpecification().getSpecId();
-            if(!hintRootOidObjectSpecId.equals(adapterObjectSpecId)) {
-                throw new IsisAssertException("hintRootOid's objectType must be same as that of adapter " +
-                        "(was: '" + hintRootOidObjectSpecId + "'; adapter's is " + adapterObjectSpecId + "'");
-            }
-            // ok
-            persistedRootOid = hintRootOid;
-        } else {
-            // normal flow - delegate to OidGenerator to obtain a persistent root oid
-            persistedRootOid = createPersistentOrViewModelOid(adapter.getObject());
-        }
-
-        // associate root adapter with the new Oid, and remap
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("replacing Oid for root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString());
-        }
-        adapter.replaceOid(persistedRootOid);
-        oidAdapterMap.add(persistedRootOid, adapter);
-
-        // associate the collection adapters with new Oids, and re-map
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("replacing Oids for collection adapter(s) and re-adding into maps");
-        }
-        for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
-            final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid();
-            final ParentedCollectionOid persistedCollectionOid = previousCollectionOid.asPersistent(persistedRootOid);
-            oidAdapterMap.add(persistedCollectionOid, collectionAdapter);
-        }
-
-
-        // some object store implementations may replace collection instances (eg ORM may replace with a cglib-enhanced
-        // proxy equivalent.  So, ensure that the collection adapters still wrap the correct pojos.
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("synchronizing collection pojos, remapping in pojo map if required");
-        }
-        for (final OneToManyAssociation otma : rootAndCollectionAdapters.getCollections()) {
-            final ObjectAdapter collectionAdapter = rootAndCollectionAdapters.getCollectionAdapter(otma);
-
-            final Object collectionPojoWrappedByAdapter = collectionAdapter.getObject();
-            final Object collectionPojoActuallyOnPojo = getCollectionPojo(otma, adapter);
-
-            if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
-                pojoAdapterMap.remove(collectionAdapter);
-                collectionAdapter.replacePojo(collectionPojoActuallyOnPojo);
-                pojoAdapterMap.add(collectionPojoActuallyOnPojo, collectionAdapter);
-            }
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("made persistent {}; was {}", adapter, transientRootOid);
-        }
-    }
-
-    private static Object getCollectionPojo(final OneToManyAssociation association, final ObjectAdapter ownerAdapter) {
-        final PropertyOrCollectionAccessorFacet accessor = association.getFacet(PropertyOrCollectionAccessorFacet.class);
-        return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
-    }
-
-
-
-    /**
-     * Either returns an existing {@link ObjectAdapter adapter} (as per
-     * {@link #getAdapterFor(Object)} or {@link #getAdapterFor(Oid)}), otherwise
-     * re-creates an adapter with the specified (persistent) {@link Oid}.
-     *
-     * <p>
-     * Typically called when the {@link Oid} is already known, that is, when
-     * resolving an already-persisted object. Is also available for
-     * <tt>Memento</tt> support however, so {@link Oid} could also represent a
-     * {@link Oid#isTransient() transient} object.
-     *
-     * @param oid
-     * @param recreatedPojo - already known to the object store impl, or a service
-     */
-    @Override
-    public ObjectAdapter mapRecreatedPojo(final Oid oid, final Object recreatedPojo) {
-
-        // attempt to locate adapter for the pojo
-        // REVIEW: this check is possibly redundant because the pojo will most likely
-        // have just been instantiated, so won't yet be in any maps
-        final ObjectAdapter adapterLookedUpByPojo = getAdapterFor(recreatedPojo);
-        if (adapterLookedUpByPojo != null) {
-            return adapterLookedUpByPojo;
-        }
-
-        // attempt to locate adapter for the Oid
-        final ObjectAdapter adapterLookedUpByOid = getAdapterFor(oid);
-        if (adapterLookedUpByOid != null) {
-            return adapterLookedUpByOid;
-        }
-
-        final ObjectAdapter createdAdapter = createRootOrAggregatedAdapter(oid, recreatedPojo);
-        return mapAndInjectServices(createdAdapter);
-    }
-
-    /**
-     * Removes the specified object from both the identity-adapter map, and the
-     * pojo-adapter map.
-     *
-     * <p>
-     * This indicates that the object is no longer in use, and therefore that no
-     * objects exists within the system.
-     *
-     * <p>
-     * If an {@link ObjectAdapter adapter} is removed while its pojo still is
-     * referenced then a subsequent interaction of that pojo will create a
-     * different {@link ObjectAdapter adapter}.
-     *
-     * <p>
-     * TODO: should do a cascade remove of any aggregated objects.
-     */
-    @Override
-    public void removeAdapter(final ObjectAdapter adapter) {
-        ensureMapsConsistent(adapter);
-
-        LOG.debug("removing adapter: {}", adapter);
-
-        unmap(adapter);
-    }
-
-    private void unmap(final ObjectAdapter adapter) {
-        ensureMapsConsistent(adapter);
-
-        final Oid oid = adapter.getOid();
-        if (oid != null) {
-            oidAdapterMap.remove(oid);
-        }
-        pojoAdapterMap.remove(adapter);
-    }
-
-
-    public void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
-        removeAdapter(adapter);
-        adapter.replacePojo(pojo);
-        mapAndInjectServices(adapter);
-    }
-
-
-    private ObjectAdapter createRootOrAggregatedAdapter(final Oid oid, final Object pojo) {
-        final ObjectAdapter createdAdapter;
-        if(oid instanceof RootOid) {
-            final RootOid rootOid = (RootOid) oid;
-            createdAdapter = createRootAdapter(pojo, rootOid);
-        } else /*if (oid instanceof CollectionOid)*/ {
-            final ParentedCollectionOid collectionOid = (ParentedCollectionOid) oid;
-            createdAdapter = createCollectionAdapter(pojo, collectionOid);
-        }
-        return createdAdapter;
-    }
-
-    /**
-     * Creates a new transient root {@link ObjectAdapter adapter} for the supplied domain
-     * object.
-     */
-    private ObjectAdapter createTransientOrViewModelRootAdapter(final Object pojo) {
-        final RootOid rootOid = createTransientOrViewModelOid(pojo);
-        return createRootAdapter(pojo, rootOid);
-    }
-
-    /**
-     * Creates a {@link ObjectAdapter adapter} with no {@link Oid}.
-     *
-     * <p>
-     * Standalone adapters are never {@link #mapAndInjectServices(ObjectAdapter) mapped}
-     * (they have no {@link Oid}, after all).
-     *
-     * <p>
-     * Should only be called if the pojo is known not to be
-     * {@link #getAdapterFor(Object) mapped}, and for immutable value types
-     * referenced.
-     */
-    private ObjectAdapter createStandaloneAdapter(final Object pojo) {
-        return createAdapter(pojo, null);
-    }
-
-    /**
-     * Creates (but does not {@link #mapAndInjectServices(ObjectAdapter) map}) a new
-     * root {@link ObjectAdapter adapter} for the supplied domain object.
-     *
-     * @see #createStandaloneAdapter(Object)
-     * @see #createCollectionAdapter(Object, ParentedCollectionOid)
-     */
-    private ObjectAdapter createRootAdapter(final Object pojo, RootOid rootOid) {
-        assert rootOid != null;
-        return createAdapter(pojo, rootOid);
-    }
-
-    private ObjectAdapter createCollectionAdapter(
-            final Object pojo,
-            ParentedCollectionOid collectionOid) {
-        assert collectionOid != null;
-        return createAdapter(pojo, collectionOid);
-    }
-
-    private PojoAdapter createAdapter(
-            final Object pojo,
-            final Oid oid) {
-        return new PojoAdapter(
-                pojo, oid,
-                authenticationSession,
-                specificationLoader, this);
-    }
-
-
-    private ObjectAdapter mapAndInjectServices(final ObjectAdapter adapter) {
-        // since the whole point of this method is to map an adapter that's just been created.
-        // so we *don't* call ensureMapsConsistent(adapter);
-
-        Assert.assertNotNull(adapter);
-        final Object pojo = adapter.getObject();
-        Assert.assertFalse("POJO Map already contains object", pojo, pojoAdapterMap.containsPojo(pojo));
-
-        if (LOG.isDebugEnabled()) {
-            // don't interact with the underlying object because may be a ghost
-            // and would trigger a resolve
-            // don't call toString() on adapter because calls hashCode on
-            // underlying object, may also trigger a resolve.
-            LOG.debug("adding identity for adapter with oid={}", adapter.getOid());
-        }
-
-        // value adapters are not mapped (but all others - root and aggregated adapters - are)
-        if (adapter.isValue()) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("not mapping value adapter");
-            }
-            servicesInjector.injectServicesInto(pojo);
-            return adapter;
-        }
-
-        // add all aggregated collections
-        final ObjectSpecification objSpec = adapter.getSpecification();
-        if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
-            pojoAdapterMap.add(pojo, adapter);
-        }
-
-        // order is important - add to pojo map first, then identity map
-        oidAdapterMap.add(adapter.getOid(), adapter);
-
-        // must inject after mapping, otherwise infinite loop
-        servicesInjector.injectServicesInto(pojo);
-
-        return adapter;
-    }
-
-
-    
-
-
-    // -- TransactionManager delegate methods
-    protected IsisTransaction getCurrentTransaction() {
-        return transactionManager.getCurrentTransaction();
-    }
-    
-
-    // -- FrameworkSynchronizer delegate methods
-
-    public void enlistDeletingAndInvokeIsisRemovingCallbackFacet(final Persistable pojo) {
-        ObjectAdapter adapter = adapterFor(pojo);
-
-        changedObjectsServiceInternal.enlistDeleting(adapter);
-
-        CallbackFacet.Util.callCallback(adapter, RemovingCallbackFacet.class);
-        postLifecycleEventIfRequired(adapter, RemovingLifecycleEventFacet.class);
-    }
-
-
-    public void initializeMapAndCheckConcurrency(final Persistable pojo) {
-        final Persistable pc = pojo;
-
-        // need to do eagerly, because (if a viewModel then) a
-        // viewModel's #viewModelMemento might need to use services
-        servicesInjector.injectInto(pojo);
-
-        final Version datastoreVersion = getVersionIfAny(pc);
-
-        final RootOid originalOid;
-        ObjectAdapter adapter = getAdapterFor(pojo);
-        if (adapter != null) {
-            ensureRootObject(pojo);
-            originalOid = (RootOid) adapter.getOid();
-
-            final Version originalVersion = adapter.getVersion();
-
-            // sync the pojo held by the adapter with that just loaded
-            remapRecreatedPojo(adapter, pojo);
-
-            // since there was already an adapter, do concurrency check
-            // (but don't set abort cause if checking is suppressed through thread-local)
-            final RootOid thisOid = originalOid;
-            final Version thisVersion = originalVersion;
-            final Version otherVersion = datastoreVersion;
-
-            if (    thisVersion != null &&
-                    otherVersion != null &&
-                    thisVersion.different(otherVersion)) {
-
-                if (ConcurrencyChecking.isCurrentlyEnabled()) {
-                    LOG.info("concurrency conflict detected on {} ({})", thisOid, otherVersion);
-                    final String currentUser = authenticationSession.getUserName();
-                    final ConcurrencyException abortCause = new ConcurrencyException(currentUser, thisOid,
-                            thisVersion, otherVersion);
-                    getCurrentTransaction().setAbortCause(abortCause);
-
-                } else {
-                    LOG.info("concurrency conflict detected but suppressed, on {} ({})", thisOid, otherVersion);
-                }
-            }
-        } else {
-            originalOid = createPersistentOrViewModelOid(pojo);
-
-            // it appears to be possible that there is already an adapter for this Oid,
-            // ie from ObjectStore#resolveImmediately()
-            adapter = getAdapterFor(originalOid);
-            if (adapter != null) {
-                remapRecreatedPojo(adapter, pojo);
-            } else {
-                adapter = mapRecreatedPojo(originalOid, pojo);
-
-                CallbackFacet.Util.callCallback(adapter, LoadedCallbackFacet.class);
-                postLifecycleEventIfRequired(adapter, LoadedLifecycleEventFacet.class);
-            }
-        }
-
-        adapter.setVersion(datastoreVersion);
-    }
-
-    // -- create...Oid (main API)
-    /**
-     * Create a new {@link Oid#isTransient() transient} {@link Oid} for the
-     * supplied pojo, uniquely distinguishable from any other {@link Oid}.
-     */
-    public final RootOid createTransientOrViewModelOid(final Object pojo) {
-        return newIdentifier(pojo, Type.TRANSIENT);
-    }
-
-    /**
-     * Return an equivalent {@link RootOid}, but being persistent.
-     *
-     * <p>
-     * It is the responsibility of the implementation to determine the new unique identifier.
-     * For example, the generator may simply assign a new value from a sequence, or a GUID;
-     * or, the generator may use the oid to look up the object and inspect the object in order
-     * to obtain an application-defined value.
-     *
-     * @param pojo - being persisted
-     */
-    public final RootOid createPersistentOrViewModelOid(Object pojo) {
-        return newIdentifier(pojo, Type.PERSISTENT);
-    }
-
-    enum Type {
-        TRANSIENT,
-        PERSISTENT
-    }
-
-    private RootOid newIdentifier(final Object pojo, final Type type) {
-        final ObjectSpecification spec = objectSpecFor(pojo);
-        if(spec.isService()) {
-            return newRootId(spec, SERVICE_IDENTIFIER, type);
-        }
-
-        final ViewModelFacet recreatableObjectFacet = spec.getFacet(ViewModelFacet.class);
-        final String identifier =
-                recreatableObjectFacet != null
-                        ? recreatableObjectFacet.memento(pojo)
-                        : newIdentifierFor(pojo, type);
-
-        return newRootId(spec, identifier, type);
-    }
-
-    private String newIdentifierFor(final Object pojo, final Type type) {
-        return type == Type.TRANSIENT
-                ? UUID.randomUUID().toString()
-                : JdoObjectIdSerializer.toOidIdentifier(getPersistenceManager().getObjectId(pojo));
-    }
-
-    private RootOid newRootId(final ObjectSpecification spec, final String identifier, final Type type) {
-        final Oid.State state =
-                spec.containsDoOpFacet(ViewModelFacet.class)
-                        ? Oid.State.VIEWMODEL
-                        : type == Type.TRANSIENT
-                        ? Oid.State.TRANSIENT
-                        : Oid.State.PERSISTENT;
-        final ObjectSpecId objectSpecId = spec.getSpecId();
-        return new RootOid(objectSpecId, identifier, state);
-    }
-
-    private ObjectSpecification objectSpecFor(final Object pojo) {
-        final Class<?> pojoClass = pojo.getClass();
-        return getSpecificationLoader().loadSpecification(pojoClass);
-    }
-    
-
-
-    /**
-     * Called either when an entity is initially persisted, or when an entity is updated; fires the appropriate
-     * lifecycle callback.
-     *
-     * <p>
-     * The implementation therefore uses Isis' {@link org.apache.isis.core.metamodel.adapter.oid.Oid#isTransient() oid}
-     * to determine which callback to fire.
-     */
-    public void invokeIsisPersistingCallback(final Persistable pojo) {
-        final ObjectAdapter adapter = getAdapterFor(pojo);
-        if (adapter == null) {
-            // not expected.
-            return;
-        }
-
-        final RootOid isisOid = (RootOid) adapter.getOid();
-        if (isisOid.isTransient()) {
-            // persisting
-            // previously this was performed in the DataNucleusSimplePersistAlgorithm.
-            CallbackFacet.Util.callCallback(adapter, PersistingCallbackFacet.class);
-            postLifecycleEventIfRequired(adapter, PersistingLifecycleEventFacet.class);
-
-        } else {
-            // updating
-
-            // don't call here, already called in preDirty.
-
-            // CallbackFacet.Util.callCallback(adapter, UpdatingCallbackFacet.class);
-        }
-    }
-
-    /**
-     * Called either when an entity is initially persisted, or when an entity is updated;
-     * fires the appropriate lifecycle callback
-     *
-     * <p>
-     * The implementation therefore uses Isis' {@link org.apache.isis.core.metamodel.adapter.oid.Oid#isTransient() oid}
-     * to determine which callback to fire.
-     */
-    public void enlistCreatedAndRemapIfRequiredThenInvokeIsisInvokePersistingOrUpdatedCallback(final Persistable pojo) {
-        final ObjectAdapter adapter = adapterFor(pojo);
-
-        final RootOid rootOid = (RootOid) adapter.getOid(); // ok since this is for a Persistable
-
-        if (rootOid.isTransient()) {
-            // persisting
-            final RootOid persistentOid = createPersistentOrViewModelOid(pojo);
-
-            remapAsPersistent(adapter, persistentOid);
-
-            CallbackFacet.Util.callCallback(adapter, PersistedCallbackFacet.class);
-            postLifecycleEventIfRequired(adapter, PersistedLifecycleEventFacet.class);
-
-            changedObjectsServiceInternal.enlistCreated(adapter);
-
-        } else {
-            // updating;
-            // the callback and transaction.enlist are done in the preDirty callback
-            // (can't be done here, as the enlist requires to capture the 'before' values)
-            CallbackFacet.Util.callCallback(adapter, UpdatedCallbackFacet.class);
-            postLifecycleEventIfRequired(adapter, UpdatedLifecycleEventFacet.class);
-        }
-
-        Version versionIfAny = getVersionIfAny(pojo);
-        adapter.setVersion(versionIfAny);
-    }
-
-    public void enlistUpdatingAndInvokeIsisUpdatingCallback(final Persistable pojo) {
-        ObjectAdapter adapter = getAdapterFor(pojo);
-        if (adapter == null) {
-            // seen this happen in the case when a parent entity (LeaseItem) has a collection of children
-            // objects (LeaseTerm) for which we haven't had a loaded callback fired and so are not yet
-            // mapped.
-
-            // it seems reasonable in this case to simply map into Isis here ("just-in-time"); presumably
-            // DN would not be calling this callback if the pojo was not persistent.
-
-            adapter = mapPersistent(pojo);
-            if (adapter == null) {
-                throw new RuntimeException(
-                        "DN could not find objectId for pojo (unexpected) and so could not map into Isis; pojo=["
-                                + pojo + "]");
-            }
-        }
-        if (adapter.isTransient()) {
-            // seen this happen in the case when there's a 1<->m bidirectional collection, and we're
-            // attaching the child object, which is being persisted by DN as a result of persistence-by-reachability,
-            // and it "helpfully" sets up the parent attribute on the child, causing this callback to fire.
-            //
-            // however, at the same time, Isis has only queued up a CreateObjectCommand for the transient object, but it
-            // hasn't yet executed, so thinks that the adapter is still transient.
-            return;
-        }
-
-        final boolean wasAlreadyEnlisted = changedObjectsServiceInternal.isEnlisted(adapter);
-
-        // we call this come what may;
-        // additional properties may now have been changed, and the changeKind for publishing might also be modified
-        changedObjectsServiceInternal.enlistUpdating(adapter);
-
-        if(!wasAlreadyEnlisted) {
-            // prevent an infinite loop... don't call the 'updating()' callback on this object if we have already done so
-            CallbackFacet.Util.callCallback(adapter, UpdatingCallbackFacet.class);
-            postLifecycleEventIfRequired(adapter, UpdatingLifecycleEventFacet.class);
-        }
-
-        ensureRootObject(pojo);
-    }
-
-    /**
-     * makes sure the entity is known to Isis and is a root
-     * @param pojo
-     */
-    public void ensureRootObject(final Persistable pojo) {
-        final Oid oid = adapterFor(pojo).getOid();
-        if (!(oid instanceof RootOid)) {
-            throw new IsisException(MessageFormat.format("Not a RootOid: oid={0}, for {1}", oid, pojo));
-        }
-    }
-
-    private Version getVersionIfAny(final Persistable pojo) {
-        return Utils.getVersionIfAny(pojo, authenticationSession);
-    }
-
-
-    
-
-    // -- DomainObjectServices impl
-
-
-    public Object lookup(
-            final Bookmark bookmark,
-            final BookmarkService.FieldResetPolicy fieldResetPolicy) {
-        RootOid oid = RootOid.create(bookmark);
-        final ObjectAdapter adapter = adapterFor(oid);
-        if(adapter == null) {
-            return null;
-        }
-        if(fieldResetPolicy == BookmarkService.FieldResetPolicy.RESET && !adapter.getSpecification().isViewModel()) {
-            refreshRootInTransaction(adapter);
-        } else {
-            loadObjectInTransaction(oid);
-        }
-        return adapter.getObject();
-    }
-
-    public boolean flush() {
-        return getTransactionManager().flushTransaction();
-    }
-
-
-    
-
-    // -- helpers: lookupService, lookupServices
-
-    private <T> T lookupService(Class<T> serviceType) {
-        T service = lookupServiceIfAny(serviceType);
-        if(service == null) {
-            throw new IllegalStateException("Could not locate service of type '" + serviceType + "'");
-        }
-        return service;
-    }
-
-    private <T> T lookupServiceIfAny(final Class<T> serviceType) {
-        return servicesInjector.lookupService(serviceType);
-    }
-
-    private <T> List<T> lookupServices(final Class<T> serviceClass) {
-        return servicesInjector.lookupServices(serviceClass);
-    }
-    
-
-    // -- toString
-
-    @Override
-    public String toString() {
-        return new ToString(this).toString();
-    }
-
-
-    
+	IsisConfiguration getConfiguration();
 
+	PersistenceManager getPersistenceManager();
 
+	void refreshRoot(ObjectAdapter adapter);
 
 }
-
-
-
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
index ad72168..7e78f39 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
@@ -1,201 +1,26 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
 package org.apache.isis.core.runtime.system.persistence;
 
-import java.util.Map;
-import java.util.Set;
-
-import javax.jdo.PersistenceManagerFactory;
-
-import org.datanucleus.PropertyNames;
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.config.IsisConfigurationDefault;
+import org.apache.isis.core.metamodel.IsisJdoRuntimePlugin;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
-import org.apache.isis.objectstore.jdo.datanucleus.JDOStateManagerForIsis;
-import org.apache.isis.objectstore.jdo.service.RegisterEntities;
-
-/**
- *
- * Factory for {@link PersistenceSession}.
- *
- * <p>
- * Implementing class is added to {@link ServicesInjector} as an (internal) domain service; all public methods
- * must be annotated using {@link Programmatic}.
- * </p>
- */
-public class PersistenceSessionFactory implements ApplicationScopedComponent, FixturesInstalledFlag {
-
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSessionFactory.class);
-
-    private final IsisConfigurationDefault configuration;
-
-    public PersistenceSessionFactory(final IsisConfigurationDefault isisConfiguration) {
-        this.configuration = isisConfiguration;
-    }
-
-    public static final String JDO_OBJECTSTORE_CONFIG_PREFIX = "isis.persistor.datanucleus";  // specific to the JDO objectstore
-    public static final String DATANUCLEUS_CONFIG_PREFIX = "isis.persistor.datanucleus.impl"; // reserved for datanucleus' own config props
-
-
-    private DataNucleusApplicationComponents applicationComponents;
-
-    @Programmatic
-    public void init(final SpecificationLoader specificationLoader) {
-        this.applicationComponents = createDataNucleusApplicationComponents(configuration, specificationLoader);
-    }
-
-    @Programmatic
-    public boolean isInitialized() {
-        return this.applicationComponents != null;
-    }
-
-    private DataNucleusApplicationComponents createDataNucleusApplicationComponents(
-            final IsisConfiguration configuration, final SpecificationLoader specificationLoader) {
-
-        if (applicationComponents == null || applicationComponents.isStale()) {
-
-            final IsisConfiguration jdoObjectstoreConfig = configuration.createSubset(
-                    JDO_OBJECTSTORE_CONFIG_PREFIX);
-
-            final IsisConfiguration dataNucleusConfig = configuration.createSubset(DATANUCLEUS_CONFIG_PREFIX);
-            final Map<String, String> datanucleusProps = dataNucleusConfig.asMap();
-            addDataNucleusPropertiesIfRequired(datanucleusProps);
-
-            final RegisterEntities registerEntities = new RegisterEntities(specificationLoader);
-            final Set<String> classesToBePersisted = registerEntities.getEntityTypes();
-
-            applicationComponents = new DataNucleusApplicationComponents(jdoObjectstoreConfig, specificationLoader,
-                    datanucleusProps, classesToBePersisted);
-        }
-
-        return applicationComponents;
-    }
-
-    private static void addDataNucleusPropertiesIfRequired(
-            final Map<String, String> props) {
-
-        // new feature in DN 3.2.3; enables dependency injection into entities
-        putIfNotPresent(props, PropertyNames.PROPERTY_OBJECT_PROVIDER_CLASS_NAME, JDOStateManagerForIsis.class.getName());
-
-        putIfNotPresent(props, "javax.jdo.PersistenceManagerFactoryClass", JDOPersistenceManagerFactory.class.getName());
-
-        // previously we defaulted this property to "true", but that could cause the target database to be modified
-        putIfNotPresent(props, PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_SCHEMA, Boolean.FALSE.toString());
-
-        putIfNotPresent(props, PropertyNames.PROPERTY_SCHEMA_VALIDATE_ALL, Boolean.TRUE.toString());
-        putIfNotPresent(props, PropertyNames.PROPERTY_CACHE_L2_TYPE, "none");
-
-        putIfNotPresent(props, PropertyNames.PROPERTY_PERSISTENCE_UNIT_LOAD_CLASSES, Boolean.TRUE.toString());
-
-        String connectionFactoryName = props.get(PropertyNames.PROPERTY_CONNECTION_FACTORY_NAME);
-        if(connectionFactoryName != null) {
-            String connectionFactory2Name = props.get(PropertyNames.PROPERTY_CONNECTION_FACTORY2_NAME);
-            String transactionType = props.get("javax.jdo.option.TransactionType");
-            // extended logging
-            if(transactionType == null) {
-                LOG.info("found config properties to use non-JTA JNDI datasource ({})", connectionFactoryName);
-                if(connectionFactory2Name != null) {
-                    LOG.warn("found config properties to use non-JTA JNDI datasource ({}); second '-nontx' JNDI datasource also configured but will not be used ({})", connectionFactoryName, connectionFactory2Name);
-                }
-            } else {
-                LOG.info("found config properties to use JTA JNDI datasource ({})", connectionFactoryName);
-            }
-            if(connectionFactory2Name == null) {
-                // JDO/DN itself will (probably) throw an exception
-                LOG.error("found config properties to use JTA JNDI datasource ({}) but config properties for second '-nontx' JNDI datasource were *not* found", connectionFactoryName);
-            } else {
-                LOG.info("... and config properties for second '-nontx' JNDI datasource also found; {}", connectionFactory2Name);
-            }
-            // nothing further to do
-            return;
-        } else {
-            // use JDBC connection properties; put if not present
-            LOG.info("did *not* find config properties to use JNDI datasource; will use JDBC");
-
-            putIfNotPresent(props, "javax.jdo.option.ConnectionDriverName", "org.hsqldb.jdbcDriver");
-            putIfNotPresent(props, "javax.jdo.option.ConnectionURL", "jdbc:hsqldb:mem:test");
-            putIfNotPresent(props, "javax.jdo.option.ConnectionUserName", "sa");
-            putIfNotPresent(props, "javax.jdo.option.ConnectionPassword", "");
-        }
-    }
-
-    private static void putIfNotPresent(
-            final Map<String, String> props,
-            String key,
-            String value) {
-        if(!props.containsKey(key)) {
-            props.put(key, value);
-        }
-    }
-
-    @Programmatic
-    public final void shutdown() {
-        if(!isInitialized()) {
-            return;
-        }
-    	if(applicationComponents != null) {
-    		applicationComponents.shutdown();
-            applicationComponents = null;
-    	}
-    }
-
-    /**
-     * Called by {@link org.apache.isis.core.runtime.system.session.IsisSessionFactory#openSession(AuthenticationSession)}.
-     */
-    @Programmatic
-    public PersistenceSession createPersistenceSession(
-            final ServicesInjector servicesInjector,
-            final AuthenticationSession authenticationSession) {
-
-        final FixturesInstalledFlag fixturesInstalledFlag = this;
-        final PersistenceManagerFactory persistenceManagerFactory =
-                applicationComponents.getPersistenceManagerFactory();
 
-        return new PersistenceSession(
-                servicesInjector,
-                authenticationSession, persistenceManagerFactory,
-                fixturesInstalledFlag);
-    }
+public interface PersistenceSessionFactory {
 
-    private Boolean fixturesInstalled;
+	// -- INTERFACE
 
-    @Programmatic
-    @Override
-    public Boolean isFixturesInstalled() {
-        return fixturesInstalled;
-    }
+	PersistenceSession createPersistenceSession(ServicesInjector servicesInjector,
+			AuthenticationSession authenticationSession);
 
-    @Programmatic
-    @Override
-    public void setFixturesInstalled(final Boolean fixturesInstalled) {
-        this.fixturesInstalled = fixturesInstalled;
-    }
+	void init(SpecificationLoader specificationLoader);
+	
+	void shutdown();
+	
+	// -- FACTORY
 
+	static PersistenceSessionFactory of(ConfigurationServiceInternal configuration) {
+		return IsisJdoRuntimePlugin.get().getPersistenceSessionFactory(configuration);
+	}
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
index 983a84e..2663f3a 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
@@ -155,7 +155,7 @@ public class IsisSessionFactoryBuilder {
             servicesInjector.addFallbackIfRequired(SpecificationLoader.class, specificationLoader);
 
             // persistenceSessionFactory
-            final PersistenceSessionFactory persistenceSessionFactory = new PersistenceSessionFactory(configuration);
+            final PersistenceSessionFactory persistenceSessionFactory = PersistenceSessionFactory.of(configuration);
             servicesInjector.addFallbackIfRequired(PersistenceSessionFactory.class, persistenceSessionFactory);
 
 
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPropertiesAware.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPropertiesAware.java
index 4aa9c2f..58cf28d 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPropertiesAware.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPropertiesAware.java
@@ -19,7 +19,6 @@
 package org.apache.isis.objectstore.jdo.datanucleus;
 
 import java.util.Map;
-import java.util.Properties;
 
 public interface DataNucleusPropertiesAware {
 
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/TimestampService.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/TimestampService.java
index 6f2b637..615a36a 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/TimestampService.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/TimestampService.java
@@ -25,10 +25,11 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport0;
 import org.apache.isis.applib.services.timestamp.HoldsUpdatedAt;
 import org.apache.isis.applib.services.timestamp.HoldsUpdatedBy;
 import org.apache.isis.applib.services.user.UserService;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 
 @RequestScoped
 @DomainService(
@@ -40,7 +41,7 @@ public class TimestampService implements
 
     @PostConstruct
     public void open() {
-        isisJdoSupport.getJdoPersistenceManager().addInstanceLifecycleListener(this, null);
+        isisJdoSupport.getJdoPersistenceManager().addInstanceLifecycleListener(this, new Class[] {null});
     }
 
     @PreDestroy
@@ -53,7 +54,7 @@ public class TimestampService implements
 
         final Object pi = event.getPersistentInstance();
 
-        if(pi instanceof org.datanucleus.enhancement.Persistable) {
+        if(pi!=null && JdoMetamodelUtil.isPersistenceEnhanced(pi.getClass())) {
 
             if(pi instanceof HoldsUpdatedBy) {
                 ((HoldsUpdatedBy)pi).setUpdatedBy(userService.getUser().getName());
@@ -76,5 +77,5 @@ public class TimestampService implements
     ClockService clockService;
 
     @javax.inject.Inject
-    IsisJdoSupport isisJdoSupport;
+    IsisJdoSupport0 isisJdoSupport;
 }
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
index d1fafc5..3b4cca8 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
@@ -31,6 +31,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.AppManifest;
+import org.apache.isis.core.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class RegisterEntities {
@@ -70,7 +71,7 @@ public class RegisterEntities {
             if(ignore(persistenceCapableType)) {
                 continue;
             }
-            if(!org.datanucleus.enhancement.Persistable.class.isAssignableFrom(persistenceCapableType)) {
+            if(!JdoMetamodelUtil.isPersistenceEnhanced(persistenceCapableType)) {
                 classNamesNotEnhanced.add(persistenceCapableType.getCanonicalName());
             }
             this.entityTypes.add(persistenceCapableType.getCanonicalName());
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java b/core/runtime/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java
similarity index 100%
rename from core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java
rename to core/runtime/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java
diff --git a/core/unittestsupport/pom.xml b/core/unittestsupport/pom.xml
index bdc03c0..5695eb7 100644
--- a/core/unittestsupport/pom.xml
+++ b/core/unittestsupport/pom.xml
@@ -60,11 +60,12 @@
                <artifactId>jmock-junit4</artifactId>
            </dependency>
 
-            <dependency>
-                <groupId>javax.jdo</groupId>
-                <artifactId>jdo-api</artifactId>
-                <optional>true</optional>
-            </dependency>
+			<!-- JDO API -->
+			<dependency>
+	            <groupId>javax.jdo</groupId>
+	            <artifactId>jdo-api</artifactId>
+	            <scope>test</scope>
+        	</dependency>
 
             <dependency>
                 <groupId>org.javassist</groupId>

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.