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/09/04 08:27:21 UTC

[isis] branch ISIS-1976-rethink-object-adapters updated (9f86814 -> 074cecf)

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

ahuber pushed a change to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 9f86814  ISIS-1976: further decouple factets
     new 3a089d1  ISIS-1976: remove unused spec-loader from some facet constructors
     new e54f79b  ISIS-1976: further decouple from AdapterManager
     new 9e5ac83  ISIS-1976: let PersistenceSession no longer implement AdapterManager
     new 507f74d  ISIS-1976: decouple implementations of PersistenceSession and ObjcetAdapterProvider from each other
     new c37cde6  ISIS-1976: move responsibility for pre-loading service adapters from PersistenceSession to ObjectAdapterContext
     new d95d064  ISIS-1976: PersistentSession: remove virtually unreachable code
     new 074cecf  ISIS-1976: moving responsibilities from PersistenceSession to ObjectAdapterProvider

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../isis/core/metamodel/adapter/ObjectAdapter.java |   3 +-
 .../metamodel/adapter/ObjectAdapterProvider.java   |  44 ++
 .../adapter/concurrency/ConcurrencyChecking.java   | 104 ++++
 .../core/metamodel/adapter/mgr/AdapterManager.java | 167 ------
 .../actions/action/invocation/CommandUtil.java     |   6 +-
 .../DomainObjectAnnotationFacetFactory.java        |   1 -
 ...atableObjectFacetForDomainObjectAnnotation.java |   9 +-
 ...ObjectFacetDeclarativeInitializingAbstract.java |   4 -
 .../recreatable/RecreatableObjectFacetFactory.java |   2 +-
 ...eObjectFacetForRecreatableObjectAnnotation.java |   8 +-
 ...creatableObjectFacetForViewModelAnnotation.java |   4 +-
 .../choices/ActionParameterChoicesFacetNone.java   |   6 +-
 .../PersistenceSessionServiceInternal.java         |  37 +-
 .../collections/JavaCollectionFacetTest.java       |   6 +-
 .../TitleFacetViaTitleAnnotationTest.java          |  10 +-
 .../services/jdosupport/IsisJdoSupportDN4.java     |   2 +-
 .../system/persistence/IsisLifecycleListener.java  |   5 +-
 .../system/persistence/PersistenceSession4.java    | 569 ++------------------
 .../persistence/PersistenceSession4_Decouple.java  | 213 ++++++++
 .../queries/PersistenceQueryProcessorAbstract.java |   3 +-
 .../WrapperFactoryDefaultTest_wrappedObject.java   |   8 +-
 ...FactoryDefaultTest_wrappedObject_transient.java |   8 +-
 .../services/jdosupport/IsisJdoSupportDN5.java     |   2 +-
 .../system/persistence/IsisLifecycleListener.java  |   5 +-
 .../system/persistence/PersistenceSession5.java    | 578 ++-------------------
 .../persistence/PersistenceSession5_Decouple.java  | 213 ++++++++
 .../queries/PersistenceQueryProcessorAbstract.java |   3 +-
 .../WrapperFactoryDefaultTest_wrappedObject.java   |  16 +-
 ...FactoryDefaultTest_wrappedObject_transient.java |  14 +-
 .../apache/isis/core/runtime/memento/Memento.java  |   3 +-
 .../runtime/persistence/adapter/PojoAdapter.java   |   4 +-
 .../background/BackgroundServiceDefault.java       |  11 +-
 .../background/CommandInvocationHandler.java       |  20 +-
 .../changes/ChangedObjectsServiceInternal.java     |   4 +-
 .../command/CommandDtoServiceInternalDefault.java  |   4 +-
 .../persistence/PersistenceQueryFactory.java       |  16 +-
 .../system/persistence/PersistenceSession.java     |  47 +-
 .../system/persistence/PersistenceSessionBase.java |  34 +-
 .../adaptermanager/ObjectAdapterContext.java       | 108 +++-
 .../ObjectAdapterContext_AdapterManager.java       | 189 +++++++
 .../ObjectAdapterContext_Consistency.java          | 119 +++++
 .../ObjectAdapterContext_MementoSupport.java       | 246 +++++++++
 ...ObjectAdapterContext_ObjectAdapterProvider.java | 175 +++++++
 .../adaptermanager/ObjectAdapterLegacy.java        | 212 --------
 .../adaptermanager/RootAndCollectionAdapters.java  |  11 +-
 .../system/ObjectActionLayoutXmlDefaultTest.java   |  15 +-
 .../restfulobjects/rendering/RendererContext.java  |   7 -
 .../rendering/domainobjects/JsonValueEncoder.java  |  10 +-
 .../JsonValueEncoderTest_appendValueAndFormat.java |  12 +-
 .../JsonValueEncoderTest_asAdapter.java            |  14 +-
 .../JsonValueEncoderTest_asObject.java             |  12 +-
 .../restfulobjects/server/ResourceContext.java     |  10 -
 .../server/resources/DomainResourceHelper.java     |   6 -
 .../wicket/ConverterForObjectAdapter.java          |   8 +-
 .../wicket/ConverterForObjectAdapterMemento.java   |  10 +-
 .../integration/wicket/WebRequestCycleForIsis.java |   6 +-
 .../wicket/model/mementos/ActionMemento.java       |   2 +-
 .../model/mementos/ObjectAdapterMemento.java       | 112 +---
 .../viewer/wicket/model/models/ActionModel.java    |   2 +-
 .../wicket/model/models/EntityCollectionModel.java |   2 +-
 .../viewer/wicket/model/models/EntityModel.java    |   2 +-
 .../viewer/wicket/model/models/ScalarModel.java    |   2 +-
 .../model/models/ScalarModelWithPending.java       |   2 +-
 .../viewer/wicket/model/models/ValueModel.java     |   2 +-
 .../actionresponse/ActionResultResponseType.java   |   4 +-
 .../entityactions/EntityActionLinkFactory.java     |   2 +-
 .../actionmenu/entityactions/LinkAndLabelUtil.java |   4 +-
 .../actionmenu/serviceactions/CssMenuItem.java     |   4 +-
 .../serviceactions/ServiceActionLinkFactory.java   |   2 +-
 .../collection/AssociatedWithActionsHelper.java    |   4 +-
 .../ui/components/collection/CollectionPanel.java  |   4 +-
 .../collection/bulk/BulkActionsLinkFactory.java    |   2 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   2 +-
 .../columns/ObjectAdapterToggleboxColumn.java      |   2 +-
 .../entity/EntityComponentFactoryAbstract.java     |   2 +-
 .../components/entity/fieldset/PropertyGroup.java  |   6 +-
 .../entity/icontitle/EntityIconAndTitlePanel.java  |   2 +-
 .../property/PropertyFormExecutorStrategy.java     |   4 +-
 .../PropertyEditPromptHeaderPanel.java             |   4 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |   6 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   4 +-
 .../scalars/ScalarPanelSelect2Abstract.java        |   4 +-
 .../scalars/ScalarPanelTextFieldAbstract.java      |   4 +-
 .../ui/components/scalars/TextFieldValueModel.java |   6 +-
 .../scalars/reference/ReferencePanel.java          |   2 +-
 .../widgets/breadcrumbs/BreadcrumbPanel.java       |   4 +-
 .../entitysimplelink/EntityLinkSimplePanel.java    |   4 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |   8 +-
 .../ObjectAdapterMementoProviderAbstract.java      |   2 +-
 .../isis/viewer/wicket/ui/panels/FormAbstract.java |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   4 +-
 91 files changed, 1718 insertions(+), 1869 deletions(-)
 create mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/concurrency/ConcurrencyChecking.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
 create mode 100644 core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4_Decouple.java
 create mode 100644 core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_Decouple.java
 create mode 100644 core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_AdapterManager.java
 create mode 100644 core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Consistency.java
 create mode 100644 core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
 create mode 100644 core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java


[isis] 06/07: ISIS-1976: PersistentSession: remove virtually unreachable code

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit d95d064d376b746dc69d7565e590474b4c5e0e32
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 4 08:29:12 2018 +0200

    ISIS-1976: PersistentSession: remove virtually unreachable code
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../system/persistence/PersistenceSession5.java       | 19 ++-----------------
 1 file changed, 2 insertions(+), 17 deletions(-)

diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index 2d0f87c..f10fb70 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -923,7 +923,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                 makePersistentTransactionAssumed(adapter);
 
                 // clear out the map of transient -> persistent
-                PersistenceSession5.this.persistentByTransient.clear();
+                // already empty // PersistenceSession5.this.persistentByTransient.clear();
             }
 
         });
@@ -1050,30 +1050,15 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         persistenceManager.flush();
     }
 
-
-    // -- getAggregateRoot, remappedFrom
-
-    private Map<Oid, Oid> persistentByTransient = _Maps.newHashMap();
+    // -- getAggregateRoot
 
     @Override
     public ObjectAdapter getAggregateRoot(final ParentedCollectionOid collectionOid) {
         final Oid rootOid = collectionOid.getRootOid();
         ObjectAdapter rootadapter = objectAdapterContext.lookupAdapterFor(rootOid);
-        if(rootadapter == null) {
-            final Oid parentOidNowPersisted = remappedFrom(rootOid);
-            rootadapter = objectAdapterContext.lookupAdapterFor(parentOidNowPersisted);
-        }
         return rootadapter;
     }
 
-    /**
-     * 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);
-    }
-
     // -- AdapterManager implementation
 
     @Override


[isis] 04/07: ISIS-1976: decouple implementations of PersistenceSession and ObjcetAdapterProvider from each other

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 507f74db09959fd17b1894a6c67ba720f67b9bda
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 4 08:04:49 2018 +0200

    ISIS-1976: decouple implementations of PersistenceSession and
    ObjcetAdapterProvider from each other
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../system/persistence/PersistenceSession5.java    | 30 +++++-----
 .../persistence/PersistenceQueryFactory.java       | 11 ++--
 .../system/persistence/PersistenceSession.java     |  6 +-
 .../system/persistence/PersistenceSessionBase.java |  6 +-
 .../adaptermanager/ObjectAdapterContext.java       | 13 +++++
 ...bjectAdapterContext_ObjectAdapterProvider.java} | 66 ++++++++++++++--------
 6 files changed, 81 insertions(+), 51 deletions(-)

diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index 9910f32..05ff2b7 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -131,7 +131,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5.class);
     private ObjectAdapterContext objectAdapterContext;
-    private PersistenceSession5_ObjectAdapterProvider objectAdapterProviderMixin;
 
     /**
      * Initialize the object store so that calls to this object store access
@@ -161,8 +160,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         }
 
         objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
-        objectAdapterProviderMixin = new PersistenceSession5_ObjectAdapterProvider(this, objectAdapterContext);
-        
+
         persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
 
         final IsisLifecycleListener.PersistenceSessionLifecycleManagement psLifecycleMgmt = this;
@@ -837,15 +835,15 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
 
     // -- lazilyLoaded
-
-    ObjectAdapter mapPersistent(final Persistable pojo) {
-        if (persistenceManager.getObjectId(pojo) == null) {
-            return null;
-        }
-        final RootOid oid = createPersistentOrViewModelOid(pojo);
-        final ObjectAdapter adapter = objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
-        return adapter;
-    }
+//
+//    private ObjectAdapter addPersistentToCache(final Persistable pojo) {
+//        if (persistenceManager.getObjectId(pojo) == null) {
+//            return null;
+//        }
+//        final RootOid oid = createPersistentOrViewModelOid(pojo);
+//        final ObjectAdapter adapter = objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
+//        return adapter;
+//    }
 
 
     // -- refreshRootInTransaction, refreshRoot, resolve
@@ -1421,7 +1419,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      * Create a new {@link Oid#isTransient() transient} {@link Oid} for the
      * supplied pojo, uniquely distinguishable from any other {@link Oid}.
      */
-    final RootOid createTransientOrViewModelOid(final Object pojo) {
+    @Override
+    public final RootOid createTransientOrViewModelOid(final Object pojo) {
         return newIdentifier(pojo, Type.TRANSIENT);
     }
 
@@ -1560,7 +1559,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             // 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);
+            adapter = objectAdapterContext.addPersistentToCache(pojo);
             if (adapter == null) {
                 throw new RuntimeException(
                         "DN could not find objectId for pojo (unexpected) and so could not map into Isis; pojo=["
@@ -1687,10 +1686,9 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     
     @Override
     public ObjectAdapterProvider getObjectAdapterProvider() {
-        return objectAdapterProviderMixin;
+        return objectAdapterContext.getObjectAdapterProvider();
     }
 
-
     
 }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
index 42a2494..5ef2f09 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
@@ -19,14 +19,17 @@
 package org.apache.isis.core.runtime.system.persistence;
 
 import java.util.Map;
+import java.util.function.Function;
+
 import com.google.common.collect.Maps;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.query.QueryFindAllInstances;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -38,10 +41,10 @@ public class PersistenceQueryFactory {
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFactory.class);
 
     private final SpecificationLoader specificationLoader;
-    private final ObjectAdapterProvider adapterProvider;
+    private final Function<Object, ObjectAdapter> adapterProvider;
 
     PersistenceQueryFactory(
-            final ObjectAdapterProvider adapterProvider,
+            final Function<Object, ObjectAdapter> adapterProvider,
             final SpecificationLoader specificationLoader) {
         this.specificationLoader = specificationLoader;
         this.adapterProvider = adapterProvider;
@@ -80,7 +83,7 @@ public class PersistenceQueryFactory {
         for (final Map.Entry<String, Object> entry : argumentsByParameterName.entrySet()) {
             final String parameterName = entry.getKey();
             final Object argument = argumentsByParameterName.get(parameterName);
-            final ObjectAdapter argumentAdapter = argument != null ? adapterProvider.adapterFor(argument) : null;
+            final ObjectAdapter argumentAdapter = argument != null ? adapterProvider.apply(argument) : null;
             argumentsAdaptersByParameterName.put(parameterName, argumentAdapter);
         }
         return argumentsAdaptersByParameterName;
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 aade4e5..8f53003 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
@@ -98,6 +98,7 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
 
     void close();
 
+    RootOid createTransientOrViewModelOid(Object pojo);
     RootOid createPersistentOrViewModelOid(Object pojo);
 
     ObjectAdapter createTransientInstance(ObjectSpecification spec);
@@ -121,7 +122,9 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
      * Convenient equivalent to {@code getPersistenceManager()}.
      * @return
      */
-    PersistenceManager pm();
+    default PersistenceManager pm() {
+        return getPersistenceManager();
+    }
 
     List<ObjectAdapter> getServices();
 
@@ -175,5 +178,6 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
     boolean isTransient(Object pojo);
     boolean isRepresentingPersistent(Object pojo);
     boolean isDestroyed(Object pojo);
+    
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
index f91f778..fc14368 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
@@ -132,7 +132,7 @@ abstract class PersistenceSessionBase implements PersistenceSession {
 
         // sub-components
         this.persistenceQueryFactory = new PersistenceQueryFactory(
-                this.getObjectAdapterProvider(), 
+                obj->this.getObjectAdapterProvider().adapterFor(obj), 
                 this.specificationLoader);
         this.transactionManager = new IsisTransactionManager(this, /*authenticationSession,*/ servicesInjector);
 
@@ -177,10 +177,6 @@ abstract class PersistenceSessionBase implements PersistenceSession {
         return persistenceManager;
     }
 
-    @Override
-    public PersistenceManager pm() {
-        return persistenceManager;
-    }
 
     @Override
     public IsisConfiguration getConfiguration() {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index 29855e3..f1dd2ad 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -27,6 +27,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.IsisAssertException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 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;
@@ -55,6 +56,7 @@ public class ObjectAdapterContext {
     private final ServicesInjector servicesInjector;
     private final SpecificationLoader specificationLoader;
     private final ObjectAdapterContext_Consistency consistencyMixin;
+    private final ObjectAdapterContext_ObjectAdapterProvider objectAdapterProviderMixin;
     private final ObjectAdapterContext_AdapterManager adapterManagerMixin;
     private final ObjectAdapterContext_MementoSupport mementoSupportMixin;
     
@@ -65,6 +67,7 @@ public class ObjectAdapterContext {
             PersistenceSession persistenceSession) {
         
         this.consistencyMixin = new ObjectAdapterContext_Consistency(this);
+        this.objectAdapterProviderMixin = new ObjectAdapterContext_ObjectAdapterProvider(this, persistenceSession);
         this.adapterManagerMixin = new ObjectAdapterContext_AdapterManager(this, persistenceSession);
         this.mementoSupportMixin = new ObjectAdapterContext_MementoSupport(this, persistenceSession);
         
@@ -226,6 +229,16 @@ public class ObjectAdapterContext {
         adapterManagerMixin.removeAdapterFromCache(adapter);
     }
     
+    // -- OBJECT ADAPTER PROVIDER SUPPORT
+    
+    public ObjectAdapter addPersistentToCache(final Object pojo) {
+        return objectAdapterProviderMixin.addPersistentToCache(pojo);
+    }
+    
+    public ObjectAdapterProvider getObjectAdapterProvider() {
+        return objectAdapterProviderMixin;
+    }
+    
     // -- MEMENTO SUPPORT
     
     public static interface MementoRecreateObjectSupport {
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_ObjectAdapterProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
similarity index 66%
rename from core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_ObjectAdapterProvider.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
index 5c8b85d..90351bb 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_ObjectAdapterProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -16,14 +16,14 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.runtime.system.persistence;
+package org.apache.isis.core.runtime.system.persistence.adaptermanager;
 
 import java.util.function.Function;
 
-import org.datanucleus.enhancement.Persistable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -31,25 +31,31 @@ import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
-public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterProvider {
-
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5_ObjectAdapterProvider.class);
-
-    protected final PersistenceSession5 holder;
-    protected final ObjectAdapterContext objectAdapterContext;
-
-    // -- open
-
-    PersistenceSession5_ObjectAdapterProvider(PersistenceSession5 holder, ObjectAdapterContext objectAdapterContext) {
-        this.holder = holder;
+/**
+ *  
+ * @since 2.0.0-M2
+ */
+class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvider {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_ObjectAdapterProvider.class);
+    private final ObjectAdapterContext objectAdapterContext;
+    private final PersistenceSession persistenceSession;
+    private final SpecificationLoader specificationLoader; 
+    private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin; 
+    
+    ObjectAdapterContext_ObjectAdapterProvider(ObjectAdapterContext objectAdapterContext,
+            PersistenceSession persistenceSession) {
         this.objectAdapterContext = objectAdapterContext;
+        this.persistenceSession = persistenceSession;
+        this.specificationLoader = persistenceSession.getServicesInjector().getSpecificationLoader();
+        this.isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
     }
 
     @Override
     public ObjectAdapter adapterFor(Object pojo) {
-        //return holder.getObjectAdapterProvider().adapterFor(pojo);
         
         if(pojo == null) {
             return null;
@@ -60,7 +66,7 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
         }
 
         // Creates a new transient root {@link ObjectAdapter adapter} for the supplied domain
-        final RootOid rootOid = holder.createTransientOrViewModelOid(pojo);
+        final RootOid rootOid = persistenceSession.createTransientOrViewModelOid(pojo);
         final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
 
         return objectAdapterContext.mapAndInjectServices(newAdapter);
@@ -68,7 +74,6 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
 
     @Override
     public ObjectAdapter adapterFor(Object pojo, ObjectAdapter parentAdapter, OneToManyAssociation collection) {
-        //return holder.getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
 
         assert parentAdapter != null;
         assert collection != null;
@@ -97,9 +102,18 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
         return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
     }
     
+    protected ObjectAdapter addPersistentToCache(final Object pojo) {
+        if (persistenceSession.getPersistenceManager().getObjectId(pojo) == null) {
+            return null;
+        }
+        final RootOid oid = persistenceSession.createPersistentOrViewModelOid(pojo);
+        final ObjectAdapter adapter = objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
+        return adapter;
+    }
+    
     // -- HELPER
     
-    protected ObjectAdapter existingOrValueAdapter(Object pojo) {
+    private ObjectAdapter existingOrValueAdapter(Object pojo) {
 
         // attempt to locate adapter for the pojo
         ObjectAdapter adapter = objectAdapterContext.lookupAdapterByPojo(pojo);
@@ -107,9 +121,12 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
             return adapter;
         }
 
+        // equivalent to  isInstanceOfPersistable = pojo instanceof Persistable;
+        final boolean isInstanceOfPersistable = isisJdoMetamodelPlugin.isPersistenceEnhanced(pojo.getClass());
+        
         // pojo may have been lazily loaded by object store, but we haven't yet seen it
-        if (pojo instanceof Persistable) {
-            adapter = holder.mapPersistent((Persistable) pojo);
+        if (isInstanceOfPersistable) {
+            adapter = addPersistentToCache(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?
@@ -122,7 +139,7 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
         }
         
         // need to create (and possibly map) the adapter.
-        final ObjectSpecification objSpec = holder.specificationLoader.loadSpecification(pojo.getClass());
+        final ObjectSpecification objSpec = specificationLoader.loadSpecification(pojo.getClass());
 
         // we create value facets as standalone (so not added to maps)
         if (objSpec.containsFacet(ValueFacet.class)) {
@@ -134,7 +151,6 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
     }
 
 
-}
-
-
-
+    
+   
+}
\ No newline at end of file


[isis] 02/07: ISIS-1976: further decouple from AdapterManager

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit e54f79bb89650c098eef25f0133884968737366b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 4 04:43:23 2018 +0200

    ISIS-1976: further decouple from AdapterManager
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../actions/action/invocation/CommandUtil.java     |   6 +-
 .../choices/ActionParameterChoicesFacetNone.java   |   6 +-
 .../collections/JavaCollectionFacetTest.java       |   6 +-
 .../TitleFacetViaTitleAnnotationTest.java          |  10 +-
 .../system/persistence/PersistenceSession5.java    |  14 +++
 .../WrapperFactoryDefaultTest_wrappedObject.java   |  16 +--
 ...FactoryDefaultTest_wrappedObject_transient.java |  14 +--
 .../background/BackgroundServiceDefault.java       |  11 ++-
 .../background/CommandInvocationHandler.java       |  20 ++--
 .../command/CommandDtoServiceInternalDefault.java  |   4 +-
 .../persistence/PersistenceQueryFactory.java       |  13 +--
 .../system/persistence/PersistenceSessionBase.java |  22 +----
 .../restfulobjects/rendering/RendererContext.java  |   7 --
 .../rendering/domainobjects/JsonValueEncoder.java  |  10 +-
 .../JsonValueEncoderTest_appendValueAndFormat.java |  12 +--
 .../JsonValueEncoderTest_asAdapter.java            |  14 +--
 .../JsonValueEncoderTest_asObject.java             |  12 +--
 .../restfulobjects/server/ResourceContext.java     |  10 --
 .../server/resources/DomainResourceHelper.java     |   6 --
 .../model/mementos/ObjectAdapterMemento.java       | 107 +--------------------
 .../ui/components/scalars/ScalarPanelAbstract.java |   4 +-
 .../scalars/ScalarPanelTextFieldAbstract.java      |   4 +-
 .../ui/components/scalars/TextFieldValueModel.java |   6 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |   2 +-
 24 files changed, 108 insertions(+), 228 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/CommandUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/CommandUtil.java
index 1452dcf..aea2939 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/CommandUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/CommandUtil.java
@@ -26,7 +26,7 @@ import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.core.commons.lang.StringExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -101,9 +101,9 @@ public class CommandUtil {
         buf.append(name).append(": ").append(titleOf).append("\n");
     }
 
-    public static ObjectAdapter[] adaptersFor(final Object[] args, final AdapterManager adapterManager) {
+    public static ObjectAdapter[] adaptersFor(final Object[] args, final ObjectAdapterProvider adapterProvider) {
         return _NullSafe.stream(args)
-                .map(ObjectAdapter.Functions.adapterForUsing(adapterManager))
+                .map(ObjectAdapter.Functions.adapterForUsing(adapterProvider))
                 .collect(_Arrays.toArray(ObjectAdapter.class, _NullSafe.size(args)));
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java
index b929a8e..ad6e053 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java
@@ -23,7 +23,7 @@ import java.util.List;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -36,8 +36,8 @@ public class ActionParameterChoicesFacetNone extends ActionParameterChoicesFacet
             final DeploymentCategory deploymentCategory,
             final SpecificationLoader specificationLookup,
             final AuthenticationSessionProvider authenticationSessionProvider,
-            final AdapterManager adapterManager) {
-        super(holder, deploymentCategory, specificationLookup, authenticationSessionProvider, adapterManager);
+            final ObjectAdapterProvider adapterProvider) {
+        super(holder, deploymentCategory, specificationLookup, authenticationSessionProvider, adapterProvider);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/JavaCollectionFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/JavaCollectionFacetTest.java
index 9d2d71b..2eceedc 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/JavaCollectionFacetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/JavaCollectionFacetTest.java
@@ -34,7 +34,7 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.javautilcollection.JavaCollectionFacet;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
@@ -56,11 +56,11 @@ public class JavaCollectionFacetTest {
     @Mock
     private Iterator<ObjectAdapter> mockIterator;
     @Mock
-    private AdapterManager mockAdapterManager;
+    private ObjectAdapterProvider mockAdapterManager;
 
     @Before
     public void setUp() throws Exception {
-        mockAdapterManager = context.mock(AdapterManager.class);
+        mockAdapterManager = context.mock(ObjectAdapterProvider.class);
 
         facet = new JavaCollectionFacet(mockFacetHolder, mockAdapterManager);
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
index 473d751..c00a0e7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.object.ident.title.annotation;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
 import java.util.List;
 
 import com.google.common.collect.Lists;
@@ -31,7 +34,7 @@ import org.junit.Test;
 
 import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.object.title.annotation.TitleAnnotationFacetFactory;
@@ -40,9 +43,6 @@ import org.apache.isis.core.metamodel.facets.object.title.annotation.TitleFacetV
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
 public class TitleFacetViaTitleAnnotationTest {
 
     @Rule
@@ -55,7 +55,7 @@ public class TitleFacetViaTitleAnnotationTest {
     private ObjectAdapter mockObjectAdapter;
 
     @Mock
-    private AdapterManager mockAdapterManager;
+    private ObjectAdapterProvider mockAdapterManager;
     
     protected static class DomainObjectWithProblemInItsAnnotatedTitleMethod {
 
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index f5ab46b..6e278a2 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -245,6 +245,20 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         }
     }
 
+    @Override
+    public List<ObjectAdapter> getServices() {
+        final List<Object> services = servicesInjector.getRegisteredServices();
+        final List<ObjectAdapter> serviceAdapters = _Lists.newArrayList();
+        for (final Object servicePojo : services) {
+            ObjectAdapter serviceAdapter = lookupAdapterFor(servicePojo);
+            if(serviceAdapter == null) {
+                throw new IllegalStateException("ObjectAdapter for service " + servicePojo + " does not exist?!?");
+            }
+            serviceAdapters.add(serviceAdapter);
+        }
+        return serviceAdapters;
+    }
+
     private Command createCommand() {
         final Command command = commandService.create();
 
diff --git a/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
index 7885ba4..dc64ff8 100644
--- a/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
+++ b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
@@ -19,6 +19,10 @@
 
 package org.apache.isis.core.wrapper;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
 import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.List;
@@ -40,7 +44,7 @@ import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
@@ -74,10 +78,6 @@ import org.apache.isis.progmodel.wrapper.dom.employees.EmployeeRepository;
 import org.apache.isis.progmodel.wrapper.dom.employees.EmployeeRepositoryImpl;
 import org.apache.isis.schema.cmd.v1.CommandDto;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
 public class WrapperFactoryDefaultTest_wrappedObject {
 
     @Rule
@@ -87,7 +87,7 @@ public class WrapperFactoryDefaultTest_wrappedObject {
     public ExpectedException expectedException = ExpectedException.none();
     
     @Mock
-    private AdapterManager mockAdapterManager;
+    private ObjectAdapterProvider mockAdapterManager;
     @Mock
     private AuthenticationSessionProvider mockAuthenticationSessionProvider;
     @Mock
@@ -210,8 +210,8 @@ public class WrapperFactoryDefaultTest_wrappedObject {
                 allowing(mockAuthenticationSessionProvider).getAuthenticationSession();
                 will(returnValue(session));
 
-                allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
-                will(returnValue(mockEmployeeAdapter));
+//                allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
+//                will(returnValue(mockEmployeeAdapter));
 
                 allowing(mockAdapterManager).adapterFor(employeeDO);
                 will(returnValue(mockEmployeeAdapter));
diff --git a/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java
index b1dce48..46f8803 100644
--- a/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java
+++ b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.wrapper;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
 import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Collections;
@@ -43,7 +46,7 @@ import org.apache.isis.applib.services.wrapper.events.PropertyVisibilityEvent;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.consent.Allow;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -67,9 +70,6 @@ import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.progmodel.wrapper.dom.employees.Employee;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
 /**
  * Contract test.
  */
@@ -79,7 +79,7 @@ public class WrapperFactoryDefaultTest_wrappedObject_transient {
     public final JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
     @Mock
-    private AdapterManager mockAdapterManager;
+    private ObjectAdapterProvider mockAdapterManager;
     @Mock
     private AuthenticationSessionProvider mockAuthenticationSessionProvider;
     @Mock
@@ -159,8 +159,8 @@ public class WrapperFactoryDefaultTest_wrappedObject_transient {
                 allowing(mockDeploymentCategoryProvider).getDeploymentCategory();
                 will(returnValue(DeploymentCategory.PRODUCTION));
 
-                allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
-                will(returnValue(mockEmployeeAdapter));
+//                allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
+//                will(returnValue(mockEmployeeAdapter));
 
                 allowing(mockAdapterManager).adapterFor(employeeDO);
                 will(returnValue(mockEmployeeAdapter));
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java
index d1e0e3e..f48c9df 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java
@@ -26,6 +26,9 @@ import java.util.concurrent.Executors;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
@@ -35,15 +38,13 @@ import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.core.commons.lang.ArrayExtensions;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.services.command.CommandDtoServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ProxyEnhanced;
 import org.apache.isis.core.plugins.codegen.ProxyFactory;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * For command-reification depends on an implementation of
@@ -171,7 +172,7 @@ public class BackgroundServiceDefault implements BackgroundService {
                 specificationLoader,
                 commandDtoServiceInternal,
                 commandContext,
-                this::getAdapterManager);
+                this::getObjectAdapterProvider);
 
     }
 
@@ -196,7 +197,7 @@ public class BackgroundServiceDefault implements BackgroundService {
     @javax.inject.Inject
     private IsisSessionFactory isisSessionFactory;
 
-    protected AdapterManager getAdapterManager() {
+    protected ObjectAdapterProvider getObjectAdapterProvider() {
         return isisSessionFactory.getCurrentSession().getPersistenceSession();
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandInvocationHandler.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandInvocationHandler.java
index 1fc670b..63b661b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandInvocationHandler.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandInvocationHandler.java
@@ -28,7 +28,7 @@ import org.apache.isis.applib.services.background.BackgroundCommandService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
 import org.apache.isis.core.metamodel.services.command.CommandDtoServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -48,7 +48,7 @@ class CommandInvocationHandler<T> implements InvocationHandler {
     private final SpecificationLoader specificationLoader;
     private final CommandDtoServiceInternal commandDtoServiceInternal;
     private final CommandContext commandContext;
-    private final Supplier<AdapterManager> adapterManagerSupplier;
+    private final Supplier<ObjectAdapterProvider> adapterProviderSupplier;
 
     CommandInvocationHandler(
             BackgroundCommandService backgroundCommandService,
@@ -57,14 +57,14 @@ class CommandInvocationHandler<T> implements InvocationHandler {
             SpecificationLoader specificationLoader,
             CommandDtoServiceInternal commandDtoServiceInternal,
             CommandContext commandContext,
-            Supplier<AdapterManager> adapterManagerSupplier) {
+            Supplier<ObjectAdapterProvider> adapterProviderSupplier) {
         this.backgroundCommandService = requires(backgroundCommandService, "backgroundCommandService");
         this.target = requires(target, "target");
         this.mixedInIfAny = mixedInIfAny;
         this.specificationLoader = requires(specificationLoader, "specificationLoader");
         this.commandDtoServiceInternal = requires(commandDtoServiceInternal, "commandDtoServiceInternal");
         this.commandContext = requires(commandContext, "commandContext");
-        this.adapterManagerSupplier = requires(adapterManagerSupplier, "adapterManagerSupplier");
+        this.adapterProviderSupplier = requires(adapterProviderSupplier, "adapterProviderSupplier");
     }
 
     @Override
@@ -102,7 +102,7 @@ class CommandInvocationHandler<T> implements InvocationHandler {
             action = findMixedInAction(action, mixedInIfAny);
         }
 
-        final ObjectAdapter domainObjectAdapter = getAdapterManager().adapterFor(domainObject);
+        final ObjectAdapter domainObjectAdapter = getObjectAdapterProvider().adapterFor(domainObject);
         final String domainObjectClassName = CommandUtil.targetClassNameFor(domainObjectAdapter);
 
         final String targetActionName = CommandUtil.targetMemberNameFor(action);
@@ -124,13 +124,13 @@ class CommandInvocationHandler<T> implements InvocationHandler {
 
     // -- HELPER
 
-    private AdapterManager getAdapterManager() {
-        return adapterManagerSupplier.get();
+    private ObjectAdapterProvider getObjectAdapterProvider() {
+        return adapterProviderSupplier.get();
     }
 
     private ObjectAction findMixedInAction(final ObjectAction action, final Object domainObject) {
         final String actionId = action.getId();
-        final ObjectSpecification domainSpec = getAdapterManager().adapterFor(domainObject).getSpecification();
+        final ObjectSpecification domainSpec = getObjectAdapterProvider().adapterFor(domainObject).getSpecification();
         List<ObjectAction> objectActions = domainSpec.getObjectActions(Contributed.INCLUDED);
         for (ObjectAction objectAction : objectActions) {
             if(objectAction instanceof ObjectActionMixedIn) {
@@ -146,8 +146,8 @@ class CommandInvocationHandler<T> implements InvocationHandler {
     }
 
     private ObjectAdapter[] adaptersFor(final Object[] args) {
-        final AdapterManager adapterManager = getAdapterManager();
-        return CommandUtil.adaptersFor(args, adapterManager);
+        final ObjectAdapterProvider adapterProvider = getObjectAdapterProvider();
+        return CommandUtil.adaptersFor(args, adapterProvider);
     }
 
     private ObjectSpecificationDefault getJavaSpecificationOfOwningClass(final Method method) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java
index 0c9b4c7..8be50de 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java
@@ -30,7 +30,7 @@ import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
 import org.apache.isis.core.metamodel.services.command.CommandDtoServiceInternal;
@@ -224,7 +224,7 @@ public class CommandDtoServiceInternalDefault implements CommandDtoServiceIntern
     @javax.inject.Inject
     IsisSessionFactory isisSessionFactory;
 
-    protected AdapterManager getAdapterManager() {
+    protected ObjectAdapterProvider getObjectAdapterProvider() {
         return isisSessionFactory.getCurrentSession().getPersistenceSession();
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
index e79b66a..42a2494 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
@@ -26,24 +26,25 @@ import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.query.QueryFindAllInstances;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.persistence.query.*;
+import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
+import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 
 public class PersistenceQueryFactory {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFactory.class);
 
     private final SpecificationLoader specificationLoader;
-    private final AdapterManager adapterManager;
+    private final ObjectAdapterProvider adapterProvider;
 
     PersistenceQueryFactory(
-            final AdapterManager adapterManager,
+            final ObjectAdapterProvider adapterProvider,
             final SpecificationLoader specificationLoader) {
         this.specificationLoader = specificationLoader;
-        this.adapterManager = adapterManager;
+        this.adapterProvider = adapterProvider;
     }
 
     /**
@@ -79,7 +80,7 @@ public class PersistenceQueryFactory {
         for (final Map.Entry<String, Object> entry : argumentsByParameterName.entrySet()) {
             final String parameterName = entry.getKey();
             final Object argument = argumentsByParameterName.get(parameterName);
-            final ObjectAdapter argumentAdapter = argument != null ? adapterManager.adapterFor(argument) : null;
+            final ObjectAdapter argumentAdapter = argument != null ? adapterProvider.adapterFor(argument) : null;
             argumentsAdaptersByParameterName.put(parameterName, argumentAdapter);
         }
         return argumentsAdaptersByParameterName;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
index 9b035aa..f91f778 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
@@ -33,13 +33,10 @@ import org.apache.isis.applib.services.factory.FactoryService;
 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.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 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.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
@@ -134,8 +131,9 @@ abstract class PersistenceSessionBase implements PersistenceSession {
         this.userService = lookupService(UserService.class);
 
         // sub-components
-        final AdapterManager adapterManager = this;
-        this.persistenceQueryFactory = new PersistenceQueryFactory(adapterManager, this.specificationLoader);
+        this.persistenceQueryFactory = new PersistenceQueryFactory(
+                this.getObjectAdapterProvider(), 
+                this.specificationLoader);
         this.transactionManager = new IsisTransactionManager(this, /*authenticationSession,*/ servicesInjector);
 
         this.state = State.NOT_INITIALIZED;
@@ -189,20 +187,6 @@ abstract class PersistenceSessionBase implements PersistenceSession {
         return configuration;
     }
 
-    @Override
-    public List<ObjectAdapter> getServices() {
-        final List<Object> services = servicesInjector.getRegisteredServices();
-        final List<ObjectAdapter> serviceAdapters = _Lists.newArrayList();
-        for (final Object servicePojo : services) {
-            ObjectAdapter serviceAdapter = lookupAdapterFor(servicePojo);
-            if(serviceAdapter == null) {
-                throw new IllegalStateException("ObjectAdapter for service " + servicePojo + " does not exist?!?");
-            }
-            serviceAdapters.add(serviceAdapter);
-        }
-        return serviceAdapters;
-    }
-
     // -- ENUMS
 
     protected enum Type {
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
index 97d95cf..c5440a6 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
@@ -24,7 +24,6 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
 
@@ -38,12 +37,6 @@ public interface RendererContext {
 
     PersistenceSession getPersistenceSession();
 
-    /**
-     * @deprecated - replaced by {@link #getPersistenceSession()}.
-     */
-    @Deprecated
-    AdapterManager getAdapterManager();
-
     Where getWhere();
 
     List<List<String>> getFollowLinks();
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index 83ed59a..e5802f5 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -35,7 +35,7 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 import org.joda.time.format.ISODateTimeFormat;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -831,17 +831,17 @@ public final class JsonValueEncoder {
 
 
     private static ObjectAdapter adapterFor(Object value) {
-        return getAdapterManager().adapterFor(value);
+        return getObjectAdapterProvider().adapterFor(value);
     }
 
-    private static AdapterManager testAdapterManager;
+    private static ObjectAdapterProvider testAdapterManager;
 
     // for testing purposes only
-    static void testSetAdapterManager(AdapterManager adapterManager) {
+    static void testSetAdapterManager(ObjectAdapterProvider adapterManager) {
         JsonValueEncoder.testAdapterManager = adapterManager;
     }
 
-    public static AdapterManager getAdapterManager() {
+    public static ObjectAdapterProvider getObjectAdapterProvider() {
         return testAdapterManager != null? testAdapterManager: getPersistenceSession();
     }
 
diff --git a/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java b/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
index 68c41a4..af1e5ae 100644
--- a/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
+++ b/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
@@ -18,6 +18,10 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.sql.Timestamp;
@@ -31,17 +35,13 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.nullValue;
-import static org.junit.Assert.assertThat;
-
 public class JsonValueEncoderTest_appendValueAndFormat {
 
     @Rule
@@ -56,7 +56,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
     @Mock
     private ObjectAdapter mockObjectAdapter;
 
-    private AdapterManager mockAdapterManager;
+    private ObjectAdapterProvider mockAdapterManager;
 
     @Before
     public void setUp() {
diff --git a/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java b/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
index bc5286f..8f6c43f 100644
--- a/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
+++ b/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
@@ -18,6 +18,11 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import com.fasterxml.jackson.databind.node.BigIntegerNode;
@@ -37,7 +42,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
@@ -45,9 +50,6 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.*;
-
 @RunWith(JMock.class)
 public class JsonValueEncoderTest_asAdapter {
 
@@ -58,14 +60,14 @@ public class JsonValueEncoderTest_asAdapter {
     private EncodableFacet mockEncodableFacet;
     private ObjectAdapter mockObjectAdapter;
 
-    private AdapterManager mockAdapterManager;
+    private ObjectAdapterProvider mockAdapterManager;
 
     @Before
     public void setUp() throws Exception {
         mockObjectSpec = context.mock(ObjectSpecification.class);
         mockEncodableFacet = context.mock(EncodableFacet.class);
         mockObjectAdapter = context.mock(ObjectAdapter.class);
-        mockAdapterManager = context.mock(AdapterManager.class);
+        mockAdapterManager = context.mock(ObjectAdapterProvider.class);
 
         JsonValueEncoder.testSetAdapterManager(mockAdapterManager);
 
diff --git a/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java b/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
index 50d2849..14fb6c3 100644
--- a/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
+++ b/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
@@ -18,6 +18,9 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import org.jmock.Expectations;
@@ -29,16 +32,13 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-
 @RunWith(JMock.class)
 public class JsonValueEncoderTest_asObject {
 
@@ -47,7 +47,7 @@ public class JsonValueEncoderTest_asObject {
     private ObjectAdapter mockObjectAdapter;
     private ObjectSpecification mockObjectSpec;
     private EncodableFacet mockEncodableFacet;
-    private AdapterManager mockAdapterManager;
+    private ObjectAdapterProvider mockAdapterManager;
 
     private Object encoded;
 
@@ -65,7 +65,7 @@ public class JsonValueEncoderTest_asObject {
             }
         });
         mockEncodableFacet = context.mock(EncodableFacet.class);
-        mockAdapterManager = context.mock(AdapterManager.class);
+        mockAdapterManager = context.mock(ObjectAdapterProvider.class);
 
         JsonValueEncoder.testSetAdapterManager(mockAdapterManager);
         encoded = new Object();
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
index b7ae186..4f01ccd 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
@@ -39,7 +39,6 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 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.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -268,15 +267,6 @@ public class ResourceContext implements RendererContext6 {
         return authenticationSession;
     }
 
-    /**
-     * @deprecated - use {@link #getPersistenceSession()}.
-     */
-    @Deprecated
-    @Override
-    public AdapterManager getAdapterManager() {
-        return persistenceSession;
-    }
-
     @Override
     public ServicesInjector getServicesInjector() {
         return servicesInjector;
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
index ecd9fa7..fef32e6 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
@@ -27,7 +27,6 @@ import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -93,11 +92,6 @@ public class DomainResourceHelper {
         }
 
         @Override
-        public AdapterManager getAdapterManager() {
-            return rendererContext.getPersistenceSession();
-        }
-
-        @Override
         public Where getWhere() {
             return rendererContext.getWhere();
         }
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index cb168aa..c303667 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -25,12 +25,13 @@ import java.util.Collection;
 import java.util.List;
 import java.util.function.Function;
 
-import javax.annotation.Nullable;
+import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.hint.HintStore;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
@@ -46,8 +47,6 @@ import org.apache.isis.core.runtime.memento.Memento;
 import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
-import com.google.common.collect.Lists;
-
 public class ObjectAdapterMemento implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -573,59 +572,18 @@ public class ObjectAdapterMemento implements Serializable {
             return ActionMemento::new;
         }
 
-        @Deprecated
-        public static com.google.common.base.Function<ObjectAction, ActionMemento> from_Action() {
-            return new com.google.common.base.Function<ObjectAction, ActionMemento>() {
-                @Override
-                public ActionMemento apply(final ObjectAction from) {
-                    return new ActionMemento(from);
-                }
-            };
-        }
-
         public static Function<ObjectActionParameter, ActionParameterMemento> fromActionParameter() {
             return ActionParameterMemento::new;
         }
 
-        @Deprecated
-        public static com.google.common.base.Function<ObjectActionParameter, ActionParameterMemento> from_ActionParameter() {
-            return new com.google.common.base.Function<ObjectActionParameter, ActionParameterMemento>() {
-                @Override
-                public ActionParameterMemento apply(final ObjectActionParameter from) {
-                    return new ActionParameterMemento(from);
-                }
-            };
-        }
-
-        public static Function<Object, ObjectAdapterMemento> fromPojo(final AdapterManager adapterManager) {
-            return pojo->ObjectAdapterMemento.createOrNull( adapterManager.adapterFor(pojo) );
-        }
-
-        @Deprecated
-        public static com.google.common.base.Function<Object, ObjectAdapterMemento> from_Pojo(final AdapterManager adapterManager) {
-            return new com.google.common.base.Function<Object, ObjectAdapterMemento>() {
-                @Override
-                public ObjectAdapterMemento apply(final Object pojo) {
-                    final ObjectAdapter adapter = adapterManager.adapterFor(pojo);
-                    return ObjectAdapterMemento.createOrNull(adapter);
+        public static Function<Object, ObjectAdapterMemento> fromPojo(final ObjectAdapterProvider adapterProvider) {
+            return pojo->ObjectAdapterMemento.createOrNull( adapterProvider.adapterFor(pojo) );
                 }
-            };
-        }
 
         public static Function<ObjectAdapter, ObjectAdapterMemento> fromAdapter() {
             return ObjectAdapterMemento::createOrNull;
         }
 
-        @Deprecated
-        public static com.google.common.base.Function<ObjectAdapter, ObjectAdapterMemento> from_Adapter() {
-            return new com.google.common.base.Function<ObjectAdapter, ObjectAdapterMemento>() {
-                @Override
-                public ObjectAdapterMemento apply(final ObjectAdapter adapter) {
-                    return ObjectAdapterMemento.createOrNull(adapter);
-                }
-            };
-        }
-
         public static Function<ObjectAdapterMemento, ObjectAdapter> fromMemento(
                 final ConcurrencyChecking concurrencyChecking,
                 final PersistenceSession persistenceSession,
@@ -641,39 +599,10 @@ public class ObjectAdapterMemento implements Serializable {
             };
         }
 
-        @Deprecated
-        public static com.google.common.base.Function<ObjectAdapterMemento, ObjectAdapter> from_Memento(
-                final ConcurrencyChecking concurrencyChecking,
-                final PersistenceSession persistenceSession,
-                final SpecificationLoader specificationLoader) {
-            return new com.google.common.base.Function<ObjectAdapterMemento, ObjectAdapter>() {
-                @Override
-                public ObjectAdapter apply(final ObjectAdapterMemento memento) {
-                    try {
-                        return memento.getObjectAdapter(concurrencyChecking, persistenceSession, specificationLoader);
-                    } catch (ObjectNotFoundException e) {
-                        // this can happen if for example the object is not visible (due to the security tenanted facet)
-                        return null;
-                    }
-                }
-            };
-        }
-
         public static Function<ObjectAdapter, ObjectAdapterMemento> toMemento() {
             return ObjectAdapterMemento::createOrNull;
         }
 
-        @Deprecated
-        public static com.google.common.base.Function<ObjectAdapter, ObjectAdapterMemento> to_Memento() {
-            return new com.google.common.base.Function<ObjectAdapter, ObjectAdapterMemento>() {
-
-                @Override
-                public ObjectAdapterMemento apply(ObjectAdapter from) {
-                    return ObjectAdapterMemento.createOrNull(from);
-                }
-
-            };
-        }
 
         public static Function<ObjectAdapterMemento, Object> toPojo(
                 final PersistenceSession persistenceSession,
@@ -691,38 +620,10 @@ public class ObjectAdapterMemento implements Serializable {
             };
         }
 
-        @Deprecated
-        public static com.google.common.base.Function<? super ObjectAdapterMemento, Object> to_Pojo(
-                final PersistenceSession persistenceSession,
-                final SpecificationLoader specificationLoader) {
-            return new com.google.common.base.Function<ObjectAdapterMemento, Object>() {
-                @Nullable @Override public Object apply(@Nullable final ObjectAdapterMemento input) {
-                    if(input == null) {
-                        return null;
-                    }
-                    final ObjectAdapter objectAdapter = input
-                            .getObjectAdapter(ConcurrencyChecking.NO_CHECK, persistenceSession, specificationLoader);
-                    if(objectAdapter == null) {
-                        return null;
-                    }
-                    return objectAdapter.getObject();
-                }
-            };
-        }
-
         public static Function<ObjectAdapterMemento, RootOid> toOid() {
             return objectAdapterMemento->RootOid.create(objectAdapterMemento.asBookmark());
         }
 
-        @Deprecated
-        public static com.google.common.base.Function<ObjectAdapterMemento, RootOid> to_Oid() {
-            return new com.google.common.base.Function<ObjectAdapterMemento, RootOid>() {
-                @Override
-                public RootOid apply(final ObjectAdapterMemento objectAdapterMemento) {
-                    return RootOid.create(objectAdapterMemento.asBookmark());
-                }
-            };
-        }
     }
 
     private void ensureScalar() {
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index b923863..cf3a427 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -36,7 +36,7 @@ import org.apache.wicket.model.Model;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
@@ -384,7 +384,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     // ///////////////////////////////////////////////////////////////////
 
     @Override
-    public AdapterManager getAdapterManager() {
+    public ObjectAdapterProvider getObjectAdapterProvider() {
         return getPersistenceSession();
     }
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index 084dd72..c41d15a 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -37,7 +37,7 @@ import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facets.SingleIntValueFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
@@ -351,7 +351,7 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
     }
 
     @Override
-    public AdapterManager getAdapterManager() {
+    public ObjectAdapterProvider getObjectAdapterProvider() {
         return getPersistenceSession();
     }
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/TextFieldValueModel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/TextFieldValueModel.java
index b8d1a86..dcc6d60 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/TextFieldValueModel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/TextFieldValueModel.java
@@ -24,7 +24,7 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.Model;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 
 /**
@@ -37,7 +37,7 @@ public class TextFieldValueModel<T extends Serializable> extends Model<T> {
 
     public interface ScalarModelProvider {
         ScalarModel getModel();
-        AdapterManager getAdapterManager();
+        ObjectAdapterProvider getObjectAdapterProvider();
     }
 
     private final ScalarModelProvider scalarModelProvider;
@@ -63,7 +63,7 @@ public class TextFieldValueModel<T extends Serializable> extends Model<T> {
         if (object == null) {
             scalarModelProvider.getModel().setObject(null);
         } else {
-            final ObjectAdapter objectAdapter = scalarModelProvider.getAdapterManager().adapterFor(object);
+            final ObjectAdapter objectAdapter = scalarModelProvider.getObjectAdapterProvider().adapterFor(object);
             scalarModelProvider.getModel().setObject(objectAdapter);
         }
     }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index c6769ff..8ca8128 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -173,7 +173,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
 
             // REVIEW: I wonder if this is still needed after the ISIS-1613 rework?
             final ActionPromptHeaderPanel titlePanel =
-                    PersistenceSession.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+                    AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
                             new Callable<ActionPromptHeaderPanel>() {
                                 @Override
                                 public ActionPromptHeaderPanel call() throws Exception {


[isis] 05/07: ISIS-1976: move responsibility for pre-loading service adapters from PersistenceSession to ObjectAdapterContext

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit c37cde638a7222ac48f6a64c7ad33c607a92af0a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 4 08:17:55 2018 +0200

    ISIS-1976: move responsibility for pre-loading service adapters from
    PersistenceSession to ObjectAdapterContext
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../system/persistence/PersistenceSession5.java    | 25 ++--------------------
 .../adaptermanager/ObjectAdapterContext.java       | 21 ++++++++++++++++++
 2 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index 05ff2b7..2d0f87c 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -159,8 +159,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             LOG.debug("opening {}", this);
         }
 
-        objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
-
         persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
 
         final IsisLifecycleListener.PersistenceSessionLifecycleManagement psLifecycleMgmt = this;
@@ -173,8 +171,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         persistenceQueryProcessorByClass.put(
                 PersistenceQueryFindUsingApplibQueryDefault.class,
                 new PersistenceQueryFindUsingApplibQueryProcessor(this));
-
-        initServices();
+        
+        objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
 
         // tell the proxy of all request-scoped services to instantiate the underlying
         // services, store onto the thread-local and inject into them...
@@ -223,25 +221,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             }
         }
     }
-
-    /**
-     * Creates {@link ObjectAdapter adapters} for the service list, ensuring that these are mapped correctly,
-     * and have the same OIDs as in any previous sessions.
-     * 
-     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
-     */
-    @Deprecated
-    private void initServices() {
-        final List<Object> registeredServices = servicesInjector.getRegisteredServices();
-        for (final Object service : registeredServices) {
-            final ObjectAdapter serviceAdapter = adapterFor(service);
-            
-            // remap as Persistent if required
-            if (serviceAdapter.getOid().isTransient()) {
-                objectAdapterContext.remapAsPersistent(serviceAdapter, null, this);
-            }
-        }
-    }
     
     @Override
     public List<ObjectAdapter> getServices() {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index f1dd2ad..b002242 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.core.runtime.system.persistence.adaptermanager;
 
+import java.util.List;
 import java.util.UUID;
 import java.util.function.Function;
 
@@ -86,6 +87,7 @@ public class ObjectAdapterContext {
     public void open() {
         oidAdapterMap.open();
         pojoAdapterMap.open();
+        initServices();
     }
     
     public void close() {
@@ -251,6 +253,25 @@ public class ObjectAdapterContext {
     
     // ------------------------------------------------------------------------------------------------
     
+    /**
+     * Creates {@link ObjectAdapter adapters} for the service list, ensuring that these are mapped correctly,
+     * and have the same OIDs as in any previous sessions.
+     * 
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
+     */
+    @Deprecated
+    private void initServices() {
+        final List<Object> registeredServices = servicesInjector.getRegisteredServices();
+        for (final Object service : registeredServices) {
+            final ObjectAdapter serviceAdapter = objectAdapterProviderMixin.adapterFor(service);
+            
+            // remap as Persistent if required
+            if (serviceAdapter.getOid().isTransient()) {
+                remapAsPersistent(serviceAdapter, null, persistenceSession);
+            }
+        }
+    }
+    
     @Deprecated // don't expose caching
     public void addAdapterHonoringSpecImmutability(Object pojo, ObjectAdapter adapter) {
         // add all aggregated collections


[isis] 01/07: ISIS-1976: remove unused spec-loader from some facet constructors

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 3a089d1be884361895de7ab196b3ab7d2fc0d900
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Sep 3 15:13:15 2018 +0200

    ISIS-1976: remove unused spec-loader from some facet constructors
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../object/domainobject/DomainObjectAnnotationFacetFactory.java  | 1 -
 .../RecreatableObjectFacetForDomainObjectAnnotation.java         | 9 ++-------
 .../RecreatableObjectFacetDeclarativeInitializingAbstract.java   | 4 ----
 .../facets/object/recreatable/RecreatableObjectFacetFactory.java | 2 +-
 .../RecreatableObjectFacetForRecreatableObjectAnnotation.java    | 8 +++-----
 .../RecreatableObjectFacetForViewModelAnnotation.java            | 4 +---
 6 files changed, 7 insertions(+), 21 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 5cf7e73..781dc8a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -291,7 +291,6 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache {
         final PostConstructMethodCache postConstructMethodCache = this;
         final ViewModelFacet recreatableObjectFacet = RecreatableObjectFacetForDomainObjectAnnotation.create(
                 domainObjects, 
-                getSpecificationLoader(), 
                 persistenceSessionServiceInternal, 
                 servicesInjector,
                 facetHolder, 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
index ca9c234..b9bcfd6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
@@ -24,20 +24,17 @@ import java.util.Objects;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
 import org.apache.isis.core.metamodel.facets.object.recreatable.RecreatableObjectFacetDeclarativeInitializingAbstract;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class RecreatableObjectFacetForDomainObjectAnnotation extends
 RecreatableObjectFacetDeclarativeInitializingAbstract {
 
     public static ViewModelFacet create(
             final List<DomainObject> domainObjects,
-            final SpecificationLoader specificationLoader,
             final ObjectAdapterProvider adapterProvider,
             final ServicesInjector servicesInjector,
             final FacetHolder holder,
@@ -61,8 +58,7 @@ RecreatableObjectFacetDeclarativeInitializingAbstract {
                             return null;
                         }
                         return new RecreatableObjectFacetForDomainObjectAnnotation(
-                                holder,
-                                specificationLoader, adapterProvider, servicesInjector, postConstructMethodCache);
+                                holder, adapterProvider, servicesInjector, postConstructMethodCache);
                     }
                     // shouldn't happen, the above switch should match all cases.
                     throw new IllegalArgumentException("nature of '" + nature + "' not recognized");
@@ -74,11 +70,10 @@ RecreatableObjectFacetDeclarativeInitializingAbstract {
 
     private RecreatableObjectFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final SpecificationLoader specificationLoader,
             final ObjectAdapterProvider adapterProvider,
             final ServicesInjector servicesInjector,
             final PostConstructMethodCache postConstructMethodCache) {
-        super(holder, RecreationMechanism.INITIALIZES, specificationLoader, adapterProvider, servicesInjector,
+        super(holder, RecreationMechanism.INITIALIZES, adapterProvider, servicesInjector,
                 postConstructMethodCache);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
index 3042d6f..7bd3528 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
@@ -38,23 +38,19 @@ 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.OneToOneAssociation;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class RecreatableObjectFacetDeclarativeInitializingAbstract 
 extends RecreatableObjectFacetAbstract {
 
-    private final SpecificationLoader specificationLoader; //FIXME[ISIS-1976] remove
     private final ObjectAdapterProvider adapterProvider;
 
     public RecreatableObjectFacetDeclarativeInitializingAbstract(
             final FacetHolder holder,
             final RecreationMechanism recreationMechanism,
-            final SpecificationLoader specificationLoader,
             final ObjectAdapterProvider adapterProvider,
             final ServicesInjector servicesInjector,
             final PostConstructMethodCache postConstructMethodCache) {
         super(holder, recreationMechanism, postConstructMethodCache, servicesInjector);
-        this.specificationLoader = specificationLoader;
         this.adapterProvider = adapterProvider;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
index 70089bd..fb93bef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
@@ -89,7 +89,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache {
 
     private ViewModelFacet create(final org.apache.isis.applib.annotation.ViewModel annotation, final FacetHolder holder) {
         final PostConstructMethodCache postConstructMethodCache = this;
-        return annotation != null ? new RecreatableObjectFacetForViewModelAnnotation(holder, getSpecificationLoader(), adapterProvider, servicesInjector, postConstructMethodCache) : null;
+        return annotation != null ? new RecreatableObjectFacetForViewModelAnnotation(holder, adapterProvider, servicesInjector, postConstructMethodCache) : null;
     }
 
     private ViewModelFacet create(final XmlRootElement annotation, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
index 8153dbf..cbb29a8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
@@ -19,23 +19,21 @@
 
 package org.apache.isis.core.metamodel.facets.object.recreatable;
 
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class RecreatableObjectFacetForRecreatableObjectAnnotation extends
 RecreatableObjectFacetDeclarativeInitializingAbstract {
 
     public RecreatableObjectFacetForRecreatableObjectAnnotation(
             final FacetHolder holder,
-            final SpecificationLoader specificationLoader,
-            final AdapterManager adapterManager,
+            final ObjectAdapterProvider adapterProvider,
             final ServicesInjector servicesInjector,
             final PostConstructMethodCache postConstructMethodCache) {
         super(holder, RecreationMechanism.INITIALIZES,
-                specificationLoader, adapterManager, servicesInjector, postConstructMethodCache);
+                adapterProvider, servicesInjector, postConstructMethodCache);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelAnnotation.java
index d76770c..e912d75 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelAnnotation.java
@@ -23,19 +23,17 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class RecreatableObjectFacetForViewModelAnnotation extends
 RecreatableObjectFacetDeclarativeInitializingAbstract {
 
     public RecreatableObjectFacetForViewModelAnnotation(
             final FacetHolder holder,
-            final SpecificationLoader specificationLoader,
             final ObjectAdapterProvider adapterProvider,
             final ServicesInjector servicesInjector,
             final PostConstructMethodCache postConstructMethodCache) {
         super(holder, RecreationMechanism.INITIALIZES,
-                specificationLoader, adapterProvider, servicesInjector, postConstructMethodCache);
+                adapterProvider, servicesInjector, postConstructMethodCache);
     }
 
 }


[isis] 03/07: ISIS-1976: let PersistenceSession no longer implement AdapterManager

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 9e5ac834edc31b9bda76789806bc2b31e90fd5bc
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 4 05:34:57 2018 +0200

    ISIS-1976: let PersistenceSession no longer implement AdapterManager
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../core/metamodel/adapter/mgr/AdapterManager.java |  87 +++--
 .../system/persistence/IsisLifecycleListener.java  |   5 +-
 .../system/persistence/PersistenceSession5.java    | 369 +++------------------
 .../PersistenceSession5_ObjectAdapterProvider.java | 140 ++++++++
 .../queries/PersistenceQueryProcessorAbstract.java |   3 +-
 .../apache/isis/core/runtime/memento/Memento.java  |   3 +-
 .../system/persistence/PersistenceSession.java     |  40 ++-
 .../adaptermanager/ObjectAdapterContext.java       |  64 +++-
 .../ObjectAdapterContext_AdapterManager.java       | 189 +++++++++++
 .../ObjectAdapterContext_Consistency.java          | 119 +++++++
 .../ObjectAdapterContext_MementoSupport.java       | 246 ++++++++++++++
 .../adaptermanager/ObjectAdapterLegacy.java        | 212 ------------
 .../adaptermanager/RootAndCollectionAdapters.java  |   8 +-
 .../wicket/ConverterForObjectAdapter.java          |   8 +-
 .../wicket/ConverterForObjectAdapterMemento.java   |   8 +-
 15 files changed, 894 insertions(+), 607 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
index 0284fbe..70ad13e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
@@ -23,11 +23,8 @@ import java.util.concurrent.Callable;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
 
-public interface AdapterManager extends ObjectAdapterProvider {
+public interface AdapterManager /*extends ObjectAdapterProvider*/ {
 
 
     enum ConcurrencyChecking {
@@ -122,46 +119,46 @@ public interface AdapterManager extends ObjectAdapterProvider {
 
     // -- DEPRECATIONS
 
-    /**
-     * Enable RecreatableObjectFacet to 'temporarily' map an existing pojo to an oid.
-     * @deprecated don't expose caching
-     */
-    @Programmatic @Deprecated
-    ObjectAdapter addRecreatedPojoToCache(Oid oid, Object recreatedPojo);
-
-    /**
-     * Enable RecreatableObjectFacet to remove a 'temporarily' mapped adapter for a pojo.
-     * @deprecated don't expose caching
-     */
-    @Programmatic @Deprecated
-    void removeAdapterFromCache(ObjectAdapter adapter);
-
-    
-    /**
-     * Gets the {@link ObjectAdapter adapter} for the specified domain object if
-     * it exists in the identity map.
-     *
-     * <p>
-     * Provided by the <tt>AdapterManager</tt> when used by framework.
-     *
-     * @param pojo
-     *            - must not be <tt>null</tt>
-     * @return adapter, or <tt>null</tt> if doesn't exist.
-     * @deprecated don't expose caching
-     */
-    @Programmatic @Deprecated
-    ObjectAdapter lookupAdapterFor(Object pojo);
-
-    /**
-     * Gets the {@link ObjectAdapter adapter} for the {@link Oid} if it exists
-     * in the identity map.
-     *
-     * @param oid
-     *            - must not be <tt>null</tt>
-     * @return adapter, or <tt>null</tt> if doesn't exist.
-     * @deprecated don't expose caching
-     */
-    @Programmatic @Deprecated
-    ObjectAdapter lookupAdapterFor(Oid oid);
+//    /**
+//     * Enable RecreatableObjectFacet to 'temporarily' map an existing pojo to an oid.
+//     * @deprecated don't expose caching
+//     */
+//    @Programmatic @Deprecated
+//    ObjectAdapter addRecreatedPojoToCache(Oid oid, Object recreatedPojo);
+//
+//    /**
+//     * Enable RecreatableObjectFacet to remove a 'temporarily' mapped adapter for a pojo.
+//     * @deprecated don't expose caching
+//     */
+//    @Programmatic @Deprecated
+//    void removeAdapterFromCache(ObjectAdapter adapter);
+//
+//    
+//    /**
+//     * Gets the {@link ObjectAdapter adapter} for the specified domain object if
+//     * it exists in the identity map.
+//     *
+//     * <p>
+//     * Provided by the <tt>AdapterManager</tt> when used by framework.
+//     *
+//     * @param pojo
+//     *            - must not be <tt>null</tt>
+//     * @return adapter, or <tt>null</tt> if doesn't exist.
+//     * @deprecated don't expose caching
+//     */
+//    @Programmatic @Deprecated
+//    ObjectAdapter lookupAdapterFor(Object pojo);
+//
+//    /**
+//     * Gets the {@link ObjectAdapter adapter} for the {@link Oid} if it exists
+//     * in the identity map.
+//     *
+//     * @param oid
+//     *            - must not be <tt>null</tt>
+//     * @return adapter, or <tt>null</tt> if doesn't exist.
+//     * @deprecated don't expose caching
+//     */
+//    @Programmatic @Deprecated
+//    ObjectAdapter lookupAdapterFor(Oid oid);
 
 }
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java
index 6634947..9713474 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java
@@ -34,6 +34,8 @@ import com.google.common.collect.Maps;
 
 import org.datanucleus.enhancement.Persistable;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+
 public class IsisLifecycleListener
 implements AttachLifecycleListener, ClearLifecycleListener, CreateLifecycleListener, DeleteLifecycleListener,
 DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLifecycleListener,
@@ -45,13 +47,12 @@ SuspendableListener {
     interface PersistenceSessionLifecycleManagement {
 
         void ensureRootObject(Persistable pojo);
-        void initializeMapAndCheckConcurrency(Persistable pojo);
+        ObjectAdapter initializeMapAndCheckConcurrency(Persistable pojo);
 
         void enlistCreatedAndRemapIfRequiredThenInvokeIsisInvokePersistingOrUpdatedCallback(Persistable pojo);
         void invokeIsisPersistingCallback(Persistable pojo);
         void enlistUpdatingAndInvokeIsisUpdatingCallback(Persistable pojo);
         void enlistDeletingAndInvokeIsisRemovingCallbackFacet(Persistable pojo);
-      //ObjectAdapter getAdapterFor(Persistable pojo);
     }
 
     private final PersistenceSessionLifecycleManagement persistenceSession;
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index 6e278a2..9910f32 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -19,8 +19,6 @@
 package org.apache.isis.core.runtime.system.persistence;
 
 import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-import static org.apache.isis.commons.internal.functions._Predicates.equalTo;
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
 
 import java.lang.reflect.Array;
 import java.lang.reflect.Modifier;
@@ -57,7 +55,6 @@ import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.iactn.Interaction;
-import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -65,7 +62,9 @@ import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 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;
@@ -88,7 +87,6 @@ import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFac
 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.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
@@ -97,7 +95,6 @@ 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.runtime.persistence.FixturesInstalledFlag;
 import org.apache.isis.core.runtime.persistence.NotPersistableException;
 import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
@@ -111,6 +108,7 @@ import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllIns
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 import org.apache.isis.core.runtime.services.RequestScopedService;
 import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext.MementoRecreateObjectSupport;
 import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
@@ -133,6 +131,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5.class);
     private ObjectAdapterContext objectAdapterContext;
+    private PersistenceSession5_ObjectAdapterProvider objectAdapterProviderMixin;
 
     /**
      * Initialize the object store so that calls to this object store access
@@ -162,7 +161,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         }
 
         objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
-
+        objectAdapterProviderMixin = new PersistenceSession5_ObjectAdapterProvider(this, objectAdapterContext);
+        
         persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
 
         final IsisLifecycleListener.PersistenceSessionLifecycleManagement psLifecycleMgmt = this;
@@ -244,13 +244,13 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             }
         }
     }
-
+    
     @Override
     public List<ObjectAdapter> getServices() {
         final List<Object> services = servicesInjector.getRegisteredServices();
         final List<ObjectAdapter> serviceAdapters = _Lists.newArrayList();
         for (final Object servicePojo : services) {
-            ObjectAdapter serviceAdapter = lookupAdapterFor(servicePojo);
+            ObjectAdapter serviceAdapter = objectAdapterContext.lookupAdapterFor(servicePojo);
             if(serviceAdapter == null) {
                 throw new IllegalStateException("ObjectAdapter for service " + servicePojo + " does not exist?!?");
             }
@@ -382,9 +382,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         interaction.clear();
     }
 
-
-
-
     // -- QuerySubmitter impl, findInstancesInTransaction
     @Override
     public <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query) {
@@ -724,7 +721,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
         Objects.requireNonNull(oid);
 
-        final ObjectAdapter adapter = lookupAdapterFor(oid);
+        final ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(oid);
         if (adapter != null) {
             return adapter;
         }
@@ -736,14 +733,11 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                         LOG.debug("getObject; oid={}", oid);
 
                         final Object pojo = loadPersistentPojo(oid);
-                        return addRecreatedPojoToCache(oid, pojo);
+                        return objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
                     }
                 });
     }
 
-
-
-
     // -- loadPersistentPojo
 
     private Object loadPersistentPojo(final RootOid rootOid) {
@@ -844,18 +838,16 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     // -- lazilyLoaded
 
-    private ObjectAdapter mapPersistent(final Persistable pojo) {
+    ObjectAdapter mapPersistent(final Persistable pojo) {
         if (persistenceManager.getObjectId(pojo) == null) {
             return null;
         }
         final RootOid oid = createPersistentOrViewModelOid(pojo);
-        final ObjectAdapter adapter = addRecreatedPojoToCache(oid, pojo);
+        final ObjectAdapter adapter = objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
         return adapter;
     }
 
 
-
-
     // -- refreshRootInTransaction, refreshRoot, resolve
 
     /**
@@ -1089,10 +1081,10 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     @Override
     public ObjectAdapter getAggregateRoot(final ParentedCollectionOid collectionOid) {
         final Oid rootOid = collectionOid.getRootOid();
-        ObjectAdapter rootadapter = lookupAdapterFor(rootOid);
+        ObjectAdapter rootadapter = objectAdapterContext.lookupAdapterFor(rootOid);
         if(rootadapter == null) {
             final Oid parentOidNowPersisted = remappedFrom(rootOid);
-            rootadapter = lookupAdapterFor(parentOidNowPersisted);
+            rootadapter = objectAdapterContext.lookupAdapterFor(parentOidNowPersisted);
         }
         return rootadapter;
     }
@@ -1108,133 +1100,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     // -- AdapterManager implementation
 
     @Override
-    public ObjectAdapter lookupAdapterFor(final Object pojo) {
-        Objects.requireNonNull(pojo);
-
-        return objectAdapterContext.lookupAdapterByPojo(pojo);  
-    }
-
-    @Override
-    public ObjectAdapter lookupAdapterFor(final Oid oid) {
-        Objects.requireNonNull(oid);
-        ensureMapsConsistent(oid);
-
-        return objectAdapterContext.lookupAdapterById(oid);
-    }
-
-
-    private ObjectAdapter existingOrValueAdapter(Object pojo) {
-
-        // attempt to locate adapter for the pojo
-        ObjectAdapter adapter = lookupAdapterFor(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 = objectAdapterContext.getFactories().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.
-     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
-     */
-    @Deprecated
-    private void ensureMapsConsistent(final Oid oid) {
-        Objects.requireNonNull(oid);
-
-        final ObjectAdapter adapter = objectAdapterContext.lookupAdapterById(oid);
-        if (adapter == null) {
-            return;
-        }
-        ensureOidAdapterMapConsistent(adapter);
-        ensurePojoAdapterMapConsistent(adapter);
-    }
-
-    private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
-        final Object adapterPojo = adapter.getObject();
-        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterByPojo(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 = objectAdapterContext.lookupAdapterById(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, equalTo(adapterAccordingToMap),
-                ()->"mismatch in "
-                        + mapName
-                        + ": provided adapter's OID: " + adapterOid + ", \n"
-                        + "but map's adapter's OID was: " + adapterAccordingToMap.getOid());
-    }
-
-    @Override
     public ObjectAdapter adapterForAny(RootOid rootOid) {
 
         final ObjectSpecId specId = rootOid.getObjectSpecId();
@@ -1272,24 +1137,24 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     @Override
     public Map<RootOid, ObjectAdapter> adaptersFor(final List<RootOid> rootOids) {
-        return adaptersFor(rootOids, ConcurrencyChecking.NO_CHECK);
+        return adaptersFor(rootOids, AdapterManager.ConcurrencyChecking.NO_CHECK);
     }
 
     private Map<RootOid,ObjectAdapter> adaptersFor(
             final List<RootOid> rootOids,
-            final ConcurrencyChecking concurrencyChecking) {
+            final AdapterManager.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 = lookupAdapterFor(rootOid);
+            ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(rootOid);
             // handle view models or transient
             if (adapter == null) {
                 if (rootOid.isTransient() || rootOid.isViewModel()) {
                     final Object pojo = recreatePojoTransientOrViewModel(rootOid);
-                    adapter = addRecreatedPojoToCache(rootOid, pojo);
+                    adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
                     sync(concurrencyChecking, adapter, rootOid);
                 }
             }
@@ -1309,7 +1174,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             if(pojo != null) {
                 ObjectAdapter adapter;
                 try {
-                    adapter = addRecreatedPojoToCache(rootOid, pojo);
+                    adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
                     adapterByOid.put(rootOid, adapter);
                 } catch(ObjectNotFoundException ex) {
                     throw ex; // just rethrow
@@ -1337,7 +1202,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      */
     @Override
     public ObjectAdapter adapterFor(final RootOid rootOid) {
-        return adapterFor(rootOid, ConcurrencyChecking.NO_CHECK);
+        return adapterFor(rootOid, AdapterManager.ConcurrencyChecking.NO_CHECK);
     }
 
 
@@ -1371,10 +1236,10 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     @Override
     public ObjectAdapter adapterFor(
             final RootOid rootOid,
-            final ConcurrencyChecking concurrencyChecking) {
+            final AdapterManager.ConcurrencyChecking concurrencyChecking) {
 
         // attempt to locate adapter for the Oid
-        ObjectAdapter adapter = lookupAdapterFor(rootOid);
+        ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(rootOid);
         if (adapter == null) {
             // else recreate
             try {
@@ -1384,7 +1249,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                 } else {
                     pojo = loadPersistentPojo(rootOid);
                 }
-                adapter = addRecreatedPojoToCache(rootOid, pojo);
+                adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
             } catch(ObjectNotFoundException ex) {
                 throw ex; // just rethrow
             } catch(RuntimeException ex) {
@@ -1401,7 +1266,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
 
     private void sync(
-            final ConcurrencyChecking concurrencyChecking,
+            final AdapterManager.ConcurrencyChecking concurrencyChecking,
             final ObjectAdapter adapter, final RootOid rootOid) {
         // sync versions of original, with concurrency checking if required
         Oid adapterOid = adapter.getOid();
@@ -1419,7 +1284,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                             otherVersion != null &&
                             thisVersion.different(otherVersion)) {
 
-                        if(concurrencyCheckingGloballyEnabled && ConcurrencyChecking.isCurrentlyEnabled()) {
+                        if(concurrencyCheckingGloballyEnabled && AdapterManager.ConcurrencyChecking.isCurrentlyEnabled()) {
                             LOG.info("concurrency conflict detected on {} ({})", recreatedOid, otherVersion);
                             final String currentUser = authenticationSession.getUserName();
                             throw new ConcurrencyException(currentUser, recreatedOid, thisVersion, otherVersion);
@@ -1461,160 +1326,14 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return pojo;
     }
 
-    @Override
-    public ObjectAdapter adapterFor(final Object pojo) {
-
-        if(pojo == null) {
-            return null;
-        }
-        final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo);
-        if(existingOrValueAdapter != null) {
-            return existingOrValueAdapter;
-        }
-
-        // Creates a new transient root {@link ObjectAdapter adapter} for the supplied domain
-        final RootOid rootOid = createTransientOrViewModelOid(pojo);
-        final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
-
-        return mapAndInjectServices(newAdapter);
-    }
-
-    @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;
-        }
-
-        ensureMapsConsistent(parentAdapter);
-        
-        // the List, Set etc. instance gets wrapped in its own adapter
-        final ObjectAdapter newAdapter = objectAdapterContext.getFactories()
-                .createCollectionAdapter(pojo, parentAdapter, collection);
-
-        return mapAndInjectServices(newAdapter);
-    }
-
-
-
-    /**
-     * Either returns an existing {@link ObjectAdapter adapter} (as per
-     * {@link #lookupAdapterFor(Object)} or {@link #lookupAdapterFor(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 addRecreatedPojoToCache(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 = lookupAdapterFor(recreatedPojo);
-        if (adapterLookedUpByPojo != null) {
-            return adapterLookedUpByPojo;
-        }
-
-        // attempt to locate adapter for the Oid
-        final ObjectAdapter adapterLookedUpByOid = lookupAdapterFor(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 removeAdapterFromCache(final ObjectAdapter adapter) {
-        ensureMapsConsistent(adapter);
-        objectAdapterContext.removeAdapter(adapter);
-    }
-
-    
     /**
      * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
      */
     @Deprecated
     private void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
-        removeAdapterFromCache(adapter);
+        objectAdapterContext.removeAdapterFromCache(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 = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
-        } else /*if (oid instanceof CollectionOid)*/ {
-            final ParentedCollectionOid collectionOid = (ParentedCollectionOid) oid;
-            createdAdapter = objectAdapterContext.getFactories().createCollectionAdapter(pojo, collectionOid);
-        }
-        return createdAdapter;
-    }
-
-
-
-    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, objectAdapterContext.containsAdapterForPojo(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;
-        }
-
-        objectAdapterContext.addAdapterHonoringSpecImmutability(pojo, adapter);
-
-        // must inject after mapping, otherwise infinite loop
-        servicesInjector.injectServicesInto(pojo);
-
-        return adapter;
+        objectAdapterContext.mapAndInjectServices(adapter);
     }
 
     // -- TransactionManager delegate methods
@@ -1622,7 +1341,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return transactionManager.getCurrentTransaction();
     }
 
-
     // -- FrameworkSynchronizer delegate methods
 
     @Override
@@ -1636,7 +1354,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public void initializeMapAndCheckConcurrency(final Persistable pojo) {
+    public ObjectAdapter initializeMapAndCheckConcurrency(final Persistable pojo) {
         final Persistable pc = pojo;
 
         // need to do eagerly, because (if a viewModel then) a
@@ -1646,7 +1364,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         final Version datastoreVersion = getVersionIfAny(pc);
 
         final RootOid originalOid;
-        ObjectAdapter adapter = lookupAdapterFor(pojo);
+        ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(pojo);
         if (adapter != null) {
             ensureRootObject(pojo);
             originalOid = (RootOid) adapter.getOid();
@@ -1666,7 +1384,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                     otherVersion != null &&
                     thisVersion.different(otherVersion)) {
 
-                if (ConcurrencyChecking.isCurrentlyEnabled()) {
+                if (AdapterManager.ConcurrencyChecking.isCurrentlyEnabled()) {
                     LOG.info("concurrency conflict detected on {} ({})", thisOid, otherVersion);
                     final String currentUser = authenticationSession.getUserName();
                     final ConcurrencyException abortCause = new ConcurrencyException(currentUser, thisOid,
@@ -1682,11 +1400,11 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
             // it appears to be possible that there is already an adapter for this Oid,
             // ie from ObjectStore#resolveImmediately()
-            adapter = lookupAdapterFor(originalOid);
+            adapter = objectAdapterContext.lookupAdapterFor(originalOid);
             if (adapter != null) {
                 remapRecreatedPojo(adapter, pojo);
             } else {
-                adapter = addRecreatedPojoToCache(originalOid, pojo);
+                adapter = objectAdapterContext.addRecreatedPojoToCache(originalOid, pojo);
 
                 CallbackFacet.Util.callCallback(adapter, LoadedCallbackFacet.class);
                 postLifecycleEventIfRequired(adapter, LoadedLifecycleEventFacet.class);
@@ -1694,6 +1412,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         }
 
         adapter.setVersion(datastoreVersion);
+        
+        return objectAdapterContext.lookupAdapterFor(pojo);
     }
 
     // -- create...Oid (main API)
@@ -1701,7 +1421,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      * Create a new {@link Oid#isTransient() transient} {@link Oid} for the
      * supplied pojo, uniquely distinguishable from any other {@link Oid}.
      */
-    private final RootOid createTransientOrViewModelOid(final Object pojo) {
+    final RootOid createTransientOrViewModelOid(final Object pojo) {
         return newIdentifier(pojo, Type.TRANSIENT);
     }
 
@@ -1770,7 +1490,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      */
     @Override
     public void invokeIsisPersistingCallback(final Persistable pojo) {
-        final ObjectAdapter adapter = lookupAdapterFor(pojo);
+        final ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(pojo);
         if (adapter == null) {
             // not expected.
             return;
@@ -1831,7 +1551,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     @Override
     public void enlistUpdatingAndInvokeIsisUpdatingCallback(final Persistable pojo) {
-        ObjectAdapter adapter = lookupAdapterFor(pojo);
+        ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(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
@@ -1888,9 +1608,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return Utils.getVersionIfAny(pojo, authenticationSession);
     }
 
-
-
-
     // -- DomainObjectServices impl
 
     @Override
@@ -1962,6 +1679,18 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
         return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
     }
+
+    @Override
+    public MementoRecreateObjectSupport mementoSupport() {
+        return objectAdapterContext.mementoSupport();
+    }
+    
+    @Override
+    public ObjectAdapterProvider getObjectAdapterProvider() {
+        return objectAdapterProviderMixin;
+    }
+
+
     
 }
 
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_ObjectAdapterProvider.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_ObjectAdapterProvider.java
new file mode 100644
index 0000000..5c8b85d
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_ObjectAdapterProvider.java
@@ -0,0 +1,140 @@
+/*
+ *  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.function.Function;
+
+import org.datanucleus.enhancement.Persistable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
+
+public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterProvider {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5_ObjectAdapterProvider.class);
+
+    protected final PersistenceSession5 holder;
+    protected final ObjectAdapterContext objectAdapterContext;
+
+    // -- open
+
+    PersistenceSession5_ObjectAdapterProvider(PersistenceSession5 holder, ObjectAdapterContext objectAdapterContext) {
+        this.holder = holder;
+        this.objectAdapterContext = objectAdapterContext;
+    }
+
+    @Override
+    public ObjectAdapter adapterFor(Object pojo) {
+        //return holder.getObjectAdapterProvider().adapterFor(pojo);
+        
+        if(pojo == null) {
+            return null;
+        }
+        final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo);
+        if(existingOrValueAdapter != null) {
+            return existingOrValueAdapter;
+        }
+
+        // Creates a new transient root {@link ObjectAdapter adapter} for the supplied domain
+        final RootOid rootOid = holder.createTransientOrViewModelOid(pojo);
+        final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
+
+        return objectAdapterContext.mapAndInjectServices(newAdapter);
+    }
+
+    @Override
+    public ObjectAdapter adapterFor(Object pojo, ObjectAdapter parentAdapter, OneToManyAssociation collection) {
+        //return holder.getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
+
+        assert parentAdapter != null;
+        assert collection != null;
+
+        final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo);
+        if(existingOrValueAdapter != null) {
+            return existingOrValueAdapter;
+        }
+
+        objectAdapterContext.ensureMapsConsistent(parentAdapter);
+
+        // the List, Set etc. instance gets wrapped in its own adapter
+        final ObjectAdapter newAdapter = objectAdapterContext.getFactories()
+                .createCollectionAdapter(pojo, parentAdapter, collection);
+
+        return objectAdapterContext.mapAndInjectServices(newAdapter);
+    }
+
+    @Override
+    public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
+        return objectAdapterContext.specificationForViewModel(viewModelPojo);
+    }
+
+    @Override
+    public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
+        return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
+    }
+    
+    // -- HELPER
+    
+    protected ObjectAdapter existingOrValueAdapter(Object pojo) {
+
+        // attempt to locate adapter for the pojo
+        ObjectAdapter adapter = objectAdapterContext.lookupAdapterByPojo(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 = holder.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 = holder.specificationLoader.loadSpecification(pojo.getClass());
+
+        // we create value facets as standalone (so not added to maps)
+        if (objSpec.containsFacet(ValueFacet.class)) {
+            adapter = objectAdapterContext.getFactories().createStandaloneAdapter(pojo);
+            return adapter;
+        }
+
+        return null;
+    }
+
+
+}
+
+
+
diff --git a/core/plugins/jdo-datanucleus-5/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
index d972273..def59fd 100644
--- a/core/plugins/jdo-datanucleus-5/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
@@ -55,8 +55,7 @@ implements PersistenceQueryProcessor<T> {
             ObjectAdapter adapter;
             if(pojo instanceof Persistable) {
                 // an entity
-                persistenceSession.initializeMapAndCheckConcurrency((Persistable) pojo);
-                adapter = persistenceSession.lookupAdapterFor(pojo);
+                adapter = persistenceSession.initializeMapAndCheckConcurrency((Persistable) pojo);
             } else {
                 // a value type
                 adapter = persistenceSession.adapterFor(pojo);
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 9e1eedc..57d566e 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
@@ -195,7 +195,8 @@ public class Memento implements Serializable {
         
         final Oid oid = getOid();
 
-        return ObjectAdapterLegacy.__Memento.recreateObject(spec, oid, data);
+        return getPersistenceSession().mementoSupport().recreateObject(spec, oid, data);
+                
     }
 
 
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 4caa08d..aade4e5 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
@@ -18,6 +18,7 @@ package org.apache.isis.core.runtime.system.persistence;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.jdo.PersistenceManager;
 
@@ -32,13 +33,16 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 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.runner.opts.OptionHandlerFixtureAbstract;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext.MementoRecreateObjectSupport;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 
-public interface PersistenceSession extends AdapterManager, TransactionalResource, SessionScopedComponent {
+public interface PersistenceSession extends ObjectAdapterProvider, TransactionalResource, SessionScopedComponent {
 
     // -- CONSTANTS
 
@@ -59,21 +63,38 @@ public interface PersistenceSession extends AdapterManager, TransactionalResourc
     public static final String DATANUCLEUS_PROPERTIES_ROOT = ROOT_KEY + "impl.";
 
 
-    // -- INTERFACE DECLARATION
+    // -- OBJECT ADAPTER PROVIDER
     
-    default ObjectAdapterProvider getObjectAdapterProvider() {
-        return this;
+    ObjectAdapterProvider getObjectAdapterProvider();
+    default ObjectAdapter adapterFor(Object domainObject) {
+        return getObjectAdapterProvider().adapterFor(domainObject);
+    }
+    default ObjectAdapter adapterFor(
+            final Object pojo,
+            final ObjectAdapter parentAdapter,
+            OneToManyAssociation collection) {
+        return getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
+    }
+    default ObjectSpecification specificationForViewModel(final Object viewModelPojo) {
+        return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
+    }
+    default ObjectAdapter adapterForViewModel(
+            final Object viewModelPojo, 
+            final Function<ObjectSpecId, RootOid> rootOidFactory) {
+        return getObjectAdapterProvider().adapterForViewModel(viewModelPojo, rootOidFactory);
     }
     
+    //---
+    
+    MementoRecreateObjectSupport mementoSupport();
+    
     ObjectAdapter adapterFor(RootOid rootOid);
-
-    ObjectAdapter adapterFor(RootOid oid, ConcurrencyChecking concurrencyChecking);
-
+    ObjectAdapter adapterFor(RootOid oid, AdapterManager.ConcurrencyChecking concurrencyChecking);
     ObjectAdapter adapterForAny(RootOid rootOid);
-
     Map<RootOid, ObjectAdapter> adaptersFor(List<RootOid> rootOids);
-
     <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query);
+    
+    // --
 
     void close();
 
@@ -155,5 +176,4 @@ public interface PersistenceSession extends AdapterManager, TransactionalResourc
     boolean isRepresentingPersistent(Object pojo);
     boolean isDestroyed(Object pojo);
 
-
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index c3cdc1d..29855e3 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -27,7 +27,6 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.IsisAssertException;
 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;
@@ -39,6 +38,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.memento.Data;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
 /**
@@ -51,9 +51,12 @@ public class ObjectAdapterContext {
     
     private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
     private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
-    private final AdapterManager adapterManager; //FIXME[ISIS-1976] remove
+    private final PersistenceSession persistenceSession; 
     private final ServicesInjector servicesInjector;
     private final SpecificationLoader specificationLoader;
+    private final ObjectAdapterContext_Consistency consistencyMixin;
+    private final ObjectAdapterContext_AdapterManager adapterManagerMixin;
+    private final ObjectAdapterContext_MementoSupport mementoSupportMixin;
     
     ObjectAdapterContext(
             ServicesInjector servicesInjector, 
@@ -61,7 +64,11 @@ public class ObjectAdapterContext {
             SpecificationLoader specificationLoader, 
             PersistenceSession persistenceSession) {
         
-        this.adapterManager = persistenceSession;
+        this.consistencyMixin = new ObjectAdapterContext_Consistency(this);
+        this.adapterManagerMixin = new ObjectAdapterContext_AdapterManager(this, persistenceSession);
+        this.mementoSupportMixin = new ObjectAdapterContext_MementoSupport(this, persistenceSession);
+        
+        this.persistenceSession = persistenceSession;
         this.servicesInjector = servicesInjector;
         this.specificationLoader = specificationLoader;
         
@@ -137,6 +144,16 @@ public class ObjectAdapterContext {
         pojoAdapterMap.remove(adapter);
     }
     
+    // -- CACHE CONSISTENCY
+    
+    public void ensureMapsConsistent(final ObjectAdapter adapter) {
+        consistencyMixin.ensureMapsConsistent(adapter);
+    }
+
+    public void ensureMapsConsistent(final Oid oid) {
+        consistencyMixin.ensureMapsConsistent(oid);
+    }
+    
     // -- FACTORIES
     
     public static interface ObjectAdapterFactories {
@@ -187,6 +204,38 @@ public class ObjectAdapterContext {
         return objectAdapterFactories;
     }
     
+    // -- ADAPTER MANAGER LEGACY
+    
+    public ObjectAdapter addRecreatedPojoToCache(Oid oid, Object recreatedPojo) {
+        return adapterManagerMixin.addRecreatedPojoToCache(oid, recreatedPojo);
+    }
+    
+    public ObjectAdapter mapAndInjectServices(final ObjectAdapter adapter) {
+        return adapterManagerMixin.mapAndInjectServices(adapter);
+    }
+    
+    public ObjectAdapter lookupAdapterFor(Object pojo) {
+        return adapterManagerMixin.lookupAdapterFor(pojo);
+    }
+    
+    public ObjectAdapter lookupAdapterFor(final Oid oid) {
+        return adapterManagerMixin.lookupAdapterFor(oid);
+    }
+    
+    public void removeAdapterFromCache(final ObjectAdapter adapter) {
+        adapterManagerMixin.removeAdapterFromCache(adapter);
+    }
+    
+    // -- MEMENTO SUPPORT
+    
+    public static interface MementoRecreateObjectSupport {
+        ObjectAdapter recreateObject(ObjectSpecification spec, Oid oid, Data data);
+    }
+    
+    public MementoRecreateObjectSupport mementoSupport() {
+        return mementoSupportMixin;
+    }
+    
     // ------------------------------------------------------------------------------------------------
     
     @Deprecated // don't expose caching
@@ -218,20 +267,20 @@ public class ObjectAdapterContext {
         final ObjectSpecification spec = viewModelAdapter.getSpecification();
         
         if(createdTemporaryAdapter[0]) {
-            adapterManager.removeAdapterFromCache(viewModelAdapter);
+            adapterManagerMixin.removeAdapterFromCache(viewModelAdapter);
         }
         return spec;
     }
 
     public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
-        ObjectAdapter viewModelAdapter = adapterManager.lookupAdapterFor(viewModelPojo);
+        ObjectAdapter viewModelAdapter = adapterManagerMixin.lookupAdapterFor(viewModelPojo);
         if(viewModelAdapter == null) {
             final ObjectSpecification objectSpecification = 
                     specificationLoader.loadSpecification(viewModelPojo.getClass());
             final ObjectSpecId objectSpecId = objectSpecification.getSpecId();
             final RootOid newRootOid = rootOidFactory.apply(objectSpecId);
 
-            viewModelAdapter = adapterManager.addRecreatedPojoToCache(newRootOid, viewModelPojo);
+            viewModelAdapter = adapterManagerMixin.addRecreatedPojoToCache(newRootOid, viewModelPojo);
         }
         return viewModelAdapter;
     }
@@ -252,7 +301,8 @@ public class ObjectAdapterContext {
         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();
 
-        final RootAndCollectionAdapters rootAndCollectionAdapters = new RootAndCollectionAdapters(adapter, session);
+        final RootAndCollectionAdapters rootAndCollectionAdapters = 
+                new RootAndCollectionAdapters(adapter, adapterManagerMixin);
 
         removeFromCache(rootAndCollectionAdapters, transientRootOid);
         
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_AdapterManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_AdapterManager.java
new file mode 100644
index 0000000..25febc8
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_AdapterManager.java
@@ -0,0 +1,189 @@
+/*
+ *  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.adaptermanager;
+
+import java.util.Objects;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.commons.ensure.Assert;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+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.services.ServicesInjector;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+
+/**
+ *  
+ * @since 2.0.0-M2
+ */
+class ObjectAdapterContext_AdapterManager {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_AdapterManager.class);
+    private final ObjectAdapterContext objectAdapterContext;
+    private final PersistenceSession persistenceSession;
+    private final ServicesInjector servicesInjector; 
+    
+    ObjectAdapterContext_AdapterManager(ObjectAdapterContext objectAdapterContext,
+            PersistenceSession persistenceSession) {
+        this.objectAdapterContext = objectAdapterContext;
+        this.persistenceSession = persistenceSession;
+        this.servicesInjector = persistenceSession.getServicesInjector();
+    }
+    
+    /**
+     * Either returns an existing {@link ObjectAdapter adapter} (as per
+     * {@link #lookupAdapterFor(Object)} or {@link #lookupAdapterFor(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 addRecreatedPojoToCache(Oid oid, 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 = lookupAdapterFor(recreatedPojo);
+        if (adapterLookedUpByPojo != null) {
+            return adapterLookedUpByPojo;
+        }
+
+        // attempt to locate adapter for the Oid
+        final ObjectAdapter adapterLookedUpByOid = lookupAdapterFor(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
+    void removeAdapterFromCache(final ObjectAdapter adapter) {
+        objectAdapterContext.ensureMapsConsistent(adapter);
+        objectAdapterContext.removeAdapter(adapter);
+    }
+
+    /**
+     * Gets the {@link ObjectAdapter adapter} for the specified domain object if
+     * it exists in the identity map.
+     *
+     * <p>
+     * Provided by the <tt>AdapterManager</tt> when used by framework.
+     *
+     * @param pojo
+     *            - must not be <tt>null</tt>
+     * @return adapter, or <tt>null</tt> if doesn't exist.
+     * @deprecated don't expose caching
+     */
+    //@Override
+    ObjectAdapter lookupAdapterFor(final Object pojo) {
+        Objects.requireNonNull(pojo);
+
+        return objectAdapterContext.lookupAdapterByPojo(pojo);  
+    }
+
+    /**
+     * Gets the {@link ObjectAdapter adapter} for the {@link Oid} if it exists
+     * in the identity map.
+     *
+     * @param oid
+     *            - must not be <tt>null</tt>
+     * @return adapter, or <tt>null</tt> if doesn't exist.
+     * @deprecated don't expose caching
+     */
+    //@Override
+    ObjectAdapter lookupAdapterFor(final Oid oid) {
+        Objects.requireNonNull(oid);
+        objectAdapterContext.ensureMapsConsistent(oid);
+
+        return objectAdapterContext.lookupAdapterById(oid);
+    }
+ 
+    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, objectAdapterContext.containsAdapterForPojo(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;
+        }
+
+        objectAdapterContext.addAdapterHonoringSpecImmutability(pojo, adapter);
+
+        // must inject after mapping, otherwise infinite loop
+        servicesInjector.injectServicesInto(pojo);
+
+        return adapter;
+    }
+    
+    ObjectAdapter createRootOrAggregatedAdapter(final Oid oid, final Object pojo) {
+        final ObjectAdapter createdAdapter;
+        if(oid instanceof RootOid) {
+            final RootOid rootOid = (RootOid) oid;
+            createdAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
+        } else /*if (oid instanceof CollectionOid)*/ {
+            final ParentedCollectionOid collectionOid = (ParentedCollectionOid) oid;
+            createdAdapter = objectAdapterContext.getFactories().createCollectionAdapter(pojo, collectionOid);
+        }
+        return createdAdapter;
+    }
+    
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Consistency.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Consistency.java
new file mode 100644
index 0000000..94b94d8
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Consistency.java
@@ -0,0 +1,119 @@
+/*
+ *  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.adaptermanager;
+
+import static org.apache.isis.commons.internal.functions._Predicates.equalTo;
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
+
+import java.util.Objects;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+
+/**
+ *  
+ * @since 2.0.0-M2
+ */
+class ObjectAdapterContext_Consistency {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_Consistency.class);
+    private final ObjectAdapterContext objectAdapterContext;
+    
+    ObjectAdapterContext_Consistency(ObjectAdapterContext objectAdapterContext) {
+        this.objectAdapterContext = objectAdapterContext;
+    }
+
+    /**
+     * Fail early if any problems.
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
+     */
+    protected void ensureMapsConsistent(final ObjectAdapter adapter) {
+        if (adapter.isValue()) {
+            return;
+        }
+        if (adapter.isParentedCollection()) {
+            return;
+        }
+        ensurePojoAdapterMapConsistent(adapter);
+        ensureOidAdapterMapConsistent(adapter);
+    }
+
+    /**
+     * Fail early if any problems.
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
+     */
+    protected void ensureMapsConsistent(final Oid oid) {
+        Objects.requireNonNull(oid);
+
+        final ObjectAdapter adapter = objectAdapterContext.lookupAdapterById(oid);
+        if (adapter == null) {
+            return;
+        }
+        ensureOidAdapterMapConsistent(adapter);
+        ensurePojoAdapterMapConsistent(adapter);
+    }
+
+    private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
+        final Object adapterPojo = adapter.getObject();
+        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterByPojo(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 = objectAdapterContext.lookupAdapterById(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, equalTo(adapterAccordingToMap),
+                ()->"mismatch in "
+                        + mapName
+                        + ": provided adapter's OID: " + adapterOid + ", \n"
+                        + "but map's adapter's OID was: " + adapterAccordingToMap.getOid());
+    }
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
new file mode 100644
index 0000000..d4a028d
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
@@ -0,0 +1,246 @@
+/*
+ *  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.adaptermanager;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.core.commons.ensure.Assert;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
+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.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.runtime.memento.CollectionData;
+import org.apache.isis.core.runtime.memento.Data;
+import org.apache.isis.core.runtime.memento.ObjectData;
+import org.apache.isis.core.runtime.memento.StandaloneData;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext.MementoRecreateObjectSupport;
+
+/**
+ *  
+ * @since 2.0.0-M2
+ */
+class ObjectAdapterContext_MementoSupport implements MementoRecreateObjectSupport {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_MementoSupport.class);
+    private final ObjectAdapterContext objectAdapterContext;
+    private final PersistenceSession persistenceSession;
+    
+    ObjectAdapterContext_MementoSupport(ObjectAdapterContext objectAdapterContext,
+            PersistenceSession persistenceSession) {
+        this.objectAdapterContext = objectAdapterContext;
+        this.persistenceSession = persistenceSession;
+    }
+
+    @Override
+    public ObjectAdapter recreateObject(ObjectSpecification spec, Oid oid, Data data) {
+        ObjectAdapter adapter;
+        
+        if (spec.isParentedOrFreeCollection()) {
+
+            final Object recreatedPojo = persistenceSession.instantiateAndInjectServices(spec);
+            adapter = objectAdapterContext.addRecreatedPojoToCache(oid, recreatedPojo);
+            populateCollection(adapter, (CollectionData) data);
+
+        } else {
+            Assert.assertTrue("oid must be a RootOid representing an object because spec is not a collection and cannot be a value", oid instanceof RootOid);
+            RootOid typedOid = (RootOid) oid;
+
+            // remove adapter if already in the adapter manager maps, because
+            // otherwise would (as a side-effect) update the version to that of the current.
+            adapter = objectAdapterContext.lookupAdapterFor(typedOid);
+            if(adapter != null) {
+                objectAdapterContext.removeAdapterFromCache(adapter);
+            }
+
+            // recreate an adapter for the original OID (with correct version)
+            adapter = persistenceSession.adapterFor(typedOid);
+
+            updateObject(adapter, data);
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("recreated object {}", adapter.getOid());
+        }
+        return adapter;
+    }
+
+    private ObjectAdapter recreateReference(Data data) {
+     // handle values
+        if (data instanceof StandaloneData) {
+            final StandaloneData standaloneData = (StandaloneData) data;
+            return standaloneData.getAdapter();
+        }
+
+        // reference to entity
+
+        Oid oid = data.getOid();
+        Assert.assertTrue("can only create a reference to an entity", oid instanceof RootOid);
+
+        final RootOid rootOid = (RootOid) oid;
+        final ObjectAdapter referencedAdapter = persistenceSession.adapterFor(rootOid);
+
+        if (data instanceof ObjectData) {
+            if (rootOid.isTransient()) {
+                updateObject(referencedAdapter, data);
+            }
+        }
+        return referencedAdapter;
+    }
+    
+    private void updateObject(final ObjectAdapter adapter, final Data data) {
+        final Object oid = adapter.getOid();
+        if (oid != null && !oid.equals(data.getOid())) {
+            throw new IllegalArgumentException("This memento can only be used to update the ObjectAdapter with the Oid " + data.getOid() + " but is " + oid);
+        }
+        if (!(data instanceof ObjectData)) {
+            throw new IsisException("Expected an ObjectData but got " + data.getClass());
+        }
+
+        updateFieldsAndResolveState(adapter, data);
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("object updated {}", adapter.getOid());
+        }
+    }
+    
+    private void populateCollection(final ObjectAdapter collectionAdapter, final CollectionData state) {
+        final ObjectAdapter[] initData = new ObjectAdapter[state.getElements().length];
+        int i = 0;
+        for (final Data elementData : state.getElements()) {
+            initData[i++] = recreateReference(elementData);
+        }
+        final CollectionFacet facet = collectionAdapter.getSpecification().getFacet(CollectionFacet.class);
+        facet.init(collectionAdapter, initData);
+    }
+    
+    private void updateFieldsAndResolveState(final ObjectAdapter objectAdapter, final Data data) {
+
+        boolean dataIsTransient = data.getOid().isTransient();
+
+        if (!dataIsTransient) {
+            updateFields(objectAdapter, data);
+            objectAdapter.getOid().setVersion(data.getOid().getVersion());
+        } else if (objectAdapter.isTransient() && dataIsTransient) {
+            updateFields(objectAdapter, data);
+
+        } else if (objectAdapter.isParentedCollection()) {
+            // this branch is kind-a wierd, I think it's to handle aggregated adapters.
+            updateFields(objectAdapter, data);
+
+        } else {
+            final ObjectData od = (ObjectData) data;
+            if (od.containsField()) {
+                throw new IsisException("Resolve state (for " + objectAdapter + ") inconsistent with fact that data exists for fields");
+            }
+        }
+    }
+    
+    private void updateFields(final ObjectAdapter object, final Data state) {
+        final ObjectData od = (ObjectData) state;
+        final List<ObjectAssociation> fields = object.getSpecification().getAssociations(Contributed.EXCLUDED);
+        for (final ObjectAssociation field : fields) {
+            if (field.isNotPersisted()) {
+                if (field.isOneToManyAssociation()) {
+                    continue;
+                }
+                if (field.containsFacet(PropertyOrCollectionAccessorFacet.class) && !field.containsFacet(PropertySetterFacet.class)) {
+                    LOG.debug("ignoring not-settable field {}", field.getName());
+                    continue;
+                }
+            }
+            updateField(object, od, field);
+        }
+    }
+
+    private void updateField(final ObjectAdapter objectAdapter, final ObjectData objectData, final ObjectAssociation objectAssoc) {
+        final Object fieldData = objectData.getEntry(objectAssoc.getId());
+
+        if (objectAssoc.isOneToManyAssociation()) {
+            updateOneToManyAssociation(objectAdapter, (OneToManyAssociation) objectAssoc, (CollectionData) fieldData);
+
+        } else if (objectAssoc.getSpecification().containsFacet(EncodableFacet.class)) {
+            final EncodableFacet facet = objectAssoc.getSpecification().getFacet(EncodableFacet.class);
+            final ObjectAdapter value = facet.fromEncodedString((String) fieldData);
+            ((OneToOneAssociation) objectAssoc).initAssociation(objectAdapter, value);
+
+        } else if (objectAssoc.isOneToOneAssociation()) {
+            updateOneToOneAssociation(objectAdapter, (OneToOneAssociation) objectAssoc, (Data) fieldData);
+        }
+    }
+
+    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();
+        for (final ObjectAdapter adapter : facet.iterable(collection)) {
+            original.add(adapter);
+        }
+
+        final Data[] elements = collectionData.getElements();
+        for (final Data data : elements) {
+            final ObjectAdapter elementAdapter = recreateReference(data);
+            if (!facet.contains(collection, elementAdapter)) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("  association {} changed, added {}", otma, elementAdapter.getOid());
+                }
+                otma.addElement(objectAdapter, elementAdapter, InteractionInitiatedBy.FRAMEWORK);
+            } else {
+                otma.removeElement(objectAdapter, elementAdapter, InteractionInitiatedBy.FRAMEWORK);
+            }
+        }
+
+        for (final ObjectAdapter element : original) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("  association {} changed, removed {}", otma, element.getOid());
+            }
+            otma.removeElement(objectAdapter, element, InteractionInitiatedBy.FRAMEWORK);
+        }
+    }
+
+    private void updateOneToOneAssociation(final ObjectAdapter objectAdapter, final OneToOneAssociation otoa, final Data assocData) {
+        if (assocData == null) {
+            otoa.initAssociation(objectAdapter, null);
+        } else {
+            final ObjectAdapter ref = recreateReference(assocData);
+            if (otoa.get(objectAdapter, InteractionInitiatedBy.FRAMEWORK) != ref) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("  association {} changed to {}", otoa, ref.getOid());
+                }
+                otoa.initAssociation(objectAdapter, ref);
+            }
+        }
+    }
+   
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
index 2f01ffa..af9930f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
@@ -26,31 +26,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
-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.services.ServicesInjector;
-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.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.memento.CollectionData;
-import org.apache.isis.core.runtime.memento.Data;
-import org.apache.isis.core.runtime.memento.ObjectData;
-import org.apache.isis.core.runtime.memento.StandaloneData;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.schema.common.v1.CollectionDto;
@@ -129,197 +110,4 @@ public class ObjectAdapterLegacy {
         
     }
     
-    // -- Memento --------------------------------------------------------
-
-    public static class __Memento {
-        
-        public static ObjectAdapter recreateObject(ObjectSpecification spec, Oid oid, Data data) {
-            ObjectAdapter adapter;
-            
-            if (spec.isParentedOrFreeCollection()) {
-
-                final Object recreatedPojo = getPersistenceSession().instantiateAndInjectServices(spec);
-                adapter = getPersistenceSession().addRecreatedPojoToCache(oid, recreatedPojo);
-                populateCollection(adapter, (CollectionData) data);
-
-            } else {
-                Assert.assertTrue("oid must be a RootOid representing an object because spec is not a collection and cannot be a value", oid instanceof RootOid);
-                RootOid typedOid = (RootOid) oid;
-
-                // remove adapter if already in the adapter manager maps, because
-                // otherwise would (as a side-effect) update the version to that of the current.
-                adapter = getPersistenceSession().lookupAdapterFor(typedOid);
-                if(adapter != null) {
-                    getPersistenceSession().removeAdapterFromCache(adapter);
-                }
-
-                // recreate an adapter for the original OID (with correct version)
-                adapter = getPersistenceSession().adapterFor(typedOid);
-
-                ObjectAdapterLegacy.__Memento.updateObject(adapter, data);
-            }
-
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("recreated object {}", adapter.getOid());
-            }
-            return adapter;
-        }
-
-        private static ObjectAdapter recreateReference(Data data) {
-         // handle values
-            if (data instanceof StandaloneData) {
-                final StandaloneData standaloneData = (StandaloneData) data;
-                return standaloneData.getAdapter();
-            }
-
-            // reference to entity
-
-            Oid oid = data.getOid();
-            Assert.assertTrue("can only create a reference to an entity", oid instanceof RootOid);
-
-            final RootOid rootOid = (RootOid) oid;
-            final ObjectAdapter referencedAdapter = getPersistenceSession().adapterFor(rootOid);
-
-            if (data instanceof ObjectData) {
-                if (rootOid.isTransient()) {
-                    updateObject(referencedAdapter, data);
-                }
-            }
-            return referencedAdapter;
-        }
-        
-        private static void updateObject(final ObjectAdapter adapter, final Data data) {
-            final Object oid = adapter.getOid();
-            if (oid != null && !oid.equals(data.getOid())) {
-                throw new IllegalArgumentException("This memento can only be used to update the ObjectAdapter with the Oid " + data.getOid() + " but is " + oid);
-            }
-            if (!(data instanceof ObjectData)) {
-                throw new IsisException("Expected an ObjectData but got " + data.getClass());
-            }
-
-            updateFieldsAndResolveState(adapter, data);
-
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("object updated {}", adapter.getOid());
-            }
-        }
-        
-        private static void populateCollection(final ObjectAdapter collectionAdapter, final CollectionData state) {
-            final ObjectAdapter[] initData = new ObjectAdapter[state.getElements().length];
-            int i = 0;
-            for (final Data elementData : state.getElements()) {
-                initData[i++] = recreateReference(elementData);
-            }
-            final CollectionFacet facet = collectionAdapter.getSpecification().getFacet(CollectionFacet.class);
-            facet.init(collectionAdapter, initData);
-        }
-        
-        private static void updateFieldsAndResolveState(final ObjectAdapter objectAdapter, final Data data) {
-
-            boolean dataIsTransient = data.getOid().isTransient();
-
-            if (!dataIsTransient) {
-                updateFields(objectAdapter, data);
-                objectAdapter.getOid().setVersion(data.getOid().getVersion());
-            } else if (objectAdapter.isTransient() && dataIsTransient) {
-                updateFields(objectAdapter, data);
-
-            } else if (objectAdapter.isParentedCollection()) {
-                // this branch is kind-a wierd, I think it's to handle aggregated adapters.
-                updateFields(objectAdapter, data);
-
-            } else {
-                final ObjectData od = (ObjectData) data;
-                if (od.containsField()) {
-                    throw new IsisException("Resolve state (for " + objectAdapter + ") inconsistent with fact that data exists for fields");
-                }
-            }
-        }
-        
-        private static void updateFields(final ObjectAdapter object, final Data state) {
-            final ObjectData od = (ObjectData) state;
-            final List<ObjectAssociation> fields = object.getSpecification().getAssociations(Contributed.EXCLUDED);
-            for (final ObjectAssociation field : fields) {
-                if (field.isNotPersisted()) {
-                    if (field.isOneToManyAssociation()) {
-                        continue;
-                    }
-                    if (field.containsFacet(PropertyOrCollectionAccessorFacet.class) && !field.containsFacet(PropertySetterFacet.class)) {
-                        LOG.debug("ignoring not-settable field {}", field.getName());
-                        continue;
-                    }
-                }
-                updateField(object, od, field);
-            }
-        }
-
-        private static void updateField(final ObjectAdapter objectAdapter, final ObjectData objectData, final ObjectAssociation objectAssoc) {
-            final Object fieldData = objectData.getEntry(objectAssoc.getId());
-
-            if (objectAssoc.isOneToManyAssociation()) {
-                updateOneToManyAssociation(objectAdapter, (OneToManyAssociation) objectAssoc, (CollectionData) fieldData);
-
-            } else if (objectAssoc.getSpecification().containsFacet(EncodableFacet.class)) {
-                final EncodableFacet facet = objectAssoc.getSpecification().getFacet(EncodableFacet.class);
-                final ObjectAdapter value = facet.fromEncodedString((String) fieldData);
-                ((OneToOneAssociation) objectAssoc).initAssociation(objectAdapter, value);
-
-            } else if (objectAssoc.isOneToOneAssociation()) {
-                updateOneToOneAssociation(objectAdapter, (OneToOneAssociation) objectAssoc, (Data) fieldData);
-            }
-        }
-
-        private static 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();
-            for (final ObjectAdapter adapter : facet.iterable(collection)) {
-                original.add(adapter);
-            }
-
-            final Data[] elements = collectionData.getElements();
-            for (final Data data : elements) {
-                final ObjectAdapter elementAdapter = recreateReference(data);
-                if (!facet.contains(collection, elementAdapter)) {
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("  association {} changed, added {}", otma, elementAdapter.getOid());
-                    }
-                    otma.addElement(objectAdapter, elementAdapter, InteractionInitiatedBy.FRAMEWORK);
-                } else {
-                    otma.removeElement(objectAdapter, elementAdapter, InteractionInitiatedBy.FRAMEWORK);
-                }
-            }
-
-            for (final ObjectAdapter element : original) {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("  association {} changed, removed {}", otma, element.getOid());
-                }
-                otma.removeElement(objectAdapter, element, InteractionInitiatedBy.FRAMEWORK);
-            }
-        }
-
-        private static void updateOneToOneAssociation(final ObjectAdapter objectAdapter, final OneToOneAssociation otoa, final Data assocData) {
-            if (assocData == null) {
-                otoa.initAssociation(objectAdapter, null);
-            } else {
-                final ObjectAdapter ref = recreateReference(assocData);
-                if (otoa.get(objectAdapter, InteractionInitiatedBy.FRAMEWORK) != ref) {
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("  association {} changed to {}", otoa, ref.getOid());
-                    }
-                    otoa.initAssociation(objectAdapter, ref);
-                }
-            }
-        }
-        
-        private static PersistenceSession getPersistenceSession() {
-            return IsisContext.getPersistenceSession().orElseThrow(_Exceptions::unexpectedCodeReach);
-        }
-
-
-        
-    }
-    
-    
-
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java
index 5463820..f81a169 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java
@@ -52,11 +52,11 @@ class RootAndCollectionAdapters implements Iterable<ObjectAdapter> {
 
     public RootAndCollectionAdapters(
             final ObjectAdapter parentAdapter,
-            final AdapterManager adapterManager) {
+            final ObjectAdapterContext_AdapterManager adapterManagerMixin) {
         Assert.assertNotNull(parentAdapter);
         this.rootAdapterOid = (RootOid) parentAdapter.getOid();
         this.parentAdapter = parentAdapter;
-        addCollectionAdapters(adapterManager);
+        addCollectionAdapters(adapterManagerMixin);
     }
 
     public ObjectAdapter getRootAdapter() {
@@ -96,10 +96,10 @@ class RootAndCollectionAdapters implements Iterable<ObjectAdapter> {
     // Helpers
     ////////////////////////////////////////////////////////////////////////
 
-    private void addCollectionAdapters(AdapterManager objectAdapterLookup) {
+    private void addCollectionAdapters(ObjectAdapterContext_AdapterManager adapterManagerMixin) {
         for (final OneToManyAssociation otma : parentAdapter.getSpecification().getCollections(Contributed.EXCLUDED)) {
             final ParentedCollectionOid collectionOid = new ParentedCollectionOid((RootOid) rootAdapterOid, otma);
-            final ObjectAdapter collectionAdapter = objectAdapterLookup.lookupAdapterFor(collectionOid);
+            final ObjectAdapter collectionAdapter = adapterManagerMixin.lookupAdapterFor(collectionOid);
             if (collectionAdapter != null) {
                 // collection adapters are lazily created and so there may not be one.
                 addCollectionAdapter(otma, collectionAdapter);
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapter.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapter.java
index afd9e0f..a87b80d 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapter.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapter.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.apache.wicket.util.convert.IConverter;
 
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -44,8 +45,11 @@ public class ConverterForObjectAdapter implements IConverter<ObjectAdapter> {
      */
     @Override
     public ObjectAdapter convertToObject(final String value, final Locale locale) {
-        final Oid oid = RootOid.deStringEncoded(value);
-        return getPersistenceSession().lookupAdapterFor(oid);
+        final RootOid rootOid = RootOid.deStringEncoded(value);
+        
+        //FIXME[ISIS-1976]
+        //return getPersistenceSession().lookupAdapterFor(rootOid);
+        throw _Exceptions.notImplemented();
     }
 
     /**
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
index 48db82b..ff3ce43 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
@@ -25,6 +25,7 @@ import com.google.common.base.Strings;
 
 import org.apache.wicket.util.convert.IConverter;
 
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
@@ -54,8 +55,11 @@ public class ConverterForObjectAdapterMemento implements IConverter<ObjectAdapte
             return null;
         }
         final Oid oid = RootOid.deStringEncoded(value);
-        final ObjectAdapter adapter = getPersistenceSession().lookupAdapterFor(oid);
-        return ObjectAdapterMemento.createOrNull(adapter);
+        
+        //FIXME[ISIS-1976]
+        //final ObjectAdapter adapter = getPersistenceSession().lookupAdapterFor(oid);
+        //return ObjectAdapterMemento.createOrNull(adapter);
+        throw _Exceptions.notImplemented();
     }
 
     /**


[isis] 07/07: ISIS-1976: moving responsibilities from PersistenceSession to ObjectAdapterProvider

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 074cecf4cc708006a9f83235415729bf01b3273f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 4 08:42:54 2018 +0200

    ISIS-1976: moving responsibilities from PersistenceSession to
    ObjectAdapterProvider
    
    introduces ObjectAdapterProvider.Delegating
    removes AdapterManager
    ports changes from DN5-plugin to DN-4 plugin
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../isis/core/metamodel/adapter/ObjectAdapter.java |   3 +-
 .../metamodel/adapter/ObjectAdapterProvider.java   |  44 ++
 .../adapter/concurrency/ConcurrencyChecking.java   | 104 ++++
 .../core/metamodel/adapter/mgr/AdapterManager.java | 164 ------
 .../PersistenceSessionServiceInternal.java         |  37 +-
 .../services/jdosupport/IsisJdoSupportDN4.java     |   2 +-
 .../system/persistence/IsisLifecycleListener.java  |   5 +-
 .../system/persistence/PersistenceSession4.java    | 569 ++-------------------
 .../persistence/PersistenceSession4_Decouple.java  | 213 ++++++++
 .../queries/PersistenceQueryProcessorAbstract.java |   3 +-
 .../WrapperFactoryDefaultTest_wrappedObject.java   |   8 +-
 ...FactoryDefaultTest_wrappedObject_transient.java |   8 +-
 .../services/jdosupport/IsisJdoSupportDN5.java     |   2 +-
 .../system/persistence/PersistenceSession5.java    | 247 +--------
 .../persistence/PersistenceSession5_Decouple.java  | 213 ++++++++
 .../runtime/persistence/adapter/PojoAdapter.java   |   4 +-
 .../changes/ChangedObjectsServiceInternal.java     |   4 +-
 .../system/persistence/PersistenceSession.java     |  61 +--
 .../system/persistence/PersistenceSessionBase.java |   8 -
 .../adaptermanager/ObjectAdapterContext.java       |  10 +-
 ...ObjectAdapterContext_ObjectAdapterProvider.java |  21 +-
 .../adaptermanager/RootAndCollectionAdapters.java  |   3 +-
 .../system/ObjectActionLayoutXmlDefaultTest.java   |  15 +-
 .../wicket/ConverterForObjectAdapterMemento.java   |   2 +-
 .../integration/wicket/WebRequestCycleForIsis.java |   6 +-
 .../wicket/model/mementos/ActionMemento.java       |   2 +-
 .../model/mementos/ObjectAdapterMemento.java       |   5 +-
 .../viewer/wicket/model/models/ActionModel.java    |   2 +-
 .../wicket/model/models/EntityCollectionModel.java |   2 +-
 .../viewer/wicket/model/models/EntityModel.java    |   2 +-
 .../viewer/wicket/model/models/ScalarModel.java    |   2 +-
 .../model/models/ScalarModelWithPending.java       |   2 +-
 .../viewer/wicket/model/models/ValueModel.java     |   2 +-
 .../actionresponse/ActionResultResponseType.java   |   4 +-
 .../entityactions/EntityActionLinkFactory.java     |   2 +-
 .../actionmenu/entityactions/LinkAndLabelUtil.java |   4 +-
 .../actionmenu/serviceactions/CssMenuItem.java     |   4 +-
 .../serviceactions/ServiceActionLinkFactory.java   |   2 +-
 .../collection/AssociatedWithActionsHelper.java    |   4 +-
 .../ui/components/collection/CollectionPanel.java  |   4 +-
 .../collection/bulk/BulkActionsLinkFactory.java    |   2 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   2 +-
 .../columns/ObjectAdapterToggleboxColumn.java      |   2 +-
 .../entity/EntityComponentFactoryAbstract.java     |   2 +-
 .../components/entity/fieldset/PropertyGroup.java  |   6 +-
 .../entity/icontitle/EntityIconAndTitlePanel.java  |   2 +-
 .../property/PropertyFormExecutorStrategy.java     |   4 +-
 .../PropertyEditPromptHeaderPanel.java             |   4 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |   2 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   4 +-
 .../scalars/ScalarPanelSelect2Abstract.java        |   4 +-
 .../scalars/reference/ReferencePanel.java          |   2 +-
 .../widgets/breadcrumbs/BreadcrumbPanel.java       |   4 +-
 .../entitysimplelink/EntityLinkSimplePanel.java    |   4 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |   8 +-
 .../ObjectAdapterMementoProviderAbstract.java      |   2 +-
 .../isis/viewer/wicket/ui/panels/FormAbstract.java |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   4 +-
 58 files changed, 770 insertions(+), 1089 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
index ddc4dfb..a17fac2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
@@ -30,7 +30,6 @@ import org.apache.isis.core.commons.lang.ClassExtensions;
 import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.commons.lang.MethodExtensions;
 import org.apache.isis.core.commons.lang.MethodUtil;
-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;
@@ -162,7 +161,7 @@ public interface ObjectAdapter extends Instance {
      * <p>
      * This id allows the object to added to, stored by,
      * and retrieved from the object store.  Objects can be looked up by their
-     * {@link Oid} from the {@link AdapterManager}.
+     * {@link Oid}.
      *
      * <p>
      * Note that standalone value objects ("foobar", or 5, or a date),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
index cb87353..92776da 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
@@ -18,8 +18,10 @@
  */
 package org.apache.isis.core.metamodel.adapter;
 
+import java.util.List;
 import java.util.function.Function;
 
+import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -31,6 +33,8 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
  *
  */
 public interface ObjectAdapterProvider {
+    
+    // -- INTERFACE
 
     /**
      * @return standalone (value) or root adapter
@@ -52,7 +56,47 @@ public interface ObjectAdapterProvider {
             final Function<ObjectSpecId, RootOid> rootOidFactory);
     
 
+    List<ObjectAdapter> getServices();
+    
+    
+    // -- FOR THOSE THAT IMPLEMENT THROUGH DELEGATION
     
+    public static interface Delegating extends ObjectAdapterProvider {
+        
+        @Programmatic
+        ObjectAdapterProvider getObjectAdapterProvider();
+        
+        @Programmatic
+        default ObjectAdapter adapterFor(Object domainObject) {
+            return getObjectAdapterProvider().adapterFor(domainObject);
+        }
+
+        @Programmatic
+        default ObjectAdapter adapterFor(
+                final Object pojo,
+                final ObjectAdapter parentAdapter,
+                OneToManyAssociation collection) {
+            return getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
+        }
+
+        @Programmatic
+        default ObjectSpecification specificationForViewModel(final Object viewModelPojo) {
+            return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
+        }
+
+        @Programmatic
+        default ObjectAdapter adapterForViewModel(
+                final Object viewModelPojo, 
+                final Function<ObjectSpecId, RootOid> rootOidFactory) {
+            return getObjectAdapterProvider().adapterForViewModel(viewModelPojo, rootOidFactory);
+        }
+        
+        @Programmatic
+        default List<ObjectAdapter> getServices() {
+            return getObjectAdapterProvider().getServices();
+        }
+        
+    }
     
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/concurrency/ConcurrencyChecking.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/concurrency/ConcurrencyChecking.java
new file mode 100644
index 0000000..355b4be
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/concurrency/ConcurrencyChecking.java
@@ -0,0 +1,104 @@
+package org.apache.isis.core.metamodel.adapter.concurrency;
+
+import java.util.concurrent.Callable;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+
+public enum ConcurrencyChecking {
+    NO_CHECK,
+    CHECK;
+
+    public static boolean isGloballyDisabled(IsisConfiguration configuration) {
+        final boolean concurrencyCheckingGloballyDisabled =
+                configuration.getBoolean("isis.persistor.disableConcurrencyChecking", false);
+        return concurrencyCheckingGloballyDisabled;
+    }
+    
+    
+    @Programmatic
+    public boolean isChecking() {
+        return this == CHECK;
+    }
+
+    public static ConcurrencyChecking concurrencyCheckingFor(SemanticsOf actionSemantics) {
+        return actionSemantics.isSafeInNature()
+                ? ConcurrencyChecking.NO_CHECK
+                        : ConcurrencyChecking.CHECK;
+    }
+
+    /**
+     * Provides a mechanism to temporarily disable concurrency checking.
+     *
+     * <p>
+     * A {@link ThreadLocal} is used because typically there is JDO/DataNucleus code between the Isis code
+     * that wishes to disable the concurrency checking and the code (an Isis callback) that needs to
+     * check if checking has been disabled.
+     */
+    private static ThreadLocal<ConcurrencyChecking> concurrencyChecking = new ThreadLocal<ConcurrencyChecking>(){
+        @Override
+        protected ConcurrencyChecking initialValue() {
+            return CHECK;
+        };
+    };
+
+    /**
+     * Whether concurrency checking is currently enabled or disabled.
+     */
+    public static boolean isCurrentlyEnabled() {
+        return concurrencyChecking.get().isChecking();
+    }
+
+    /**
+     * Allows a caller to temporarily disable concurrency checking for the current thread.
+     */
+    public static <T> T executeWithConcurrencyCheckingDisabled(final Callable<T> callable) {
+        ConcurrencyChecking prior = null;
+        try {
+            prior = disable();
+            return callable.call();
+        } catch(Exception ex) {
+            throw new RuntimeException(ex);
+        } finally {
+            reset(prior);
+        }
+    }
+
+    /**
+     * Recommended instead to call {@link #executeWithConcurrencyCheckingDisabled(Runnable)} or {@link #executeWithConcurrencyCheckingDisabled(Callable)}.
+     *
+     * <p>
+     *     If this method is used, then make sure to call {@link #reset(ConcurrencyChecking)} afterwards, using the value returned by this method.
+     * </p>
+     *
+     * @return the value of the {@link ConcurrencyChecking} thread-local prior to disabling it (to allow for nested calls).
+     */
+    public static ConcurrencyChecking disable() {
+        final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
+        ConcurrencyChecking.concurrencyChecking.set(ConcurrencyChecking.NO_CHECK);
+        return prior;
+    }
+
+    public static void reset(ConcurrencyChecking prior) {
+        if(prior == null) {
+            return;
+        }
+        ConcurrencyChecking.concurrencyChecking.set(prior);
+    }
+
+    /**
+     * Allows a caller to temporarily disable concurrency checking for the current thread.
+     */
+    public static void executeWithConcurrencyCheckingDisabled(final Runnable runnable) {
+        final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
+        try {
+            disable();
+            runnable.run();
+        } finally {
+            ConcurrencyChecking.concurrencyChecking.set(prior);
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
deleted file mode 100644
index 70ad13e..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *  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.metamodel.adapter.mgr;
-
-import java.util.concurrent.Callable;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.SemanticsOf;
-
-public interface AdapterManager /*extends ObjectAdapterProvider*/ {
-
-
-    enum ConcurrencyChecking {
-        NO_CHECK,
-        CHECK;
-
-        @Programmatic
-        public boolean isChecking() {
-            return this == CHECK;
-        }
-
-        public static ConcurrencyChecking concurrencyCheckingFor(SemanticsOf actionSemantics) {
-            return actionSemantics.isSafeInNature()
-                    ? ConcurrencyChecking.NO_CHECK
-                            : ConcurrencyChecking.CHECK;
-        }
-
-        /**
-         * Provides a mechanism to temporarily disable concurrency checking.
-         *
-         * <p>
-         * A {@link ThreadLocal} is used because typically there is JDO/DataNucleus code between the Isis code
-         * that wishes to disable the concurrency checking and the code (an Isis callback) that needs to
-         * check if checking has been disabled.
-         */
-        private static ThreadLocal<ConcurrencyChecking> concurrencyChecking = new ThreadLocal<ConcurrencyChecking>(){
-            @Override
-            protected ConcurrencyChecking initialValue() {
-                return CHECK;
-            };
-        };
-
-        /**
-         * Whether concurrency checking is currently enabled or disabled.
-         */
-        public static boolean isCurrentlyEnabled() {
-            return concurrencyChecking.get().isChecking();
-        }
-
-        /**
-         * Allows a caller to temporarily disable concurrency checking for the current thread.
-         */
-        public static <T> T executeWithConcurrencyCheckingDisabled(final Callable<T> callable) {
-            ConcurrencyChecking prior = null;
-            try {
-                prior = disable();
-                return callable.call();
-            } catch(Exception ex) {
-                throw new RuntimeException(ex);
-            } finally {
-                reset(prior);
-            }
-        }
-
-        /**
-         * Recommended instead to call {@link #executeWithConcurrencyCheckingDisabled(Runnable)} or {@link #executeWithConcurrencyCheckingDisabled(Callable)}.
-         *
-         * <p>
-         *     If this method is used, then make sure to call {@link #reset(ConcurrencyChecking)} afterwards, using the value returned by this method.
-         * </p>
-         *
-         * @return the value of the {@link ConcurrencyChecking} thread-local prior to disabling it (to allow for nested calls).
-         */
-        public static ConcurrencyChecking disable() {
-            final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
-            ConcurrencyChecking.concurrencyChecking.set(ConcurrencyChecking.NO_CHECK);
-            return prior;
-        }
-
-        public static void reset(ConcurrencyChecking prior) {
-            if(prior == null) {
-                return;
-            }
-            ConcurrencyChecking.concurrencyChecking.set(prior);
-        }
-
-        /**
-         * Allows a caller to temporarily disable concurrency checking for the current thread.
-         */
-        public static void executeWithConcurrencyCheckingDisabled(final Runnable runnable) {
-            final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
-            try {
-                disable();
-                runnable.run();
-            } finally {
-                ConcurrencyChecking.concurrencyChecking.set(prior);
-            }
-        }
-
-
-    }
-
-    // -- DEPRECATIONS
-
-//    /**
-//     * Enable RecreatableObjectFacet to 'temporarily' map an existing pojo to an oid.
-//     * @deprecated don't expose caching
-//     */
-//    @Programmatic @Deprecated
-//    ObjectAdapter addRecreatedPojoToCache(Oid oid, Object recreatedPojo);
-//
-//    /**
-//     * Enable RecreatableObjectFacet to remove a 'temporarily' mapped adapter for a pojo.
-//     * @deprecated don't expose caching
-//     */
-//    @Programmatic @Deprecated
-//    void removeAdapterFromCache(ObjectAdapter adapter);
-//
-//    
-//    /**
-//     * Gets the {@link ObjectAdapter adapter} for the specified domain object if
-//     * it exists in the identity map.
-//     *
-//     * <p>
-//     * Provided by the <tt>AdapterManager</tt> when used by framework.
-//     *
-//     * @param pojo
-//     *            - must not be <tt>null</tt>
-//     * @return adapter, or <tt>null</tt> if doesn't exist.
-//     * @deprecated don't expose caching
-//     */
-//    @Programmatic @Deprecated
-//    ObjectAdapter lookupAdapterFor(Object pojo);
-//
-//    /**
-//     * Gets the {@link ObjectAdapter adapter} for the {@link Oid} if it exists
-//     * in the identity map.
-//     *
-//     * @param oid
-//     *            - must not be <tt>null</tt>
-//     * @return adapter, or <tt>null</tt> if doesn't exist.
-//     * @deprecated don't expose caching
-//     */
-//    @Programmatic @Deprecated
-//    ObjectAdapter lookupAdapterFor(Oid oid);
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
index 933ef1e..506ca6e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
@@ -18,7 +18,6 @@ package org.apache.isis.core.metamodel.services.persistsession;
 
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
-import java.util.function.Function;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.query.Query;
@@ -29,44 +28,10 @@ import org.apache.isis.applib.services.xactn.Transaction;
 import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
 
-public interface PersistenceSessionServiceInternal extends ObjectAdapterProvider {
-
-    // -- ObjectAdapterProvider
-    
-    @Programmatic
-    ObjectAdapterProvider getObjectAdapterProvider();
-    
-    @Programmatic
-    default ObjectAdapter adapterFor(Object domainObject) {
-        return getObjectAdapterProvider().adapterFor(domainObject);
-    }
-
-    @Programmatic
-    default ObjectAdapter adapterFor(
-            final Object pojo,
-            final ObjectAdapter parentAdapter,
-            OneToManyAssociation collection) {
-        return getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
-    }
-
-    @Programmatic
-    default ObjectSpecification specificationForViewModel(final Object viewModelPojo) {
-        return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
-    }
-
-    @Programmatic
-    default ObjectAdapter adapterForViewModel(
-            final Object viewModelPojo, 
-            final Function<ObjectSpecId, RootOid> rootOidFactory) {
-        return getObjectAdapterProvider().adapterForViewModel(viewModelPojo, rootOidFactory);
-    }
-    
+public interface PersistenceSessionServiceInternal extends ObjectAdapterProvider.Delegating {
     
     // -- instantiate
 
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN4.java
index 6467953..f6a104f 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN4.java
@@ -37,7 +37,7 @@ 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.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.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;
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java
index cf2ef6f..9713474 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java
@@ -34,6 +34,8 @@ import com.google.common.collect.Maps;
 
 import org.datanucleus.enhancement.Persistable;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+
 public class IsisLifecycleListener
 implements AttachLifecycleListener, ClearLifecycleListener, CreateLifecycleListener, DeleteLifecycleListener,
 DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLifecycleListener,
@@ -45,13 +47,12 @@ SuspendableListener {
     interface PersistenceSessionLifecycleManagement {
 
         void ensureRootObject(Persistable pojo);
-        void initializeMapAndCheckConcurrency(Persistable pojo);
+        ObjectAdapter initializeMapAndCheckConcurrency(Persistable pojo);
 
         void enlistCreatedAndRemapIfRequiredThenInvokeIsisInvokePersistingOrUpdatedCallback(Persistable pojo);
         void invokeIsisPersistingCallback(Persistable pojo);
         void enlistUpdatingAndInvokeIsisUpdatingCallback(Persistable pojo);
         void enlistDeletingAndInvokeIsisRemovingCallbackFacet(Persistable pojo);
-        //ObjectAdapter getAdapterFor(Persistable pojo);
     }
 
     private final PersistenceSessionLifecycleManagement persistenceSession;
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
index ecf5bef..a758032 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
@@ -19,8 +19,6 @@
 package org.apache.isis.core.runtime.system.persistence;
 
 import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-import static org.apache.isis.commons.internal.functions._Predicates.equalTo;
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
 
 import java.lang.reflect.Array;
 import java.lang.reflect.Modifier;
@@ -32,7 +30,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.UUID;
-import java.util.function.Function;
 
 import javax.jdo.FetchGroup;
 import javax.jdo.FetchPlan;
@@ -58,13 +55,13 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 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;
@@ -87,7 +84,6 @@ import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFac
 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.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
@@ -110,6 +106,7 @@ import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllIns
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 import org.apache.isis.core.runtime.services.RequestScopedService;
 import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext.MementoRecreateObjectSupport;
 import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
@@ -132,6 +129,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession4.class);
     private ObjectAdapterContext objectAdapterContext;
+    private PersistenceSession4_Decouple mixin;
 
     /**
      * Initialize the object store so that calls to this object store access
@@ -160,8 +158,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             LOG.debug("opening {}", this);
         }
 
-        objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
-
         persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
 
         final IsisLifecycleListener.PersistenceSessionLifecycleManagement psLifecycleMgmt = this;
@@ -175,7 +171,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                 PersistenceQueryFindUsingApplibQueryDefault.class,
                 new PersistenceQueryFindUsingApplibQueryProcessor(this));
 
-        initServices();
+        objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
+        mixin = new PersistenceSession4_Decouple(this, objectAdapterContext);
 
         // tell the proxy of all request-scoped services to instantiate the underlying
         // services, store onto the thread-local and inject into them...
@@ -225,25 +222,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         }
     }
 
-    /**
-     * Creates {@link ObjectAdapter adapters} for the service list, ensuring that these are mapped correctly,
-     * and have the same OIDs as in any previous sessions.
-     * 
-     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
-     */
-    @Deprecated
-    private void initServices() {
-        final List<Object> registeredServices = servicesInjector.getRegisteredServices();
-        for (final Object service : registeredServices) {
-            final ObjectAdapter serviceAdapter = adapterFor(service);
-
-            // remap as Persistent if required
-            if (serviceAdapter.getOid().isTransient()) {
-                objectAdapterContext.remapAsPersistent(serviceAdapter, null, this);
-            }
-        }
-    }
-
     private Command createCommand() {
         final Command command = commandService.create();
 
@@ -369,9 +347,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         interaction.clear();
     }
 
-
-
-
     // -- QuerySubmitter impl, findInstancesInTransaction
     @Override
     public <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query) {
@@ -711,7 +686,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
         Objects.requireNonNull(oid);
 
-        final ObjectAdapter adapter = lookupAdapterFor(oid);
+        final ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(oid);
         if (adapter != null) {
             return adapter;
         }
@@ -723,7 +698,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                         LOG.debug("getObject; oid={}", oid);
 
                         final Object pojo = loadPersistentPojo(oid);
-                        return addRecreatedPojoToCache(oid, pojo);
+                        return objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
                     }
                 });
     }
@@ -733,7 +708,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     // -- loadPersistentPojo
 
-    private Object loadPersistentPojo(final RootOid rootOid) {
+    //TODO[ISIS-1976] used by mixin
+    Object loadPersistentPojo(final RootOid rootOid) {
 
         Object result;
         try {
@@ -765,7 +741,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return result;
     }
 
-    private Map<RootOid,Object> loadPersistentPojos(final List<RootOid> rootOids) {
+    //TODO[ISIS-1976] used by mixin
+    Map<RootOid,Object> loadPersistentPojos(final List<RootOid> rootOids) {
 
         if(rootOids.isEmpty()) {
             return zip(rootOids, Collections.emptyList());
@@ -828,21 +805,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
 
-
-    // -- lazilyLoaded
-
-    private ObjectAdapter mapPersistent(final Persistable pojo) {
-        if (persistenceManager.getObjectId(pojo) == null) {
-            return null;
-        }
-        final RootOid oid = createPersistentOrViewModelOid(pojo);
-        final ObjectAdapter adapter = addRecreatedPojoToCache(oid, pojo);
-        return adapter;
-    }
-
-
-
-
     // -- refreshRootInTransaction, refreshRoot, resolve
 
     /**
@@ -941,7 +903,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                 makePersistentTransactionAssumed(adapter);
 
                 // clear out the map of transient -> persistent
-                PersistenceSession4.this.persistentByTransient.clear();
+                // already empty // PersistenceSession5.this.persistentByTransient.clear();
             }
 
         });
@@ -1070,159 +1032,18 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         persistenceManager.flush();
     }
 
-
-    // -- getAggregateRoot, remappedFrom
-
-    private Map<Oid, Oid> persistentByTransient = _Maps.newHashMap();
+    // -- getAggregateRoot
 
     @Override
     public ObjectAdapter getAggregateRoot(final ParentedCollectionOid collectionOid) {
         final Oid rootOid = collectionOid.getRootOid();
-        ObjectAdapter rootadapter = lookupAdapterFor(rootOid);
-        if(rootadapter == null) {
-            final Oid parentOidNowPersisted = remappedFrom(rootOid);
-            rootadapter = lookupAdapterFor(parentOidNowPersisted);
-        }
+        ObjectAdapter rootadapter = objectAdapterContext.lookupAdapterFor(rootOid);
         return rootadapter;
     }
 
-    /**
-     * 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);
-    }
-
     // -- AdapterManager implementation
 
     @Override
-    public ObjectAdapter lookupAdapterFor(final Object pojo) {
-        Objects.requireNonNull(pojo);
-
-        return objectAdapterContext.lookupAdapterByPojo(pojo);  
-    }
-
-    @Override
-    public ObjectAdapter lookupAdapterFor(final Oid oid) {
-        Objects.requireNonNull(oid);
-        ensureMapsConsistent(oid);
-
-        return objectAdapterContext.lookupAdapterById(oid);
-    }
-
-
-    private ObjectAdapter existingOrValueAdapter(Object pojo) {
-
-        // attempt to locate adapter for the pojo
-        ObjectAdapter adapter = lookupAdapterFor(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 = objectAdapterContext.getFactories().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.
-     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
-     */
-    @Deprecated
-    private void ensureMapsConsistent(final Oid oid) {
-        Objects.requireNonNull(oid);
-
-        final ObjectAdapter adapter = objectAdapterContext.lookupAdapterById(oid);
-        if (adapter == null) {
-            return;
-        }
-        ensureOidAdapterMapConsistent(adapter);
-        ensurePojoAdapterMapConsistent(adapter);
-    }
-
-    private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
-        final Object adapterPojo = adapter.getObject();
-        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterByPojo(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 = objectAdapterContext.lookupAdapterById(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, equalTo(adapterAccordingToMap),
-                ()->"mismatch in "
-                        + mapName
-                        + ": provided adapter's OID: " + adapterOid + ", \n"
-                        + "but map's adapter's OID was: " + adapterAccordingToMap.getOid());
-    }
-
-    @Override
     public ObjectAdapter adapterForAny(RootOid rootOid) {
 
         final ObjectSpecId specId = rootOid.getObjectSpecId();
@@ -1259,180 +1080,23 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public Map<RootOid, ObjectAdapter> adaptersFor(final List<RootOid> rootOids) {
-        return adaptersFor(rootOids, ConcurrencyChecking.NO_CHECK);
-    }
-
-    private Map<RootOid,ObjectAdapter> adaptersFor(
+    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 = lookupAdapterFor(rootOid);
-            // handle view models or transient
-            if (adapter == null) {
-                if (rootOid.isTransient() || rootOid.isViewModel()) {
-                    final Object pojo = recreatePojoTransientOrViewModel(rootOid);
-                    adapter = addRecreatedPojoToCache(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 = addRecreatedPojoToCache(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 mixin.adaptersFor(rootOids, concurrencyChecking);
         }
 
-        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>
-     */
-    @Override
-    public ObjectAdapter adapterFor(final RootOid rootOid) {
-        return adapterFor(rootOid, ConcurrencyChecking.NO_CHECK);
-    }
-
-
-    /**
-     * Either returns an existing {@link ObjectAdapter adapter} (as per
-     * {@link #lookupAdapterFor(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.
-     */
     @Override
     public ObjectAdapter adapterFor(
             final RootOid rootOid,
             final ConcurrencyChecking concurrencyChecking) {
 
-        // attempt to locate adapter for the Oid
-        ObjectAdapter adapter = lookupAdapterFor(rootOid);
-        if (adapter == null) {
-            // else recreate
-            try {
-                final Object pojo;
-                if(rootOid.isTransient() || rootOid.isViewModel()) {
-                    pojo = recreatePojoTransientOrViewModel(rootOid);
-                } else {
-                    pojo = loadPersistentPojo(rootOid);
-                }
-                adapter = addRecreatedPojoToCache(rootOid, pojo);
-            } catch(ObjectNotFoundException ex) {
-                throw ex; // just rethrow
-            } catch(RuntimeException ex) {
-                throw new PojoRecreationException(rootOid, ex);
+        return mixin.adapterFor(rootOid, concurrencyChecking);
             }
-        }
-
-        // 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) {
+    //TODO[ISIS-1976] used by mixin
+    Object recreatePojoTransientOrViewModel(final RootOid rootOid) {
         final ObjectSpecification spec =
                 specificationLoader.lookupBySpecId(rootOid.getObjectSpecId());
         final Object pojo;
@@ -1449,168 +1113,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return pojo;
     }
 
-    @Override
-    public ObjectAdapter adapterFor(final Object pojo) {
-
-        if(pojo == null) {
-            return null;
-        }
-        final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo);
-        if(existingOrValueAdapter != null) {
-            return existingOrValueAdapter;
-        }
-
-
-        // Creates a new transient root {@link ObjectAdapter adapter} for the supplied domain
-        final RootOid rootOid = createTransientOrViewModelOid(pojo);
-        final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
-
-        return mapAndInjectServices(newAdapter);
-    }
-
-    @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;
-        }
-
-        ensureMapsConsistent(parentAdapter);
-        
-        // the List, Set etc. instance gets wrapped in its own adapter
-        final ObjectAdapter newAdapter = objectAdapterContext.getFactories()
-                .createCollectionAdapter(pojo, parentAdapter, collection);
-
-        return mapAndInjectServices(newAdapter);
-    }
-
-
-
-
-    /**
-     * Either returns an existing {@link ObjectAdapter adapter} (as per
-     * {@link #lookupAdapterFor(Object)} or {@link #lookupAdapterFor(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 addRecreatedPojoToCache(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 = lookupAdapterFor(recreatedPojo);
-        if (adapterLookedUpByPojo != null) {
-            return adapterLookedUpByPojo;
-        }
-
-        // attempt to locate adapter for the Oid
-        final ObjectAdapter adapterLookedUpByOid = lookupAdapterFor(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 removeAdapterFromCache(final ObjectAdapter adapter) {
-        ensureMapsConsistent(adapter);
-        objectAdapterContext.removeAdapter(adapter);
-    }
-
-
-    /**
-     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
-     */
-    @Deprecated
-    private void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
-        removeAdapterFromCache(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 = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
-        } else /*if (oid instanceof CollectionOid)*/ {
-            final ParentedCollectionOid collectionOid = (ParentedCollectionOid) oid;
-            createdAdapter = objectAdapterContext.getFactories().createCollectionAdapter(pojo, collectionOid);
-        }
-        return createdAdapter;
-    }
-
-
-
-    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, objectAdapterContext.containsAdapterForPojo(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;
-        }
-
-        objectAdapterContext.addAdapterHonoringSpecImmutability(pojo, adapter);
-
-        // must inject after mapping, otherwise infinite loop
-        servicesInjector.injectServicesInto(pojo);
-
-        return adapter;
-    }
-
-
-
-
-
     // -- TransactionManager delegate methods
     protected IsisTransaction getCurrentTransaction() {
         return transactionManager.getCurrentTransaction();
@@ -1630,7 +1132,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public void initializeMapAndCheckConcurrency(final Persistable pojo) {
+    public ObjectAdapter initializeMapAndCheckConcurrency(final Persistable pojo) {
         final Persistable pc = pojo;
 
         // need to do eagerly, because (if a viewModel then) a
@@ -1640,7 +1142,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         final Version datastoreVersion = getVersionIfAny(pc);
 
         final RootOid originalOid;
-        ObjectAdapter adapter = lookupAdapterFor(pojo);
+        ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(pojo);
         if (adapter != null) {
             ensureRootObject(pojo);
             originalOid = (RootOid) adapter.getOid();
@@ -1648,7 +1150,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             final Version originalVersion = adapter.getVersion();
 
             // sync the pojo held by the adapter with that just loaded
-            remapRecreatedPojo(adapter, pojo);
+            objectAdapterContext.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)
@@ -1676,11 +1178,11 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
             // it appears to be possible that there is already an adapter for this Oid,
             // ie from ObjectStore#resolveImmediately()
-            adapter = lookupAdapterFor(originalOid);
+            adapter = objectAdapterContext.lookupAdapterFor(originalOid);
             if (adapter != null) {
-                remapRecreatedPojo(adapter, pojo);
+                objectAdapterContext.remapRecreatedPojo(adapter, pojo);
             } else {
-                adapter = addRecreatedPojoToCache(originalOid, pojo);
+                adapter = objectAdapterContext.addRecreatedPojoToCache(originalOid, pojo);
 
                 CallbackFacet.Util.callCallback(adapter, LoadedCallbackFacet.class);
                 postLifecycleEventIfRequired(adapter, LoadedLifecycleEventFacet.class);
@@ -1688,6 +1190,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         }
 
         adapter.setVersion(datastoreVersion);
+
+        return objectAdapterContext.lookupAdapterFor(pojo);
     }
 
     // -- create...Oid (main API)
@@ -1695,7 +1199,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      * Create a new {@link Oid#isTransient() transient} {@link Oid} for the
      * supplied pojo, uniquely distinguishable from any other {@link Oid}.
      */
-    private final RootOid createTransientOrViewModelOid(final Object pojo) {
+    @Override
+    public final RootOid createTransientOrViewModelOid(final Object pojo) {
         return newIdentifier(pojo, Type.TRANSIENT);
     }
 
@@ -1764,7 +1269,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      */
     @Override
     public void invokeIsisPersistingCallback(final Persistable pojo) {
-        final ObjectAdapter adapter = lookupAdapterFor(pojo);
+        final ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(pojo);
         if (adapter == null) {
             // not expected.
             return;
@@ -1825,7 +1330,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     @Override
     public void enlistUpdatingAndInvokeIsisUpdatingCallback(final Persistable pojo) {
-        ObjectAdapter adapter = lookupAdapterFor(pojo);
+        ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(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
@@ -1834,7 +1339,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             // 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);
+            adapter = objectAdapterContext.addPersistentToCache(pojo);
             if (adapter == null) {
                 throw new RuntimeException(
                         "DN could not find objectId for pojo (unexpected) and so could not map into Isis; pojo=["
@@ -1947,13 +1452,13 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
-        return objectAdapterContext.specificationForViewModel(viewModelPojo);
+    public MementoRecreateObjectSupport mementoSupport() {
+        return objectAdapterContext.mementoSupport();
     }
 
     @Override
-    public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
-        return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
+    public ObjectAdapterProvider getObjectAdapterProvider() {
+        return objectAdapterContext.getObjectAdapterProvider();
     }
     
 }
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4_Decouple.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4_Decouple.java
new file mode 100644
index 0000000..de33ef0
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4_Decouple.java
@@ -0,0 +1,213 @@
+/*
+ *  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.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+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.runtime.persistence.ObjectNotFoundException;
+import org.apache.isis.core.runtime.persistence.PojoRecreationException;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
+
+class PersistenceSession4_Decouple  {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession4_Decouple.class);
+    private final PersistenceSession4 holder;
+    private final ObjectAdapterContext objectAdapterContext;
+    private final AuthenticationSession authenticationSession;
+    private final boolean concurrencyCheckingGloballyEnabled;
+
+    protected PersistenceSession4_Decouple(PersistenceSession4 holder, ObjectAdapterContext objectAdapterContext) {
+        this.holder = holder;
+        this.objectAdapterContext = objectAdapterContext;
+        this.authenticationSession = holder.getAuthenticationSession();
+        this.concurrencyCheckingGloballyEnabled = !ConcurrencyChecking.isGloballyDisabled(holder.getConfiguration());
+    }
+
+    /**
+     * Either returns an existing {@link ObjectAdapter adapter} (as per
+     * {@link #lookupAdapterFor(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 = objectAdapterContext.lookupAdapterFor(rootOid);
+        if (adapter == null) {
+            // else recreate
+            try {
+                final Object pojo;
+                if(rootOid.isTransient() || rootOid.isViewModel()) {
+                    pojo = holder.recreatePojoTransientOrViewModel(rootOid);
+                } else {
+                    pojo = holder.loadPersistentPojo(rootOid);
+                }
+                adapter = objectAdapterContext.addRecreatedPojoToCache(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
+        syncVersion(concurrencyChecking, adapter, rootOid);
+
+        return adapter;
+
+    }
+    
+    protected 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 = objectAdapterContext.lookupAdapterFor(rootOid);
+            // handle view models or transient
+            if (adapter == null) {
+                if (rootOid.isTransient() || rootOid.isViewModel()) {
+                    final Object pojo = holder.recreatePojoTransientOrViewModel(rootOid);
+                    adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+                    syncVersion(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 = holder.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 = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+                    adapterByOid.put(rootOid, adapter);
+                } catch(ObjectNotFoundException ex) {
+                    throw ex; // just rethrow
+                } catch(RuntimeException ex) {
+                    throw new PojoRecreationException(rootOid, ex);
+                }
+                syncVersion(concurrencyChecking, adapter, rootOid);
+            } else {
+                // null indicates it couldn't be loaded
+                // do nothing here...
+            }
+        }
+
+        return adapterByOid;
+    }
+
+    private void syncVersion(
+            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);
+                }
+            }
+        }
+    }
+
+
+
+
+}
+
+
+
diff --git a/core/plugins/jdo-datanucleus-4/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
index b121d26..e7a7182 100644
--- a/core/plugins/jdo-datanucleus-4/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
@@ -55,8 +55,7 @@ implements PersistenceQueryProcessor<T> {
             ObjectAdapter adapter;
             if(pojo instanceof Persistable) {
                 // an entity
-                persistenceSession.initializeMapAndCheckConcurrency((Persistable) pojo);
-                adapter = persistenceSession.lookupAdapterFor(pojo);
+                adapter = persistenceSession.initializeMapAndCheckConcurrency((Persistable) pojo);
             } else {
                 // a value type
                 adapter = persistenceSession.adapterFor(pojo);
diff --git a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
index 7885ba4..f343937 100644
--- a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
+++ b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
@@ -40,7 +40,7 @@ import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
@@ -87,7 +87,7 @@ public class WrapperFactoryDefaultTest_wrappedObject {
     public ExpectedException expectedException = ExpectedException.none();
     
     @Mock
-    private AdapterManager mockAdapterManager;
+    private ObjectAdapterProvider mockAdapterManager;
     @Mock
     private AuthenticationSessionProvider mockAuthenticationSessionProvider;
     @Mock
@@ -210,8 +210,8 @@ public class WrapperFactoryDefaultTest_wrappedObject {
                 allowing(mockAuthenticationSessionProvider).getAuthenticationSession();
                 will(returnValue(session));
 
-                allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
-                will(returnValue(mockEmployeeAdapter));
+//                allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
+//                will(returnValue(mockEmployeeAdapter));
 
                 allowing(mockAdapterManager).adapterFor(employeeDO);
                 will(returnValue(mockEmployeeAdapter));
diff --git a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java
index b1dce48..1e4385d 100644
--- a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java
+++ b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java
@@ -43,7 +43,7 @@ import org.apache.isis.applib.services.wrapper.events.PropertyVisibilityEvent;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.consent.Allow;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -79,7 +79,7 @@ public class WrapperFactoryDefaultTest_wrappedObject_transient {
     public final JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
     @Mock
-    private AdapterManager mockAdapterManager;
+    private ObjectAdapterProvider mockAdapterManager;
     @Mock
     private AuthenticationSessionProvider mockAuthenticationSessionProvider;
     @Mock
@@ -159,8 +159,8 @@ public class WrapperFactoryDefaultTest_wrappedObject_transient {
                 allowing(mockDeploymentCategoryProvider).getDeploymentCategory();
                 will(returnValue(DeploymentCategory.PRODUCTION));
 
-                allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
-                will(returnValue(mockEmployeeAdapter));
+//                allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
+//                will(returnValue(mockEmployeeAdapter));
 
                 allowing(mockAdapterManager).adapterFor(employeeDO);
                 will(returnValue(mockEmployeeAdapter));
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
index 7446265..f418f65 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
@@ -39,7 +39,7 @@ 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.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.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;
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index f10fb70..e5bc65c 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -30,7 +30,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.UUID;
-import java.util.function.Function;
 
 import javax.jdo.FetchGroup;
 import javax.jdo.FetchPlan;
@@ -56,15 +55,13 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 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;
@@ -131,6 +128,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5.class);
     private ObjectAdapterContext objectAdapterContext;
+    private PersistenceSession5_Decouple mixin;
 
     /**
      * Initialize the object store so that calls to this object store access
@@ -171,8 +169,9 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         persistenceQueryProcessorByClass.put(
                 PersistenceQueryFindUsingApplibQueryDefault.class,
                 new PersistenceQueryFindUsingApplibQueryProcessor(this));
-        
+
         objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
+        mixin = new PersistenceSession5_Decouple(this, objectAdapterContext);
 
         // tell the proxy of all request-scoped services to instantiate the underlying
         // services, store onto the thread-local and inject into them...
@@ -221,20 +220,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             }
         }
     }
-    
-    @Override
-    public List<ObjectAdapter> getServices() {
-        final List<Object> services = servicesInjector.getRegisteredServices();
-        final List<ObjectAdapter> serviceAdapters = _Lists.newArrayList();
-        for (final Object servicePojo : services) {
-            ObjectAdapter serviceAdapter = objectAdapterContext.lookupAdapterFor(servicePojo);
-            if(serviceAdapter == null) {
-                throw new IllegalStateException("ObjectAdapter for service " + servicePojo + " does not exist?!?");
-            }
-            serviceAdapters.add(serviceAdapter);
-        }
-        return serviceAdapters;
-    }
 
     private Command createCommand() {
         final Command command = commandService.create();
@@ -717,7 +702,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     // -- loadPersistentPojo
 
-    private Object loadPersistentPojo(final RootOid rootOid) {
+    //TODO[ISIS-1976] used by mixin
+    Object loadPersistentPojo(final RootOid rootOid) {
 
         Object result;
         try {
@@ -749,7 +735,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return result;
     }
 
-    private Map<RootOid,Object> loadPersistentPojos(final List<RootOid> rootOids) {
+    //TODO[ISIS-1976] used by mixin
+    Map<RootOid,Object> loadPersistentPojos(final List<RootOid> rootOids) {
 
         if(rootOids.isEmpty()) {
             return zip(rootOids, Collections.emptyList());
@@ -812,19 +799,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
 
-
-    // -- lazilyLoaded
-//
-//    private ObjectAdapter addPersistentToCache(final Persistable pojo) {
-//        if (persistenceManager.getObjectId(pojo) == null) {
-//            return null;
-//        }
-//        final RootOid oid = createPersistentOrViewModelOid(pojo);
-//        final ObjectAdapter adapter = objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
-//        return adapter;
-//    }
-
-
     // -- refreshRootInTransaction, refreshRoot, resolve
 
     /**
@@ -1098,180 +1072,23 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public Map<RootOid, ObjectAdapter> adaptersFor(final List<RootOid> rootOids) {
-        return adaptersFor(rootOids, AdapterManager.ConcurrencyChecking.NO_CHECK);
-    }
-
-    private Map<RootOid,ObjectAdapter> adaptersFor(
-            final List<RootOid> rootOids,
-            final AdapterManager.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 = objectAdapterContext.lookupAdapterFor(rootOid);
-            // handle view models or transient
-            if (adapter == null) {
-                if (rootOid.isTransient() || rootOid.isViewModel()) {
-                    final Object pojo = recreatePojoTransientOrViewModel(rootOid);
-                    adapter = objectAdapterContext.addRecreatedPojoToCache(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 = objectAdapterContext.addRecreatedPojoToCache(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...
-            }
-        }
+    public Map<RootOid, ObjectAdapter> adaptersFor(
+            final List<RootOid> rootOids, 
+            final ConcurrencyChecking concurrencyChecking) {
 
-        return adapterByOid;
+        return mixin.adaptersFor(rootOids, concurrencyChecking);
     }
 
-    /**
-     * 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>
-     */
-    @Override
-    public ObjectAdapter adapterFor(final RootOid rootOid) {
-        return adapterFor(rootOid, AdapterManager.ConcurrencyChecking.NO_CHECK);
-    }
-
-
-    /**
-     * Either returns an existing {@link ObjectAdapter adapter} (as per
-     * {@link #lookupAdapterFor(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.
-     */
     @Override
     public ObjectAdapter adapterFor(
             final RootOid rootOid,
-            final AdapterManager.ConcurrencyChecking concurrencyChecking) {
-
-        // attempt to locate adapter for the Oid
-        ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(rootOid);
-        if (adapter == null) {
-            // else recreate
-            try {
-                final Object pojo;
-                if(rootOid.isTransient() || rootOid.isViewModel()) {
-                    pojo = recreatePojoTransientOrViewModel(rootOid);
-                } else {
-                    pojo = loadPersistentPojo(rootOid);
-                }
-                adapter = objectAdapterContext.addRecreatedPojoToCache(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);
+            final ConcurrencyChecking concurrencyChecking) {
 
-        return adapter;
+        return mixin.adapterFor(rootOid, concurrencyChecking);
     }
 
-
-
-    private void sync(
-            final AdapterManager.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 && AdapterManager.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) {
+    //TODO[ISIS-1976] used by mixin
+    Object recreatePojoTransientOrViewModel(final RootOid rootOid) {
         final ObjectSpecification spec =
                 specificationLoader.lookupBySpecId(rootOid.getObjectSpecId());
         final Object pojo;
@@ -1288,16 +1105,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return pojo;
     }
 
-    /**
-     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
-     */
-    @Deprecated
-    private void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
-        objectAdapterContext.removeAdapterFromCache(adapter);
-        adapter.replacePojo(pojo);
-        objectAdapterContext.mapAndInjectServices(adapter);
-    }
-
     // -- TransactionManager delegate methods
     protected IsisTransaction getCurrentTransaction() {
         return transactionManager.getCurrentTransaction();
@@ -1334,7 +1141,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             final Version originalVersion = adapter.getVersion();
 
             // sync the pojo held by the adapter with that just loaded
-            remapRecreatedPojo(adapter, pojo);
+            objectAdapterContext.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)
@@ -1346,7 +1153,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                     otherVersion != null &&
                     thisVersion.different(otherVersion)) {
 
-                if (AdapterManager.ConcurrencyChecking.isCurrentlyEnabled()) {
+                if (ConcurrencyChecking.isCurrentlyEnabled()) {
                     LOG.info("concurrency conflict detected on {} ({})", thisOid, otherVersion);
                     final String currentUser = authenticationSession.getUserName();
                     final ConcurrencyException abortCause = new ConcurrencyException(currentUser, thisOid,
@@ -1364,7 +1171,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             // ie from ObjectStore#resolveImmediately()
             adapter = objectAdapterContext.lookupAdapterFor(originalOid);
             if (adapter != null) {
-                remapRecreatedPojo(adapter, pojo);
+                objectAdapterContext.remapRecreatedPojo(adapter, pojo);
             } else {
                 adapter = objectAdapterContext.addRecreatedPojoToCache(originalOid, pojo);
 
@@ -1374,7 +1181,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         }
 
         adapter.setVersion(datastoreVersion);
-        
+
         return objectAdapterContext.lookupAdapterFor(pojo);
     }
 
@@ -1634,26 +1441,16 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
-        return objectAdapterContext.specificationForViewModel(viewModelPojo);
-    }
-
-    @Override
-    public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
-        return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
-    }
-
-    @Override
     public MementoRecreateObjectSupport mementoSupport() {
         return objectAdapterContext.mementoSupport();
     }
-    
+
     @Override
     public ObjectAdapterProvider getObjectAdapterProvider() {
         return objectAdapterContext.getObjectAdapterProvider();
     }
 
-    
+
 }
 
 
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_Decouple.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_Decouple.java
new file mode 100644
index 0000000..492857b
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_Decouple.java
@@ -0,0 +1,213 @@
+/*
+ *  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.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+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.runtime.persistence.ObjectNotFoundException;
+import org.apache.isis.core.runtime.persistence.PojoRecreationException;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
+
+class PersistenceSession5_Decouple  {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5_Decouple.class);
+    private final PersistenceSession5 holder;
+    private final ObjectAdapterContext objectAdapterContext;
+    private final AuthenticationSession authenticationSession;
+    private final boolean concurrencyCheckingGloballyEnabled;
+
+    protected PersistenceSession5_Decouple(PersistenceSession5 holder, ObjectAdapterContext objectAdapterContext) {
+        this.holder = holder;
+        this.objectAdapterContext = objectAdapterContext;
+        this.authenticationSession = holder.getAuthenticationSession();
+        this.concurrencyCheckingGloballyEnabled = !ConcurrencyChecking.isGloballyDisabled(holder.getConfiguration());
+    }
+
+    /**
+     * Either returns an existing {@link ObjectAdapter adapter} (as per
+     * {@link #lookupAdapterFor(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 = objectAdapterContext.lookupAdapterFor(rootOid);
+        if (adapter == null) {
+            // else recreate
+            try {
+                final Object pojo;
+                if(rootOid.isTransient() || rootOid.isViewModel()) {
+                    pojo = holder.recreatePojoTransientOrViewModel(rootOid);
+                } else {
+                    pojo = holder.loadPersistentPojo(rootOid);
+                }
+                adapter = objectAdapterContext.addRecreatedPojoToCache(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
+        syncVersion(concurrencyChecking, adapter, rootOid);
+
+        return adapter;
+
+    }
+    
+    protected 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 = objectAdapterContext.lookupAdapterFor(rootOid);
+            // handle view models or transient
+            if (adapter == null) {
+                if (rootOid.isTransient() || rootOid.isViewModel()) {
+                    final Object pojo = holder.recreatePojoTransientOrViewModel(rootOid);
+                    adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+                    syncVersion(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 = holder.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 = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+                    adapterByOid.put(rootOid, adapter);
+                } catch(ObjectNotFoundException ex) {
+                    throw ex; // just rethrow
+                } catch(RuntimeException ex) {
+                    throw new PojoRecreationException(rootOid, ex);
+                }
+                syncVersion(concurrencyChecking, adapter, rootOid);
+            } else {
+                // null indicates it couldn't be loaded
+                // do nothing here...
+            }
+        }
+
+        return adapterByOid;
+    }
+
+    private void syncVersion(
+            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);
+                }
+            }
+        }
+    }
+
+
+
+
+}
+
+
+
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index 3a17eeb..91a32a7 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -26,7 +26,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.exceptions.IsisException;
 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.concurrency.ConcurrencyChecking;
 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;
@@ -203,7 +203,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
                 otherVersion != null &&
                 thisVersion.different(otherVersion)) {
 
-            if(AdapterManager.ConcurrencyChecking.isCurrentlyEnabled()) {
+            if(ConcurrencyChecking.isCurrentlyEnabled()) {
                 LOG.info("concurrency conflict detected on {} ({})", thisOid, otherVersion);
                 final String currentUser = authenticationSession.getUserName();
                 throw new ConcurrencyException(currentUser, thisOid, thisVersion, otherVersion);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
index eec9ef0..5807edf 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
@@ -35,7 +35,7 @@ import org.apache.isis.applib.annotation.PublishingChangeKind;
 import org.apache.isis.applib.services.HasTransactionId;
 import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 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;
@@ -228,7 +228,7 @@ public class ChangedObjectsServiceInternal implements WithTransactionScope {
     }
 
     private Set<Map.Entry<AdapterAndProperty, PreAndPostValues>> capturePostValuesAndDrain(final Map<AdapterAndProperty, PreAndPostValues> changedObjectProperties) {
-        return AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Callable<Set<Map.Entry<AdapterAndProperty, PreAndPostValues>>>() {
+        return ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Callable<Set<Map.Entry<AdapterAndProperty, PreAndPostValues>>>() {
             @Override
             public Set<Map.Entry<AdapterAndProperty, PreAndPostValues>> call() {
                 final Map<AdapterAndProperty, PreAndPostValues> processedObjectProperties = Maps.newLinkedHashMap();
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 8f53003..1df596c 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
@@ -18,7 +18,6 @@ package org.apache.isis.core.runtime.system.persistence;
 
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
 
 import javax.jdo.PersistenceManager;
 
@@ -29,20 +28,18 @@ import org.apache.isis.core.commons.components.SessionScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 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.runner.opts.OptionHandlerFixtureAbstract;
 import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext.MementoRecreateObjectSupport;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 
-public interface PersistenceSession extends ObjectAdapterProvider, TransactionalResource, SessionScopedComponent {
+public interface PersistenceSession extends ObjectAdapterProvider.Delegating, TransactionalResource, SessionScopedComponent {
 
     // -- CONSTANTS
 
@@ -62,38 +59,32 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
      */
     public static final String DATANUCLEUS_PROPERTIES_ROOT = ROOT_KEY + "impl.";
 
-
-    // -- OBJECT ADAPTER PROVIDER
-    
-    ObjectAdapterProvider getObjectAdapterProvider();
-    default ObjectAdapter adapterFor(Object domainObject) {
-        return getObjectAdapterProvider().adapterFor(domainObject);
-    }
-    default ObjectAdapter adapterFor(
-            final Object pojo,
-            final ObjectAdapter parentAdapter,
-            OneToManyAssociation collection) {
-        return getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
-    }
-    default ObjectSpecification specificationForViewModel(final Object viewModelPojo) {
-        return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
-    }
-    default ObjectAdapter adapterForViewModel(
-            final Object viewModelPojo, 
-            final Function<ObjectSpecId, RootOid> rootOidFactory) {
-        return getObjectAdapterProvider().adapterForViewModel(viewModelPojo, rootOidFactory);
-    }
-    
     //---
-    
+
     MementoRecreateObjectSupport mementoSupport();
-    
-    ObjectAdapter adapterFor(RootOid rootOid);
-    ObjectAdapter adapterFor(RootOid oid, AdapterManager.ConcurrencyChecking concurrencyChecking);
+
+    ObjectAdapter adapterFor(RootOid rootOid, ConcurrencyChecking concurrencyChecking);
+    Map<RootOid, ObjectAdapter> adaptersFor(List<RootOid> rootOids, ConcurrencyChecking concurrencyChecking);
     ObjectAdapter adapterForAny(RootOid rootOid);
-    Map<RootOid, ObjectAdapter> adaptersFor(List<RootOid> rootOids);
     <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query);
     
+    /**
+     * 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>
+     */
+    default ObjectAdapter adapterFor(final RootOid rootOid) {
+        return adapterFor(rootOid, ConcurrencyChecking.NO_CHECK);
+    }
+    
+    default Map<RootOid, ObjectAdapter> adaptersFor(List<RootOid> rootOids) {
+        return adaptersFor(rootOids, ConcurrencyChecking.NO_CHECK);
+    }
+
     // --
 
     void close();
@@ -126,8 +117,6 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
         return getPersistenceManager();
     }
 
-    List<ObjectAdapter> getServices();
-
     ServicesInjector getServicesInjector();
 
     IsisTransactionManager getTransactionManager();
@@ -174,10 +163,10 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
     void refreshRoot(ObjectAdapter adapter);
 
     void resolve(Object parent);
-    
+
     boolean isTransient(Object pojo);
     boolean isRepresentingPersistent(Object pojo);
     boolean isDestroyed(Object pojo);
-    
+
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
index fc14368..6fc8284 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
@@ -92,9 +92,6 @@ abstract class PersistenceSessionBase implements PersistenceSession {
      */
     protected final Map<Class<?>, PersistenceQueryProcessor<?>> persistenceQueryProcessorByClass = _Maps.newHashMap();
 
-
-    protected final boolean concurrencyCheckingGloballyEnabled;
-
     // -- CONSTRUCTOR
 
     /**
@@ -137,11 +134,6 @@ abstract class PersistenceSessionBase implements PersistenceSession {
         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;
-
     }
 
     // -- GETTERS
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index b002242..0a37968 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -443,7 +443,15 @@ public class ObjectAdapterContext {
         return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
     }
 
-
+    /**
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
+     */
+    @Deprecated
+    public void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
+        removeAdapterFromCache(adapter);
+        adapter.replacePojo(pojo);
+        mapAndInjectServices(adapter);
+    }
 
 
 }
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
index 90351bb..483b2ab 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -18,16 +18,19 @@
  */
 package org.apache.isis.core.runtime.system.persistence.adaptermanager;
 
+import java.util.List;
 import java.util.function.Function;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
@@ -43,6 +46,7 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
     private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_ObjectAdapterProvider.class);
     private final ObjectAdapterContext objectAdapterContext;
     private final PersistenceSession persistenceSession;
+    private final ServicesInjector servicesInjector;
     private final SpecificationLoader specificationLoader; 
     private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin; 
     
@@ -50,7 +54,8 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
             PersistenceSession persistenceSession) {
         this.objectAdapterContext = objectAdapterContext;
         this.persistenceSession = persistenceSession;
-        this.specificationLoader = persistenceSession.getServicesInjector().getSpecificationLoader();
+        this.servicesInjector = persistenceSession.getServicesInjector();
+        this.specificationLoader = servicesInjector.getSpecificationLoader();
         this.isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
     }
 
@@ -111,6 +116,20 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
         return adapter;
     }
     
+    @Override
+    public List<ObjectAdapter> getServices() {
+        final List<Object> services = servicesInjector.getRegisteredServices();
+        final List<ObjectAdapter> serviceAdapters = _Lists.newArrayList();
+        for (final Object servicePojo : services) {
+            ObjectAdapter serviceAdapter = objectAdapterContext.lookupAdapterFor(servicePojo);
+            if(serviceAdapter == null) {
+                throw new IllegalStateException("ObjectAdapter for service " + servicePojo + " does not exist?!?");
+            }
+            serviceAdapters.add(serviceAdapter);
+        }
+        return serviceAdapters;
+    }
+    
     // -- HELPER
     
     private ObjectAdapter existingOrValueAdapter(Object pojo) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java
index f81a169..9577ef1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java
@@ -28,7 +28,6 @@ import com.google.common.collect.Maps;
 
 import org.apache.isis.core.commons.ensure.Assert;
 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.ParentedCollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -37,7 +36,7 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 /**
  * A root {@link ObjectAdapter adapter} along with aggregated {@link ObjectAdapter adapters}
  * for any of its {@link OneToManyAssociation collection}s that are currently present in
- * the {@link AdapterManager map}s.
+ * the {@link ObjectAdapterContext}s map.
  *
  * <p>
  * Used for &quot;impact analysis&quot; when persisting transient root objects; all aggregated adapters
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
index 1142349..64d98b1 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
@@ -19,6 +19,11 @@
 
 package org.apache.isis.core.runtime.system;
 
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
 import com.google.common.collect.Lists;
 
 import org.jmock.Expectations;
@@ -31,7 +36,6 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
@@ -42,11 +46,6 @@ import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
 public class ObjectActionLayoutXmlDefaultTest {
 
     @Rule
@@ -62,8 +61,8 @@ public class ObjectActionLayoutXmlDefaultTest {
     private AuthenticationSessionProvider mockAuthenticationSessionProvider;
     @Mock
     private SpecificationLoader mockSpecificationLoader;
-    @Mock
-    private AdapterManager mockAdapterManager;
+//    @Mock
+//    private AdapterManager mockAdapterManager;
     @Mock
     private MessageService mockMessageService;
     @Mock
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
index ff3ce43..0abe928 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
@@ -27,7 +27,7 @@ import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java
index 063a88a..29fa24b 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java
@@ -55,7 +55,7 @@ import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerForType;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
@@ -104,7 +104,7 @@ public class WebRequestCycleForIsis extends AbstractRequestCycleListener {
     {
 
         if(handler instanceof RenderPageRequestHandler) {
-            AdapterManager.ConcurrencyChecking.disable();
+            ConcurrencyChecking.disable();
 
             final MetaModelInvalidException mmie = IsisContext.getMetaModelInvalidExceptionIfAny();
 
@@ -131,7 +131,7 @@ public class WebRequestCycleForIsis extends AbstractRequestCycleListener {
         LOG.debug("onRequestHandlerExecuted: handler: {}", handler);
 
         if(handler instanceof RenderPageRequestHandler) {
-            AdapterManager.ConcurrencyChecking.reset(AdapterManager.ConcurrencyChecking.CHECK);
+            ConcurrencyChecking.reset(ConcurrencyChecking.CHECK);
         }
 
         if (getIsisSessionFactory().inSession()) {
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java
index 0ad4b81..2ebf8bf 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java
@@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.model.mementos;
 import java.io.Serializable;
 
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index c303667..f4079cb 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -32,8 +32,7 @@ import org.apache.isis.applib.services.hint.HintStore;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -279,7 +278,7 @@ public class ObjectAdapterMemento implements Serializable {
          */
         TRANSIENT {
             /**
-             * {@link AdapterManager.ConcurrencyChecking} is ignored for transients.
+             * {@link ConcurrencyChecking} is ignored for transients.
              */
             @Override
             ObjectAdapter recreateAdapter(
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index a6e767f..27d7602 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -39,7 +39,7 @@ import org.apache.isis.applib.value.LocalResourcePath;
 import org.apache.isis.applib.value.NamedWithMimeType;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.consent.Consent;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 08d18c1..fafc912 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -35,7 +35,7 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 153880f..318f41d 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.component.CollectionLayoutData;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 94ec782..37abc9f 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -34,7 +34,7 @@ import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
index e3460b4..4193c65 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
@@ -23,7 +23,7 @@ import org.apache.wicket.model.Model;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 
 /**
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
index 5567f50..2f4698e 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
@@ -20,7 +20,7 @@
 package org.apache.isis.viewer.wicket.model.models;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
index 3919e52..23a111e 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
@@ -29,7 +29,7 @@ import org.apache.wicket.request.IRequestHandler;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.ElementSpecificationProviderFromTypeOfFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
@@ -167,7 +167,7 @@ public enum ActionResultResponseType {
                 // was throwing an exception when rebuild grid after invoking action
                 // not certain why that would be the case, but think it should be
                 // safe to simply disable while recreating the page to re-render back to user.
-                AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+                ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
                         new Callable<EntityPage>() {
                             @Override public EntityPage call() throws Exception {
                                 return new EntityPage(actualAdapter, exIfAny);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
index 0012604..7a9589d 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
@@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions;
 import org.apache.wicket.markup.html.link.AbstractLink;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java
index 441449c..1a53ee9 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java
@@ -26,7 +26,7 @@ import com.google.common.base.Predicates;
 import com.google.common.collect.FluentIterable;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -50,7 +50,7 @@ public final class LinkAndLabelUtil {
 
         final EntityModel parentEntityModel = scalarModelForAssociation.getParentEntityModel();
 
-        final ObjectAdapter parentAdapter = parentEntityModel.load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+        final ObjectAdapter parentAdapter = parentEntityModel.load(ConcurrencyChecking.NO_CHECK);
 
         final OneToOneAssociation oneToOneAssociation =
                 scalarModelForAssociation.getPropertyMemento().getProperty(scalarModelForAssociation.getSpecificationLoader());
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
index 153abf5..60ceca2 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
@@ -35,7 +35,7 @@ import org.apache.wicket.model.Model;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
@@ -356,7 +356,7 @@ class CssMenuItem implements Serializable {
         final boolean separator = serviceAndAction.separator;
         final ServiceActionLinkFactory actionLinkFactory = serviceAndAction.linkAndLabelFactory;
 
-        final ObjectAdapter serviceAdapter = targetEntityModel.load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+        final ObjectAdapter serviceAdapter = targetEntityModel.load(ConcurrencyChecking.NO_CHECK);
         final ObjectSpecification serviceSpec = serviceAdapter.getSpecification();
         if (serviceSpec.isHidden()) {
             return null;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
index b38d224..10ce792 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
@@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.actionmenu.serviceactions;
 import org.apache.wicket.markup.html.link.AbstractLink;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
index 56717c9..483ba3a 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
@@ -27,7 +27,7 @@ import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -72,7 +72,7 @@ public class AssociatedWithActionsHelper implements Serializable {
     private ObjectSpecification getObjectSpecification(final IsisSessionFactory isisSessionFactory) {
         final ObjectAdapterMemento parentOam = collectionModel.getParentObjectAdapterMemento();
         final ObjectAdapter parentAdapter = parentOam.getObjectAdapter(
-                AdapterManager.ConcurrencyChecking.NO_CHECK,
+                ConcurrencyChecking.NO_CHECK,
                 isisSessionFactory.getCurrentSession().getPersistenceSession(),
                 isisSessionFactory.getSpecificationLoader());
         return parentAdapter.getSpecification();
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
index b8fc79e..d00e2ac 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
@@ -30,7 +30,7 @@ import org.apache.wicket.feedback.ComponentFeedbackMessageFilter;
 import org.apache.wicket.markup.html.basic.Label;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.viewer.wicket.model.common.OnSelectionHandler;
@@ -76,7 +76,7 @@ BulkActionsProvider {
 
         final OneToManyAssociation otma = collectionModel.getCollectionMemento().getCollection(collectionModel.getSpecificationLoader());
         final EntityModel entityModel = collectionModel.getEntityModel();
-        final ObjectAdapter adapter = entityModel.load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+        final ObjectAdapter adapter = entityModel.load(ConcurrencyChecking.NO_CHECK);
 
         final List<ObjectAction> associatedActions =
                 ObjectAction.Util.findForAssociation(adapter, otma, getDeploymentCategory());
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
index 6d5f320..0bfde98 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
@@ -33,7 +33,7 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.MessageBroker;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index ea582a4..a9f13fa 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -36,7 +36,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.grid.Grid;
 import org.apache.isis.applib.services.tablecol.TableColumnOrderService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.WhereValueFacet;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
index 17f7709..0bceaf0 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
@@ -28,7 +28,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulato
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.IModel;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.viewer.wicket.model.common.OnConcurrencyExceptionHandler;
 import org.apache.isis.viewer.wicket.model.common.OnSelectionHandler;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
index 53ed51d..fa005b3 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
@@ -23,7 +23,7 @@ import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
index 557fe46..6210a0d 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
@@ -39,7 +39,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.component.FieldSet;
 import org.apache.isis.applib.layout.component.PropertyLayoutData;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.ObjectSpecificationException;
@@ -154,7 +154,7 @@ public class PropertyGroup extends PanelAbstract<EntityModel> implements HasDyna
         final List<PropertyLayoutData> properties = this.fieldSet.getProperties();
         // changed to NO_CHECK because more complex BS3 layouts trip concurrency exception
         // (haven't investigated as to why).
-        final ObjectAdapter adapter = getModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+        final ObjectAdapter adapter = getModel().load(ConcurrencyChecking.NO_CHECK);
         return getObjectAssociations(properties, adapter);
     }
 
@@ -223,7 +223,7 @@ public class PropertyGroup extends PanelAbstract<EntityModel> implements HasDyna
         final Component component = getComponentFactoryRegistry()
                 .addOrReplaceComponent(container, ID_PROPERTY, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
 
-        final ObjectAdapter adapter = entityModel.load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+        final ObjectAdapter adapter = entityModel.load(ConcurrencyChecking.NO_CHECK);
         final List<ObjectAction> associatedActions =
                 ObjectAction.Util.findForAssociation(adapter, otoa, getDeploymentCategory());
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
index 5bf0981..19abdeb 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
@@ -30,7 +30,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.ResourceReference;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyFormExecutorStrategy.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyFormExecutorStrategy.java
index 1129be6..b2a3607 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyFormExecutorStrategy.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyFormExecutorStrategy.java
@@ -24,7 +24,7 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.request.cycle.RequestCycle;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 import org.apache.isis.viewer.wicket.ui.panels.FormExecutorStrategy;
@@ -81,7 +81,7 @@ public class PropertyFormExecutorStrategy implements FormExecutorStrategy<Scalar
         // not certain why that would be the case, but (following similar code for action prompt)
         // think it should be safe to simply disable while recreating the page to re-render back to user.
         final EntityPage entityPage =
-                AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+                ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
                         new Callable<EntityPage>() {
                             @Override public EntityPage call() throws Exception {
                                 return new EntityPage(resultAdapter, null);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
index e3d5df0..031e3fd 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
@@ -22,7 +22,7 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.AbstractReadOnlyModel;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
@@ -37,7 +37,7 @@ public class PropertyEditPromptHeaderPanel extends PanelAbstract<ScalarModel> {
     public PropertyEditPromptHeaderPanel(String id, final ScalarModel model) {
         super(id, model);
 
-        ObjectAdapter targetAdapter = model.getParentEntityModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+        ObjectAdapter targetAdapter = model.getParentEntityModel().load(ConcurrencyChecking.NO_CHECK);
 
         getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.ENTITY_ICON_AND_TITLE, new EntityModel(targetAdapter));
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index cf3a427..3a43d4f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -37,7 +37,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index ea35cf2..967df08 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -43,7 +43,7 @@ import org.apache.wicket.model.Model;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
@@ -373,7 +373,7 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
         if(facet != null) {
 
             final ObjectAdapter parentAdapter =
-                    model.getParentEntityModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+                    model.getParentEntityModel().load(ConcurrencyChecking.NO_CHECK);
 
             final String cssClass = facet.cssClass(parentAdapter);
             CssClassAppender.appendCssClassTo(this, cssClass);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
index d8bba2b..ac142ce 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
@@ -34,7 +34,7 @@ import org.apache.wicket.validation.ValidationError;
 import org.wicketstuff.select2.ChoiceProvider;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -216,7 +216,7 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
             }
 
             final ObjectAdapter proposedAdapter = proposedValue.getObjectAdapter(
-                    AdapterManager.ConcurrencyChecking.NO_CHECK,
+                    ConcurrencyChecking.NO_CHECK,
                     getPersistenceSession(), getSpecificationLoader());
 
             final String reasonIfAny = scalarModel.validate(proposedAdapter);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index a6fb350..9dbfc8f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -23,7 +23,7 @@ import java.util.List;
 
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
index 93bd41e..dbb6ca1 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
@@ -34,7 +34,7 @@ import org.wicketstuff.select2.Select2Choice;
 import org.wicketstuff.select2.Settings;
 
 import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
@@ -76,7 +76,7 @@ public class BreadcrumbPanel extends PanelAbstract<IModel<Void>> {
             }
 
             private String titleFor(final EntityModel model) {
-                return model.getObjectAdapterMemento().getObjectAdapter(AdapterManager.ConcurrencyChecking.NO_CHECK,
+                return model.getObjectAdapterMemento().getObjectAdapter(ConcurrencyChecking.NO_CHECK,
                         model.getPersistenceSession(), model.getSpecificationLoader()).titleString(null);
             }
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
index 680a1b1..7831d2f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
@@ -24,7 +24,7 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.FormComponentPanel;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
@@ -48,7 +48,7 @@ public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdap
 
         // this is a bit of a hack, but getting a concurrency exception when click on a tab
         // which simply holds a newly modified reference.
-        AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Runnable() {
+        ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Runnable() {
             @Override
             public void run() {
                 buildGui();
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index 8ca8128..1f64308 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -36,7 +36,7 @@ import org.apache.wicket.request.cycle.RequestCycle;
 
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.postprocessors.param.ActionParameterDefaultsFacetFromAssociatedCollection;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -114,7 +114,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
                                         return null;
                                     }
                                     final ObjectAdapter objectAdapter = input.getObjectAdapter(
-                                            AdapterManager.ConcurrencyChecking.NO_CHECK,
+                                            ConcurrencyChecking.NO_CHECK,
                                             persistenceSession, specificationLoader);
                                     return objectAdapter != null ? objectAdapter.getObject() : null;
                                 }
@@ -173,7 +173,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
 
             // REVIEW: I wonder if this is still needed after the ISIS-1613 rework?
             final ActionPromptHeaderPanel titlePanel =
-                    AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+                    ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
                             new Callable<ActionPromptHeaderPanel>() {
                                 @Override
                                 public ActionPromptHeaderPanel call() throws Exception {
@@ -239,7 +239,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
                             // was throwing an exception when rebuild grid after invoking action
                             // not certain why that would be the case, but think it should be
                             // safe to simply disable while recreating the page to re-render back to user.
-                            AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+                            ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
                                     new Callable<EntityPage>() {
                                         @Override public EntityPage call() throws Exception {
                                             return new EntityPage(targetAdapter, null);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
index 9d8b1fe..ba95c6f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@ -28,7 +28,7 @@ import org.apache.wicket.util.string.Strings;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.context.IsisContext;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
index 3b0816b..ee2fd89 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
@@ -24,7 +24,7 @@ import org.apache.wicket.markup.html.form.IFormSubmitter;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index e40b060..4ddd22b 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -46,7 +46,7 @@ import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.MessageBroker;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -316,7 +316,7 @@ implements FormExecutor {
                 // was throwing an exception when rebuild grid after invoking action
                 // not certain why that would be the case, but think it should be
                 // safe to simply disable while recreating the page to re-render back to user.
-                AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+                ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
                         new Callable<EntityPage>() {
                             @Override public EntityPage call() throws Exception {
                                 return new EntityPage(targetAdapter, ex);