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 20:26:04 UTC

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

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 77704048cc6a18fa2bc1d238f7b1009485a2ddea
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);