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:25:57 UTC

[isis] 15/24: ISIS-1976: further decouple factets

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 48e4be128611018a65feba029076e2604d888491
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Sep 3 14:57:31 2018 +0200

    ISIS-1976: further decouple factets
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../annotcfg/EncodableFacetAnnotation.java         |  4 +-
 ...bleFacetAnnotationElseConfigurationFactory.java |  8 ++--
 .../container/DomainObjectContainerDefault.java    | 13 ++++--
 .../RepositoryServiceLegacyInternalDefault.java    | 13 +++---
 .../metamodel/adapter/ObjectAdapterProvider.java   | 53 ++--------------------
 ...ctionInvocationFacetForDomainEventAbstract.java | 16 ++++---
 .../CollectionAccessorFacetViaAccessorFactory.java |  8 ++--
 .../clear/CollectionClearFacetFactory.java         |  4 +-
 .../javautilcollection/CollectionFacetFactory.java |  4 +-
 .../DomainObjectAnnotationFacetFactory.java        | 12 +++--
 .../annotcfg/EncodableFacetFromConfiguration.java  |  4 +-
 ...ObjectFacetDeclarativeInitializingAbstract.java |  5 +-
 .../recreatable/RecreatableObjectFacetFactory.java |  8 ++--
 .../annotation/TitleAnnotationFacetFactory.java    |  4 +-
 ...ParameterAutoCompleteFacetViaMethodFactory.java |  8 ++--
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |  4 +-
 .../method/ActionChoicesFacetViaMethodFactory.java |  8 ++--
 ...ctionParameterChoicesFacetViaMethodFactory.java |  7 +--
 ...tionParameterDefaultsFacetViaMethodFactory.java |  4 +-
 .../PropertyAccessorFacetViaAccessorFactory.java   |  4 +-
 .../PropertyAutoCompleteFacetMethodFactory.java    |  4 +-
 .../PropertyChoicesFacetViaMethodFactory.java      |  4 +-
 ...PropertyDefaultFacetDerivedFromTypeFactory.java |  4 +-
 .../PropertyDefaultFacetViaMethodFactory.java      |  4 +-
 ...onParameterDefaultsAndChoicesPostProcessor.java |  4 +-
 .../PersistenceSessionServiceInternal.java         | 35 ++++++++++++++
 .../PersistenceSessionServiceInternalNoop.java     | 19 ++------
 .../RepositoryServiceInternalDefault.java          | 15 +++---
 .../services/title/TitleServiceDefault.java        | 14 +++---
 .../specloader/specimpl/ObjectMemberAbstract.java  |  7 ++-
 .../specimpl/OneToManyAssociationContributee.java  |  2 -
 .../specimpl/OneToManyAssociationDefault.java      |  2 +-
 .../specimpl/OneToOneAssociationDefault.java       | 19 ++------
 .../CollectionAnnotationFacetFactoryTest.java      |  3 +-
 .../PropertyAnnotationFacetFactoryTest.java        |  3 +-
 .../ValueSemanticsProviderAbstractTestCase.java    | 32 +++++++------
 .../system/persistence/PersistenceSession4.java    | 10 +++-
 .../system/persistence/PersistenceSession5.java    | 11 +++--
 .../PersistenceSessionServiceInternalDefault.java  | 18 +-------
 .../system/persistence/PersistenceSession.java     |  6 ++-
 .../adaptermanager/ObjectAdapterContext.java       | 48 ++++++++++++++++++--
 .../adaptermanager/ObjectAdapterLegacy.java        |  5 --
 .../handlers/DomainObjectInvocationHandler.java    | 13 ++++--
 43 files changed, 254 insertions(+), 219 deletions(-)

diff --git a/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetAnnotation.java b/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetAnnotation.java
index 7e6c280..72a8632 100644
--- a/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetAnnotation.java
+++ b/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetAnnotation.java
@@ -46,7 +46,9 @@ public class EncodableFacetAnnotation extends EncodableFacetAbstract {
     }
 
     public EncodableFacetAnnotation(final Class<?> annotatedClass, final FacetHolder holder, final ServicesInjector servicesInjector) {
-        this(encoderDecoderName(annotatedClass, servicesInjector.getConfigurationServiceInternal()), encoderDecoderClass(annotatedClass), holder, servicesInjector.getPersistenceSessionServiceInternal(), servicesInjector);
+        this(encoderDecoderName(annotatedClass, servicesInjector.getConfigurationServiceInternal()),
+                encoderDecoderClass(annotatedClass), holder, 
+                servicesInjector.getPersistenceSessionServiceInternal(), servicesInjector);
     }
 
     private EncodableFacetAnnotation(final String candidateEncoderDecoderName, final Class<?> candidateEncoderDecoderClass, final FacetHolder holder, final ObjectAdapterProvider adapterProvider, final ServicesInjector dependencyInjector) {
diff --git a/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java b/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java
index 624d046..7d82149 100644
--- a/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java
+++ b/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java
@@ -19,7 +19,10 @@
 
 package org.apache.isis.core.metamodel.facets.object.parseable.annotcfg;
 
+import com.google.common.base.Strings;
+
 import org.apache.isis.applib.annotation.Parseable;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -28,9 +31,6 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacetAbstract;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParserUtil;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
-
-import com.google.common.base.Strings;
 
 /**
  * @deprecated because {@link Parseable} was deprecated
@@ -79,6 +79,6 @@ public class ParseableFacetAnnotationElseConfigurationFactory extends FacetFacto
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java b/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
index c1ac5d3..08c03b8 100644
--- a/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
+++ b/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
@@ -71,7 +72,7 @@ public class DomainObjectContainerDefault implements DomainObjectContainer {
         if (persistentObject == null) {
             throw new IllegalArgumentException("Must specify a reference for disposing an object");
         }
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(persistentObject));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(persistentObject));
         if (!repositoryService.isPersistent(persistentObject)) {
             throw new RepositoryException("Object not persistent: " + adapter);
         }
@@ -156,7 +157,7 @@ public class DomainObjectContainerDefault implements DomainObjectContainer {
     @Programmatic
     @Override
     public String validate(final Object domainObject) {
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(domainObject));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(domainObject));
         final InteractionResult validityResult =
                 adapter.getSpecification().isValidResult(adapter, InteractionInitiatedBy.FRAMEWORK);
         return validityResult.getReason();
@@ -170,7 +171,7 @@ public class DomainObjectContainerDefault implements DomainObjectContainer {
     @Programmatic
     @Override
     public boolean isViewModel(final Object domainObject) {
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(domainObject));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(domainObject));
         return adapter.getSpecification().isViewModel();
     }
     
@@ -184,7 +185,7 @@ public class DomainObjectContainerDefault implements DomainObjectContainer {
     @Programmatic
     @Override
     public void persist(final Object domainObject) {
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(domainObject));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(domainObject));
 
         if(adapter == null) {
             throw new PersistFailedException("Object not known to framework; instantiate using newTransientInstance(...) rather than simply new'ing up.");
@@ -216,7 +217,9 @@ public class DomainObjectContainerDefault implements DomainObjectContainer {
         return wrapperFactory != null ? wrapperFactory.unwrap(domainObject) : domainObject;
     }
     
-
+    private ObjectAdapterProvider getObjectAdapterProvider() {
+        return persistenceSessionServiceInternal;
+    }
 
     // -- service dependencies
 
diff --git a/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/services/repository/RepositoryServiceLegacyInternalDefault.java b/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/services/repository/RepositoryServiceLegacyInternalDefault.java
index 27ba440..f5ba840 100644
--- a/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/services/repository/RepositoryServiceLegacyInternalDefault.java
+++ b/core/legacy/metamodel-legacy/src/main/java/org/apache/isis/core/metamodel/services/repository/RepositoryServiceLegacyInternalDefault.java
@@ -22,8 +22,6 @@ package org.apache.isis.core.metamodel.services.repository;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 
@@ -38,8 +36,8 @@ import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryServiceLegacy;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 /**
@@ -76,7 +74,7 @@ public class RepositoryServiceLegacyInternalDefault implements RepositoryService
     @Programmatic
     @Override
     public boolean isPersistent(final Object domainObject) {
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(domainObject));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(domainObject));
         return adapter.representsPersistent();
     }
 
@@ -86,7 +84,7 @@ public class RepositoryServiceLegacyInternalDefault implements RepositoryService
         if (isPersistent(object)) {
             return object;
         }
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(object));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(object));
 
         if(adapter == null) {
             throw new PersistFailedException("Object not known to framework (unable to create/obtain an adapter)");
@@ -124,7 +122,7 @@ public class RepositoryServiceLegacyInternalDefault implements RepositoryService
         if (object == null) {
             throw new IllegalArgumentException("Must specify a reference for disposing an object");
         }
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(object));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(object));
         if (!isPersistent(object)) {
             throw new RepositoryException("Object not persistent: " + adapter);
         }
@@ -244,6 +242,9 @@ public class RepositoryServiceLegacyInternalDefault implements RepositoryService
         return wrapperFactory != null ? wrapperFactory.unwrap(domainObject) : domainObject;
     }
 
+    private ObjectAdapterProvider getObjectAdapterProvider() {
+        return persistenceSessionServiceInternal;
+    }
 
     @javax.inject.Inject
     FactoryService factoryService;
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 57ce4fc..cb87353 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,16 +18,12 @@
  */
 package org.apache.isis.core.metamodel.adapter;
 
-import java.util.UUID;
 import java.util.function.Function;
 
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 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.metamodel.specloader.SpecificationLoader;
 
 /**
  * 
@@ -39,63 +35,24 @@ public interface ObjectAdapterProvider {
     /**
      * @return standalone (value) or root adapter
      */
-    @Programmatic
     ObjectAdapter adapterFor(Object domainObject);
 
     /**
      * @return collection adapter.
      */
-    @Programmatic
     ObjectAdapter adapterFor(
             final Object pojo,
             final ObjectAdapter parentAdapter,
             OneToManyAssociation collection);
 
-    @Programmatic
-    default ObjectSpecification specificationForViewModel(
-            final SpecificationLoader specificationLoader, 
-            final Object viewModelPojo) {
-        
-        //FIXME[ISIS-1976]
-        // this is horrible, but there's a catch-22 here...
-        // we need an adapter in order to query the state of the object via the metamodel, on the other hand
-        // we can't create an adapter without the identifier, which is what we're trying to derive
-        // so... we create a temporary transient adapter, use it to wrap this adapter and interrogate this pojo,
-        // then throw away that adapter (remove from the adapter map)
-        final boolean[] createdTemporaryAdapter = {false};
-        final ObjectAdapter viewModelAdapter = adapterForViewModel(
-                specificationLoader,
-                viewModelPojo, 
-                (ObjectSpecId objectSpecId)->{
-                    createdTemporaryAdapter[0] = true;
-                    return RootOid.create(objectSpecId, UUID.randomUUID().toString()); });
+    ObjectSpecification specificationForViewModel(final Object viewModelPojo);
 
-        final ObjectSpecification spec = viewModelAdapter.getSpecification();
-        
-        if(createdTemporaryAdapter[0]) {
-            adapterManager().removeAdapterFromCache(viewModelAdapter);
-        }
-        return spec;
-    }
-
-    default ObjectAdapter adapterForViewModel(
-            final SpecificationLoader specificationLoader,
+    ObjectAdapter adapterForViewModel(
             final Object viewModelPojo, 
-            final Function<ObjectSpecId, RootOid> rootOidFactory) {
-
-        ObjectAdapter viewModelAdapter = adapterManager().lookupAdapterFor(viewModelPojo);
-        if(viewModelAdapter == null) {
-            final ObjectSpecification objectSpecification = 
-                    specificationLoader.loadSpecification(viewModelPojo.getClass());
-            final ObjectSpecId objectSpecId = objectSpecification.getSpecId();
-            final RootOid newRootOid = rootOidFactory.apply(objectSpecId);
+            final Function<ObjectSpecId, RootOid> rootOidFactory);
+    
 
-            viewModelAdapter = adapterManager().addRecreatedPojoToCache(newRootOid, viewModelPojo);
-        }
-        return viewModelAdapter;
-    }
     
-    @Deprecated // don't expose caching
-    AdapterManager adapterManager();
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index bf94a59..997ef69 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -62,6 +62,7 @@ import org.apache.isis.core.commons.lang.ArrayExtensions;
 import org.apache.isis.core.commons.lang.MethodInvocationPreprocessor;
 import org.apache.isis.core.commons.lang.ThrowableExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -202,7 +203,7 @@ implements ImperativeFacet {
                         "Unable to persist command for action '%s'; CommandService does not support persistent commands ",
                         actionId));
             }
-            returnedAdapter = getPersistenceSessionServiceInternal().adapterFor(command);
+            returnedAdapter = getObjectAdapterProvider().adapterFor(command);
 
         } else {
             // otherwise, go ahead and execute action in the 'foreground'
@@ -321,7 +322,7 @@ implements ImperativeFacet {
 
 
             final Object returnedPojo = priorExecution.getReturned();
-            returnedAdapter = persistenceSessionServiceInternal.adapterFor(returnedPojo);
+            returnedAdapter = getObjectAdapterProvider().adapterFor(returnedPojo);
 
             // sync DTO with result
             getInteractionDtoServiceInternal().updateResult(priorExecution.getDto(), owningAction, returnedPojo);
@@ -408,7 +409,7 @@ implements ImperativeFacet {
         // to remove boilerplate from the domain, we automatically clone the returned object if it is a view model.
 
         if (resultPojo != null) {
-            final ObjectAdapter resultAdapter = getPersistenceSessionServiceInternal().adapterFor(resultPojo);
+            final ObjectAdapter resultAdapter = getObjectAdapterProvider().adapterFor(resultPojo);
             return cloneIfViewModelElse(resultAdapter, resultAdapter);
         } else {
             // if void or null, attempt to clone the original target, else return null.
@@ -425,7 +426,7 @@ implements ImperativeFacet {
         final ViewModelFacet viewModelFacet = adapter.getSpecification().getFacet(ViewModelFacet.class);
         final Object clone = viewModelFacet.clone(adapter.getObject());
 
-        final ObjectAdapter clonedAdapter = getPersistenceSessionServiceInternal().adapterFor(clone);
+        final ObjectAdapter clonedAdapter = getObjectAdapterProvider().adapterFor(clone);
 
         // copy over TypeOfFacet if required
         final TypeOfFacet typeOfFacet = getFacetHolder().getFacet(TypeOfFacet.class);
@@ -511,7 +512,7 @@ implements ImperativeFacet {
                             .collect(Collectors.toList()),
                             method.getReturnType());
             if (visibleObjects != null) {
-                return getPersistenceSessionServiceInternal().adapterFor(visibleObjects);
+                return getObjectAdapterProvider().adapterFor(visibleObjects);
             }
 
             // would be null if unable to take a copy (unrecognized return type)
@@ -587,7 +588,10 @@ implements ImperativeFacet {
     // Dependencies (from constructor)
     // /////////////////////////////////////////////////////////
 
-
+    private ObjectAdapterProvider getObjectAdapterProvider() {
+        return persistenceSessionServiceInternal;
+    }
+    
     private PersistenceSessionServiceInternal getPersistenceSessionServiceInternal() {
         return persistenceSessionServiceInternal;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
index 814c873..78007c7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
@@ -23,6 +23,7 @@ import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -32,7 +33,6 @@ import org.apache.isis.core.metamodel.facets.PropertyOrCollectionIdentifyingFace
 import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacetDefault;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class CollectionAccessorFacetViaAccessorFactory
@@ -61,7 +61,7 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
                 new CollectionAccessorFacetViaAccessor(
                         typeSpec, accessorMethod, holder,
                         getDeploymentCategory(), getConfiguration(), getSpecificationLoader(),
-                        getAuthenticationSessionProvider(), adapterManager
+                        getAuthenticationSessionProvider(), adapterProvider
                         ));
 
         FacetUtil.addFacet(CollectionSemanticsFacetDefault.forCollection(accessorMethod, holder));
@@ -115,9 +115,9 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
 
     @Override public void setServicesInjector(final ServicesInjector servicesInjector) {
         super.setServicesInjector(servicesInjector);
-        adapterManager = servicesInjector.getPersistenceSessionServiceInternal();
+        adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterManager;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
index 3ab2f6a..b2d21f6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.facets.collections.clear;
 import java.lang.reflect.Method;
 
 import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -31,7 +32,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 public class CollectionClearFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
@@ -82,7 +82,7 @@ public class CollectionClearFacetFactory extends MethodPrefixBasedFacetFactoryAb
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/CollectionFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/CollectionFacetFactory.java
index 55b8e26..7a605e4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/CollectionFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/CollectionFacetFactory.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.javautilcollection;
 
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.commons.internal.collections._Collections;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
@@ -30,7 +31,6 @@ import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredF
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 public class CollectionFacetFactory extends FacetFactoryAbstract {
 
@@ -96,6 +96,6 @@ public class CollectionFacetFactory extends FacetFactoryAbstract {
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 6100ba0..5cf7e73 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -26,6 +26,8 @@ import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 
+import com.google.common.collect.Maps;
+
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.events.lifecycle.ObjectCreatedEvent;
@@ -80,8 +82,6 @@ import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 import org.apache.isis.core.metamodel.util.EventUtil;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
 
-import com.google.common.collect.Maps;
-
 
 public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 implements MetaModelValidatorRefiner, PostConstructMethodCache {
@@ -290,8 +290,12 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache {
 
         final PostConstructMethodCache postConstructMethodCache = this;
         final ViewModelFacet recreatableObjectFacet = RecreatableObjectFacetForDomainObjectAnnotation.create(
-                domainObjects, getSpecificationLoader(), persistenceSessionServiceInternal, servicesInjector,
-                facetHolder, postConstructMethodCache);
+                domainObjects, 
+                getSpecificationLoader(), 
+                persistenceSessionServiceInternal, 
+                servicesInjector,
+                facetHolder, 
+                postConstructMethodCache);
 
         if(recreatableObjectFacet != null) {
             FacetUtil.addFacet(recreatableObjectFacet);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetFromConfiguration.java
index 806ea7e..69f6d20 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetFromConfiguration.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.metamodel.facets.object.encodeable.annotcfg;
 
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacetAbstract;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -27,7 +26,8 @@ import org.apache.isis.core.metamodel.services.ServicesInjector;
 public class EncodableFacetFromConfiguration extends EncodableFacetAbstract {
 
     public EncodableFacetFromConfiguration(final String candidateEncoderDecoderName, final FacetHolder holder, final ServicesInjector servicesInjector) {
-        super(candidateEncoderDecoderName, null, holder, servicesInjector.getPersistenceSessionServiceInternal(), servicesInjector);
+        super(candidateEncoderDecoderName, null, holder, 
+                servicesInjector.getPersistenceSessionServiceInternal(), servicesInjector);
 
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
index 9393db0..3042d6f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
@@ -43,7 +43,7 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 public abstract class RecreatableObjectFacetDeclarativeInitializingAbstract 
 extends RecreatableObjectFacetAbstract {
 
-    private final SpecificationLoader specificationLoader;
+    private final SpecificationLoader specificationLoader; //FIXME[ISIS-1976] remove
     private final ObjectAdapterProvider adapterProvider;
 
     public RecreatableObjectFacetDeclarativeInitializingAbstract(
@@ -71,7 +71,6 @@ extends RecreatableObjectFacetAbstract {
         final Set<String> mementoKeys = memento.keySet();
 
         final ObjectAdapter viewModelAdapter = adapterProvider.adapterForViewModel(
-                specificationLoader,
                 viewModelPojo, 
                 (ObjectSpecId objectSpecId)->
                     new RootOid(objectSpecId, mementoStr, Oid.State.VIEWMODEL)  );
@@ -102,7 +101,7 @@ extends RecreatableObjectFacetAbstract {
 
         final _Mementos.Memento memento = _Mementos.create(codec, serializer);
 
-        final ObjectSpecification spec = adapterProvider.specificationForViewModel(specificationLoader, viewModelPojo);
+        final ObjectSpecification spec = adapterProvider.specificationForViewModel(viewModelPojo);
         
         final List<OneToOneAssociation> properties = spec.getProperties(Contributed.EXCLUDED);
         for (OneToOneAssociation property : properties) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
index facd04d..70089bd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
@@ -26,9 +26,12 @@ import java.util.Optional;
 import javax.annotation.PostConstruct;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import com.google.common.collect.Maps;
+
 import org.apache.isis.applib.RecreatableDomainObject;
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
@@ -40,14 +43,11 @@ import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
 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.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 
-import com.google.common.collect.Maps;
-
 public class RecreatableObjectFacetFactory extends FacetFactoryAbstract
 implements MetaModelValidatorRefiner, PostConstructMethodCache {
 
@@ -139,6 +139,6 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache {
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
index 3f38112..9e6ae7f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
@@ -29,6 +29,7 @@ import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -39,7 +40,6 @@ import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.core.metamodel.facets.fallback.FallbackFacetFactory;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
@@ -196,6 +196,6 @@ public class TitleAnnotationFacetFactory extends FacetFactoryAbstract implements
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
index 59fa9c3..1d9645f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
@@ -35,7 +36,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstra
 import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
@@ -87,7 +87,7 @@ public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPref
                     new ActionParameterAutoCompleteFacetViaMethod(
                             autoCompleteMethod, paramType, paramAsHolder,
                             getDeploymentCategory(), getSpecificationLoader(),
-                            getAuthenticationSessionProvider(), adapterManager));
+                            getAuthenticationSessionProvider(), adapterProvider));
         }
     }
 
@@ -111,9 +111,9 @@ public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPref
     @Override
     public void setServicesInjector(final ServicesInjector servicesInjector) {
         super.setServicesInjector(servicesInjector);
-        adapterManager = servicesInjector.getPersistenceSessionServiceInternal();
+        adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterManager;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacetFactory.java
index 7c2de6e..4a5d1c6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacetFactory.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.param.choices.enums;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
@@ -26,7 +27,6 @@ import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 public class ActionParameterChoicesFacetDerivedFromChoicesFacetFactory extends FacetFactoryAbstract {
 
@@ -65,6 +65,6 @@ public class ActionParameterChoicesFacetDerivedFromChoicesFacetFactory extends F
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
index e556973..756d052 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
@@ -24,6 +24,7 @@ import java.util.Collection;
 
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
@@ -33,7 +34,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstra
 import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 public class ActionChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
@@ -84,7 +84,7 @@ public class ActionChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFa
         final Class<?> returnType = actionMethod.getReturnType();
         final FacetHolder action = processMethodContext.getFacetHolder();
         final ActionChoicesFacetViaMethod facet = new ActionChoicesFacetViaMethod(choicesMethod, returnType, action,
-                getDeploymentCategory(), getSpecificationLoader(), getAuthenticationSessionProvider(), adapterManager);
+                getDeploymentCategory(), getSpecificationLoader(), getAuthenticationSessionProvider(), adapterProvider);
         FacetUtil.addFacet(facet);
     }
 
@@ -109,9 +109,9 @@ public class ActionChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFa
     @Override
     public void setServicesInjector(final ServicesInjector servicesInjector) {
         super.setServicesInjector(servicesInjector);
-        adapterManager = servicesInjector.getPersistenceSessionServiceInternal();
+        adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterManager;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
index 7dffec3..37f6623 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
@@ -26,6 +26,7 @@ import java.util.List;
 
 import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
@@ -95,7 +96,7 @@ public class ActionParameterChoicesFacetViaMethodFactory extends MethodPrefixBas
             // add facets directly to parameters, not to actions
             final FacetedMethodParameter paramAsHolder = parameters.get(i);
             FacetUtil.addFacet(new ActionParameterChoicesFacetViaMethod(choicesMethod, arrayOfParamType, paramAsHolder,
-                    getDeploymentCategory(), getSpecificationLoader(), getAuthenticationSessionProvider(), adapterManager
+                    getDeploymentCategory(), getSpecificationLoader(), getAuthenticationSessionProvider(), adapterProvider
                     ));
         }
     }
@@ -151,9 +152,9 @@ public class ActionParameterChoicesFacetViaMethodFactory extends MethodPrefixBas
     @Override
     public void setServicesInjector(final ServicesInjector servicesInjector) {
         super.setServicesInjector(servicesInjector);
-        adapterManager = servicesInjector.getPersistenceSessionServiceInternal();
+        adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterManager;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
index f7f8178..4bc23bb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
@@ -24,6 +24,7 @@ import java.util.List;
 
 import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
@@ -36,7 +37,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 /**
  * Sets up all the {@link Facet}s for an action in a single shot.
@@ -140,6 +140,6 @@ public class ActionParameterDefaultsFacetViaMethodFactory extends MethodPrefixBa
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
index 3fbd438..5fe8a84 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.facets.properties.accessor;
 import java.lang.reflect.Method;
 import java.util.List;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -30,7 +31,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class PropertyAccessorFacetViaAccessorFactory extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
@@ -119,6 +119,6 @@ public class PropertyAccessorFacetViaAccessorFactory extends PropertyOrCollectio
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
index 0522c17..5b7f9a6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.facets.properties.autocomplete.method;
 import java.lang.reflect.Method;
 
 import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -30,7 +31,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstra
 import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 public class PropertyAutoCompleteFacetMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
@@ -77,6 +77,6 @@ public class PropertyAutoCompleteFacetMethodFactory extends MethodPrefixBasedFac
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
index 062c194..c0ccb9b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.facets.properties.choices.method;
 import java.lang.reflect.Method;
 
 import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -30,7 +31,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstra
 import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 public class PropertyChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
@@ -74,6 +74,6 @@ public class PropertyChoicesFacetViaMethodFactory extends MethodPrefixBasedFacet
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromTypeFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromTypeFactory.java
index ba40c18..a4b845e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromTypeFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromTypeFactory.java
@@ -19,13 +19,13 @@
 
 package org.apache.isis.core.metamodel.facets.properties.defaults.fromtype;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacet;
 import org.apache.isis.core.metamodel.facets.properties.defaults.PropertyDefaultFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class PropertyDefaultFacetDerivedFromTypeFactory extends FacetFactoryAbstract {
@@ -73,6 +73,6 @@ public class PropertyDefaultFacetDerivedFromTypeFactory extends FacetFactoryAbst
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
index 3ccfd58..0055a59 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.facets.properties.defaults.method;
 import java.lang.reflect.Method;
 
 import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -30,7 +31,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstra
 import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 public class PropertyDefaultFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
@@ -75,6 +75,6 @@ public class PropertyDefaultFacetViaMethodFactory extends MethodPrefixBasedFacet
         adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
-    PersistenceSessionServiceInternal adapterProvider;
+    ObjectAdapterProvider adapterProvider;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionCollectionParameterDefaultsAndChoicesPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionCollectionParameterDefaultsAndChoicesPostProcessor.java
index 1ee26fc..287b88c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionCollectionParameterDefaultsAndChoicesPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionCollectionParameterDefaultsAndChoicesPostProcessor.java
@@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -37,7 +38,6 @@ import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefau
 import org.apache.isis.core.metamodel.progmodel.ObjectSpecificationPostProcessor;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.ServicesInjectorAware;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -55,7 +55,7 @@ ServicesInjectorAware {
     private DeploymentCategoryProvider deploymentCategoryProvider;
     private SpecificationLoader specificationLoader;
     private AuthenticationSessionProvider authenticationSessionProvider;
-    private PersistenceSessionServiceInternal adapterProvider;
+    private ObjectAdapterProvider adapterProvider;
 
     @Override
     public void postProcess(final ObjectSpecification objectSpecification) {
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 544d809..933ef1e 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,6 +18,7 @@ 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;
@@ -28,11 +29,45 @@ 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);
+    }
+    
+    
     // -- instantiate
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternalNoop.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternalNoop.java
index ced85e4..86dfefb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternalNoop.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternalNoop.java
@@ -29,11 +29,9 @@ import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.xactn.Transaction;
 import org.apache.isis.applib.services.xactn.TransactionState;
-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;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 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;
 
 @DomainService(
@@ -43,15 +41,7 @@ import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
 public class PersistenceSessionServiceInternalNoop implements PersistenceSessionServiceInternal {
 
     @Override
-    public ObjectAdapter adapterFor(
-            final Object pojo,
-            final ObjectAdapter ownerAdapter,
-            final OneToManyAssociation collection) {
-        throw new UnsupportedOperationException("Not supported by this implementation of PersistenceSessionServiceInternal");
-    }
-
-    @Override
-    public ObjectAdapter adapterFor(final Object domainObject) {
+    public ObjectAdapterProvider getObjectAdapterProvider() {
         throw new UnsupportedOperationException("Not supported by this implementation of PersistenceSessionServiceInternal");
     }
 
@@ -157,10 +147,7 @@ public class PersistenceSessionServiceInternalNoop implements PersistenceSession
         throw new UnsupportedOperationException("Not supported by this implementation of PersistenceSessionServiceInternal");
     }
 
-    @Override
-    public AdapterManager adapterManager() {
-        throw _Exceptions.notImplemented();
-    }
+
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/repository/RepositoryServiceInternalDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/repository/RepositoryServiceInternalDefault.java
index 9b1dc1c..aa513f1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/repository/RepositoryServiceInternalDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/repository/RepositoryServiceInternalDefault.java
@@ -22,12 +22,11 @@ package org.apache.isis.core.metamodel.services.repository;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-
-import javax.annotation.PostConstruct;
-
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
+import javax.annotation.PostConstruct;
+
 import org.apache.isis.applib.PersistFailedException;
 import org.apache.isis.applib.RepositoryException;
 import org.apache.isis.applib.annotation.DomainService;
@@ -41,6 +40,7 @@ import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 @DomainService(
@@ -72,7 +72,7 @@ public class RepositoryServiceInternalDefault implements RepositoryService {
     @Programmatic
     @Override
     public boolean isPersistent(final Object domainObject) {
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(domainObject));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(domainObject));
         return adapter.representsPersistent();
     }
 
@@ -82,7 +82,7 @@ public class RepositoryServiceInternalDefault implements RepositoryService {
         if (isPersistent(object)) {
             return object;
         }
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(object));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(object));
 
         if(adapter == null) {
             throw new PersistFailedException("Object not known to framework (unable to create/obtain an adapter)");
@@ -120,7 +120,7 @@ public class RepositoryServiceInternalDefault implements RepositoryService {
         if (object == null) {
             throw new IllegalArgumentException("Must specify a reference for disposing an object");
         }
-        final ObjectAdapter adapter = persistenceSessionServiceInternal.adapterFor(unwrapped(object));
+        final ObjectAdapter adapter = getObjectAdapterProvider().adapterFor(unwrapped(object));
         if (!isPersistent(object)) {
             throw new RepositoryException("Object not persistent: " + adapter);
         }
@@ -206,6 +206,9 @@ public class RepositoryServiceInternalDefault implements RepositoryService {
         return wrapperFactory != null ? wrapperFactory.unwrap(domainObject) : domainObject;
     }
 
+    private ObjectAdapterProvider getObjectAdapterProvider() {
+        return persistenceSessionServiceInternal;
+    }
 
     @javax.inject.Inject
     FactoryService factoryService;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitleServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitleServiceDefault.java
index d3abc3e..83e6e68 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitleServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitleServiceDefault.java
@@ -25,6 +25,7 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 @DomainService(
@@ -36,7 +37,7 @@ public class TitleServiceDefault implements TitleService {
     @Programmatic
     @Override
     public String titleOf(final Object domainObject) {
-        final ObjectAdapter objectAdapter = adapterManager.adapterFor(unwrapped(domainObject));
+        final ObjectAdapter objectAdapter = getObjectAdapterProvider().adapterFor(unwrapped(domainObject));
         final boolean destroyed = objectAdapter.isDestroyed();
         if(!destroyed) {
             return objectAdapter.getSpecification().getTitle(null, objectAdapter);
@@ -48,13 +49,10 @@ public class TitleServiceDefault implements TitleService {
     @Programmatic
     @Override
     public String iconNameOf(final Object domainObject) {
-        final ObjectAdapter objectAdapter = adapterManager.adapterFor(unwrapped(domainObject));
+        final ObjectAdapter objectAdapter = getObjectAdapterProvider().adapterFor(unwrapped(domainObject));
         return objectAdapter.getSpecification().getIconName(objectAdapter);
     }
 
-
-
-
     // //////////////////////////////////////
 
     private Object unwrapped(Object domainObject) {
@@ -63,8 +61,12 @@ public class TitleServiceDefault implements TitleService {
 
     // //////////////////////////////////////
 
+    private ObjectAdapterProvider getObjectAdapterProvider() {
+        return sessionServiceInternal;
+    }
+    
     @javax.inject.Inject
-    PersistenceSessionServiceInternal adapterManager;
+    PersistenceSessionServiceInternal sessionServiceInternal;
 
     @javax.inject.Inject
     WrapperFactory wrapperFactory;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index b6d12bf..2393eb8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -31,6 +31,7 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.core.commons.lang.StringExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
@@ -330,7 +331,7 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         final ObjectSpecification objectSpecification = getSpecificationLoader().loadSpecification(mixinType);
         final MixinFacet mixinFacet = objectSpecification.getFacet(MixinFacet.class);
         final Object mixinPojo = mixinFacet.instantiate(mixedInAdapter.getObject());
-        return getPersistenceSessionService().adapterFor(mixinPojo);
+        return getObjectAdapterProvider().adapterFor(mixinPojo);
     }
 
     public static String determineNameFrom(final ObjectAction mixinAction) {
@@ -394,6 +395,10 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         return servicesInjector;
     }
 
+    protected ObjectAdapterProvider getObjectAdapterProvider() {
+        return getPersistenceSessionService();
+    }
+    
     public PersistenceSessionServiceInternal getPersistenceSessionService() {
         return persistenceSessionServiceInternal;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
index 3d122af..2ec841b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
@@ -166,8 +166,6 @@ public class OneToManyAssociationContributee extends OneToManyAssociationDefault
         return facetHolder;
     }
 
-
-
     private ObjectAdapter getServiceAdapter() {
         return getPersistenceSessionService().adapterFor(servicePojo);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
index e4dd54e..4ecdb15 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
@@ -165,7 +165,7 @@ public class OneToManyAssociationDefault extends ObjectAssociationAbstract imple
         if (collection == null) {
             return null;
         }
-        return getPersistenceSessionService().adapterFor(collection, ownerAdapter, this);
+        return getObjectAdapterProvider().adapterFor(collection, ownerAdapter, this);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
index a9f75f8..bd313fa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -148,27 +148,14 @@ public class OneToOneAssociationDefault extends ObjectAssociationAbstract implem
             return null;
         }
 
-        return getPersistenceSessionService().adapterFor(referencedPojo);
+        return getObjectAdapterProvider().adapterFor(referencedPojo);
     }
 
-    // REVIEW: UNUSED
-    //TODO [ahuber] remove?
-    //    private PropertyAccessContext createAccessInteractionContext(
-    //            final ObjectAdapter ownerAdapter,
-    //            final InteractionInitiatedBy interactionInitiatedBy) {
-    //        final ObjectAdapter referencedAdapter = get(ownerAdapter, interactionInitiatedBy);
-    //        return new PropertyAccessContext(
-    //                ownerAdapter, getIdentifier(), referencedAdapter, interactionInitiatedBy
-    //        );
-    //    }
-
     @Override
     public boolean isEmpty(final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
         return get(ownerAdapter, interactionInitiatedBy) == null;
     }
 
-
-
     // -- Set
     @Override
     public void set(
@@ -285,7 +272,7 @@ public class OneToOneAssociationDefault extends ObjectAssociationAbstract implem
                 getSpecificationLoader(),
                 interactionInitiatedBy);
         List<ObjectAdapter> adapters = _NullSafe.stream(pojoOptions)
-                .map( ObjectAdapter.Functions.adapterForUsing(getPersistenceSessionService()) )
+                .map( ObjectAdapter.Functions.adapterForUsing( getObjectAdapterProvider() ) )
                 .collect(Collectors.toList());
         return adapters.toArray(new ObjectAdapter[]{});
     }
@@ -308,7 +295,7 @@ public class OneToOneAssociationDefault extends ObjectAssociationAbstract implem
         if (pojoOptions != null) {
             final ObjectAdapter[] options = new ObjectAdapter[pojoOptions.length];
             for (int i = 0; i < options.length; i++) {
-                options[i] = getPersistenceSessionService().adapterFor(pojoOptions[i]);
+                options[i] = getObjectAdapterProvider().adapterFor(pojoOptions[i]);
             }
             return options;
         }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
index 8b60acb..da938f6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
@@ -108,7 +108,8 @@ public class CollectionAnnotationFacetFactoryTest extends AbstractFacetFactoryJU
         private void addGetterFacet(final FacetHolder holder) {
             FacetUtil.addFacet(new PropertyOrCollectionAccessorFacetAbstract(mockOnType, holder, mockDeploymentCategoryProvider.getDeploymentCategory(),
                     mockConfiguration,
-                    mockSpecificationLoader, mockAuthenticationSessionProvider,
+                    mockSpecificationLoader, 
+                    mockAuthenticationSessionProvider,
                     mockPersistenceSessionServiceInternal
             ) {
                 @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
index a73be2d..ff774f7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
@@ -118,7 +118,8 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
         private void addGetterFacet(final FacetHolder holder) {
             FacetUtil.addFacet(new PropertyOrCollectionAccessorFacetAbstract(mockOnType, holder, mockDeploymentCategoryProvider.getDeploymentCategory(),
                     mockConfiguration,
-                    mockSpecificationLoader, mockAuthenticationSessionProvider,
+                    mockSpecificationLoader, 
+                    mockAuthenticationSessionProvider,
                     mockPersistenceSessionServiceInternal
             ) {
                 @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
index aa47c93..df614fd 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
@@ -19,10 +19,16 @@
 
 package org.apache.isis.core.metamodel.facets.value;
 
+import static org.apache.isis.core.unittestsupport.jmocking.JMockActions.returnArgument;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
 import java.util.Locale;
 
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.junit.After;
@@ -39,20 +45,13 @@ import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.Encodable
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.parseable.parser.ParseableFacetUsingParser;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
-
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
+import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
-import static org.apache.isis.core.unittestsupport.jmocking.JMockActions.returnArgument;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
 public abstract class ValueSemanticsProviderAbstractTestCase {
 
     @Rule
@@ -69,7 +68,7 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     @Mock
     protected ServicesInjector mockServicesInjector;
     @Mock
-    protected PersistenceSessionServiceInternal mockAdapterManager;
+    protected PersistenceSessionServiceInternal mockSessionServiceInternal;
     @Mock
     protected SpecificationLoader mockSpecificationLoader;
     @Mock
@@ -99,7 +98,7 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
                 will(returnValue(mockAuthenticationSessionProvider));
 
                 allowing(mockServicesInjector).getPersistenceSessionServiceInternal();
-                will(returnValue(mockAdapterManager));
+                will(returnValue(mockSessionServiceInternal));
 
                 allowing(mockServicesInjector).lookupService(AuthenticationSessionProvider.class);
                 will(returnValue(mockAuthenticationSessionProvider));
@@ -107,7 +106,7 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
                 allowing(mockServicesInjector).injectServicesInto(with(any(Object.class)));
 
                 never(mockAuthenticationSessionProvider);
-                never(mockAdapterManager);
+                never(mockSessionServiceInternal);
             }
         });
     }
@@ -128,7 +127,10 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
 
     protected void setValue(final ValueSemanticsProviderAndFacetAbstract<?> value) {
         this.valueSemanticsProvider = value;
-        this.encodeableFacet = new EncodableFacetUsingEncoderDecoder(value, mockFacetHolder, mockAdapterManager,
+        this.encodeableFacet = new EncodableFacetUsingEncoderDecoder(
+                value, 
+                mockFacetHolder, 
+                mockSessionServiceInternal,
                 mockServicesInjector);
         this.parseableFacet = new ParseableFacetUsingParser(value, mockFacetHolder, mockServicesInjector);
     }
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 313c5e0..ecf5bef 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
@@ -32,6 +32,7 @@ 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;
@@ -1946,8 +1947,13 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public AdapterManager adapterManager() {
-        return this;
+    public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
+        return objectAdapterContext.specificationForViewModel(viewModelPojo);
+    }
+
+    @Override
+    public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
+        return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
     }
     
 }
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 b38da77..f5ab46b 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
@@ -32,6 +32,7 @@ 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;
@@ -1939,11 +1940,15 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public AdapterManager adapterManager() {
-        return this;
+    public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
+        return objectAdapterContext.specificationForViewModel(viewModelPojo);
     }
 
-
+    @Override
+    public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
+        return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
+    }
+    
 }
 
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java
index 2638611..f7d944c 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java
@@ -35,12 +35,11 @@ import org.apache.isis.applib.services.command.Command;
 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.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSession;
@@ -56,17 +55,7 @@ import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
 public class PersistenceSessionServiceInternalDefault implements PersistenceSessionServiceInternal {
 
     @Override
-    public ObjectAdapter adapterFor(Object domainObject) {
-        return getPersistenceSession().adapterFor(domainObject);
-    }
-
-    @Override
-    public ObjectAdapter adapterFor(Object pojo, ObjectAdapter parentAdapter, OneToManyAssociation collection) {
-        return getPersistenceSession().adapterFor(pojo, parentAdapter, collection);
-    }
-    
-    @Override
-    public AdapterManager adapterManager() {
+    public ObjectAdapterProvider getObjectAdapterProvider() {
         return getPersistenceSession();
     }
     
@@ -220,7 +209,4 @@ public class PersistenceSessionServiceInternalDefault implements PersistenceSess
     @javax.inject.Inject
     IsisSessionFactory isisSessionFactory;
 
-
-
-
 }
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 b5d5a59..4caa08d 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
@@ -27,6 +27,7 @@ import org.apache.isis.applib.services.bookmark.BookmarkService.FieldResetPolicy
 import org.apache.isis.core.commons.components.SessionScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.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.oid.ParentedCollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -60,6 +61,10 @@ public interface PersistenceSession extends AdapterManager, TransactionalResourc
 
     // -- INTERFACE DECLARATION
     
+    default ObjectAdapterProvider getObjectAdapterProvider() {
+        return this;
+    }
+    
     ObjectAdapter adapterFor(RootOid rootOid);
 
     ObjectAdapter adapterFor(RootOid oid, ConcurrencyChecking concurrencyChecking);
@@ -151,5 +156,4 @@ public interface PersistenceSession extends AdapterManager, TransactionalResourc
     boolean isDestroyed(Object pojo);
 
 
-
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index 7d9c90d..c3cdc1d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -18,12 +18,16 @@
  */
 package org.apache.isis.core.runtime.system.persistence.adaptermanager;
 
+import java.util.UUID;
+import java.util.function.Function;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.IsisAssertException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -47,14 +51,20 @@ public class ObjectAdapterContext {
     
     private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
     private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
+    private final AdapterManager adapterManager; //FIXME[ISIS-1976] remove
     private final ServicesInjector servicesInjector;
+    private final SpecificationLoader specificationLoader;
     
     ObjectAdapterContext(
             ServicesInjector servicesInjector, 
             AuthenticationSession authenticationSession, 
             SpecificationLoader specificationLoader, 
             PersistenceSession persistenceSession) {
+        
+        this.adapterManager = persistenceSession;
         this.servicesInjector = servicesInjector;
+        this.specificationLoader = specificationLoader;
+        
         this.objectAdapterFactories = new ObjectAdapterContext_Factories(
                 authenticationSession, 
                 specificationLoader, 
@@ -191,6 +201,41 @@ public class ObjectAdapterContext {
         oidAdapterMap.add(adapter.getOid(), adapter);
     }
     
+    public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
+        //FIXME[ISIS-1976]
+        // this is horrible, but there's a catch-22 here...
+        // we need an adapter in order to query the state of the object via the metamodel, on the other hand
+        // we can't create an adapter without the identifier, which is what we're trying to derive
+        // so... we create a temporary transient adapter, use it to wrap this adapter and interrogate this pojo,
+        // then throw away that adapter (remove from the adapter map)
+        final boolean[] createdTemporaryAdapter = {false};
+        final ObjectAdapter viewModelAdapter = adapterForViewModel(
+                viewModelPojo, 
+                (ObjectSpecId objectSpecId)->{
+                    createdTemporaryAdapter[0] = true;
+                    return RootOid.create(objectSpecId, UUID.randomUUID().toString()); });
+    
+        final ObjectSpecification spec = viewModelAdapter.getSpecification();
+        
+        if(createdTemporaryAdapter[0]) {
+            adapterManager.removeAdapterFromCache(viewModelAdapter);
+        }
+        return spec;
+    }
+
+    public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
+        ObjectAdapter viewModelAdapter = adapterManager.lookupAdapterFor(viewModelPojo);
+        if(viewModelAdapter == null) {
+            final ObjectSpecification objectSpecification = 
+                    specificationLoader.loadSpecification(viewModelPojo.getClass());
+            final ObjectSpecId objectSpecId = objectSpecification.getSpecId();
+            final RootOid newRootOid = rootOidFactory.apply(objectSpecId);
+
+            viewModelAdapter = adapterManager.addRecreatedPojoToCache(newRootOid, viewModelPojo);
+        }
+        return viewModelAdapter;
+    }
+    
     /**
      * was in PersisenceSessionX, temporarily moved here to successfully compile
      *
@@ -317,7 +362,4 @@ public class ObjectAdapterContext {
 
 
 
-
-
-
 }
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
index 6ff463d..2f01ffa 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
@@ -19,7 +19,6 @@
 package org.apache.isis.core.runtime.system.persistence.adaptermanager;
 
 import java.util.List;
-import java.util.function.Supplier;
 
 import com.google.common.collect.Lists;
 
@@ -79,10 +78,6 @@ public class ObjectAdapterLegacy {
         return objectAdapterContext;
     }
     
-    public static interface ObjectAdapterProvider extends Supplier<ObjectAdapter> {
-        
-    }
-    
     // -- CommandExecutorServiceDefault --------------------------------------------------------
     
     public static class __CommandExecutorServiceDefault {
diff --git a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
index 8d6b07a..6092a5a 100644
--- a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -26,6 +26,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.DisabledException;
 import org.apache.isis.applib.services.wrapper.HiddenException;
@@ -45,6 +48,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 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.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
@@ -68,9 +72,6 @@ import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionMixedIn;
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
 public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandlerDefault<T> {
 
     private final AuthenticationSessionProvider authenticationSessionProvider;
@@ -683,7 +684,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
     }
 
     private ObjectAdapter adapterFor(final Object obj) {
-        return obj != null ? getPersistenceSessionService().adapterFor(obj) : null;
+        return obj != null ? getObjectAdapterProvider().adapterFor(obj) : null;
     }
 
     private Object underlying(final Object arg) {
@@ -825,6 +826,10 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
         return getAuthenticationSessionProvider().getAuthenticationSession();
     }
 
+    protected ObjectAdapterProvider getObjectAdapterProvider() {
+        return persistenceSessionServiceInternal;
+    }
+    
     protected PersistenceSessionServiceInternal getPersistenceSessionService() {
         return persistenceSessionServiceInternal;
     }