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 2019/12/05 14:31:01 UTC

[isis] branch master updated: ISIS-2177: further decouple memento-code from Persistence

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

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


The following commit(s) were added to refs/heads/master by this push:
     new cbbc076  ISIS-2177: further decouple memento-code from Persistence
cbbc076 is described below

commit cbbc07633886b5ce2551bbc1999a249e6d39069a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 5 15:30:44 2019 +0100

    ISIS-2177: further decouple memento-code from Persistence
---
 .../isis/applib/domain/DomainObjectList.java       |  8 +-
 .../org/apache/isis/config/IsisConfiguration.java  |  9 +-
 .../isis/metamodel/adapter/ObjectAdapter.java      | 10 +--
 .../facets/object/entity/EntityFacet.java          |  3 +
 .../apache/isis/metamodel/spec/ManagedObject.java  | 23 +++++-
 .../commands/AbstractDataNucleusObjectCommand.java |  4 -
 .../commands/DataNucleusCreateObjectCommand.java   |  3 +-
 .../commands/DataNucleusDeleteObjectCommand.java   |  7 +-
 .../JdoPersistenceCapableFacetImpl.java            | 12 ++-
 .../objectadapter/ObjectAdapterContext.java        |  4 +-
 .../ObjectAdapterContext_Factories.java            |  8 +-
 .../objectadapter/ObjectAdapterLegacy.java         | 96 ----------------------
 .../persistence/IsisPersistenceSessionJdo.java     | 12 ++-
 .../persistence/IsisTransactionManagerJdo.java     |  7 +-
 .../persistence/PersistenceSession5.java           | 52 ++++--------
 .../adapterfactory/pojo/PojoAdapterTest.java       |  5 +-
 .../transaction/PojoAdapterBuilder.java            | 11 +--
 .../runtime/system/ObjectMemberAbstractTest.java   | 26 +++---
 .../repository/RepositoryServiceDefault.java       | 89 +++++++++++---------
 .../apache/isis/runtime/memento/MementoStore.java  |  5 ++
 .../isis/runtime/memento/MementoStoreLegacy.java   | 29 ++++---
 .../memento/ObjectAdapterMementoCollection.java    |  2 +-
 .../memento/ObjectAdapterMementoDefault.java       | 63 +++++++-------
 .../ObjectAdapterMementoSupport_usingDefault.java  | 13 +--
 .../persistence/adapter/ObjectAdapterForBean.java  |  8 +-
 .../runtime/persistence/adapter/PojoAdapter.java   | 39 ++++-----
 .../transaction/PersistenceCommand.java            |  2 +-
 .../transaction/PersistenceCommandContext.java     | 28 -------
 .../system/persistence/PersistenceSession.java     | 35 +++++---
 .../valuechoices/ValueChoicesSelect2Panel.java     |  6 +-
 30 files changed, 261 insertions(+), 358 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java b/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
index fa76e1e..a693829 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.applib.domain;
 
+import java.util.Iterator;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -60,7 +61,7 @@ import org.apache.isis.applib.jaxbadapters.PersistentEntitiesAdapter;
         cssClassUiEvent = DomainObjectList.CssClassUiEvent.class,
         layoutUiEvent = DomainObjectList.LayoutUiEvent.class
         )
-public class DomainObjectList {
+public class DomainObjectList implements Iterable<Object> {
 
     // -- ui event classes
     public static class TitleUiEvent extends IsisApplibModule.TitleUiEvent<DomainObjectList>{  }
@@ -174,6 +175,11 @@ public class DomainObjectList {
     public void setObjects(final List<Object> objects) {
         this.objects = objects;
     }
+    
+    @Override
+    public Iterator<Object> iterator() {
+        return objects.iterator();
+    }
 
 
 }
diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
index cb6b863..3d45a0f 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
@@ -44,13 +44,13 @@ import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.config.metamodel.facets.CommandActionsConfiguration;
-import org.apache.isis.config.metamodel.facets.PublishActionsConfiguration;
 import org.apache.isis.config.metamodel.facets.AuditObjectsConfiguration;
+import org.apache.isis.config.metamodel.facets.CommandActionsConfiguration;
+import org.apache.isis.config.metamodel.facets.CommandPropertiesConfiguration;
 import org.apache.isis.config.metamodel.facets.DefaultViewConfiguration;
 import org.apache.isis.config.metamodel.facets.EditingObjectsConfiguration;
+import org.apache.isis.config.metamodel.facets.PublishActionsConfiguration;
 import org.apache.isis.config.metamodel.facets.PublishObjectsConfiguration;
-import org.apache.isis.config.metamodel.facets.CommandPropertiesConfiguration;
 import org.apache.isis.config.metamodel.facets.PublishPropertiesConfiguration;
 import org.apache.isis.config.metamodel.services.ApplicationFeaturesInitConfiguration;
 import org.apache.isis.config.metamodel.specloader.IntrospectionMode;
@@ -66,7 +66,6 @@ import lombok.Data;
  * 
  * @since 2.0
  */
-@SuppressWarnings("ConfigurationProperties") // think this is not really an issue...
 @ConfigurationProperties(ConfigurationConstants.ROOT_PREFIX)
 @Data
 public class IsisConfiguration {
@@ -674,7 +673,7 @@ public class IsisConfiguration {
         @Data
         public static class Wicket {
 
-            private String app = "org.apache.isis.viewer.wicket.viewer.IsisWicketApplication";
+            private String app = "org.apache.isis.viewer.wicket.viewer.wicketapp.IsisWicketApplication";
 
             /**
              * Whether the Ajax debug should be shown.
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapter.java
index 7c4b2e8..e1f6c41 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapter.java
@@ -44,11 +44,11 @@ public interface ObjectAdapter extends ManagedObject {
      */
     Oid getOid(); //XXX[2033] referenced by 'metamodel' only to create a bookmark (CommandUtil)
 
-    /**
-     * Returns either itself (if this is a root) or for parented collections, the
-     * adapter corresponding to their {@link ParentedOid#getParentOid() root oid}.
-     */
-    ObjectAdapter getAggregateRoot(); //XXX[2033] not referenced by 'metamodel'
+//    /**
+//     * Returns either itself (if this is a root) or for parented collections, the
+//     * adapter corresponding to their {@link ParentedOid#getParentOid() root oid}.
+//     */
+//    ObjectAdapter getAggregateRoot(); //XXX[2033] not referenced by 'metamodel'
 
     /**
      * Whether this instance belongs to another object (meaning its
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java
index 80d7f9f..f29fa97 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java
@@ -39,6 +39,8 @@ public interface EntityFacet extends Facet {
     
     void refresh(Object pojo);
     
+    void delete(ObjectSpecification spec, Object pojo);
+    
     EntityState getEntityState(Object pojo);
 
     /**
@@ -47,5 +49,6 @@ public interface EntityFacet extends Facet {
      * @return
      */
     boolean isProxyEnhancement(Method method);
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
index f6ee966..c11c9e9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
@@ -34,6 +34,7 @@ import org.apache.isis.commons.internal.base._Tuples.Tuple2;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.adapter.oid.ParentedOid;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.commons.ClassExtensions;
 import org.apache.isis.metamodel.commons.ListExtensions;
@@ -607,6 +608,20 @@ public interface ManagedObject {
 
         throw _Exceptions.unexpectedCodeReach();
     }
+    
+    static void _destroyObjectInTransaction(ManagedObject adapter) {
+        // legacy of
+        //getPersistenceSession().destroyObjectInTransaction(adapter);
+        
+        val spec = adapter.getSpecification();
+        if(spec.isEntity()) {
+            val entityFacet = spec.getFacet(EntityFacet.class);
+            entityFacet.delete(spec, adapter.getPojo());
+            return;
+        }
+
+        throw _Exceptions.unexpectedCodeReach();
+    }
 
     @Deprecated
     static Stream<ManagedObject> _bulkLoadStream(Stream<RootOid> rootOids) {
@@ -623,7 +638,13 @@ public interface ManagedObject {
         //                .map(ManagedObject.class::cast);
     }
 
-
+    static boolean _isParentedCollection(ManagedObject adapter) {
+        
+        //legacy of (FIXME not a perfect match)
+        //getOid() instanceof ParentedOid;
+        
+        return adapter.getSpecification().getBeanSort().isCollection();
+    }
 
 
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/AbstractDataNucleusObjectCommand.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/AbstractDataNucleusObjectCommand.java
index 1d384dd..e163a8d 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/AbstractDataNucleusObjectCommand.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/AbstractDataNucleusObjectCommand.java
@@ -22,7 +22,6 @@ import javax.jdo.PersistenceManager;
 
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommandAbstract;
-import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommandContext;
 
 import lombok.Getter;
 
@@ -39,7 +38,4 @@ public abstract class AbstractDataNucleusObjectCommand extends PersistenceComman
 
     }
 
-    @Override
-    public abstract void execute(final PersistenceCommandContext context);
-
 }
\ No newline at end of file
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/DataNucleusCreateObjectCommand.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/DataNucleusCreateObjectCommand.java
index 3895de3..e66dbd1 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/DataNucleusCreateObjectCommand.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/DataNucleusCreateObjectCommand.java
@@ -22,7 +22,6 @@ import javax.jdo.PersistenceManager;
 
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.runtime.persistence.objectstore.transaction.CreateObjectCommand;
-import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommandContext;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
 
 import lombok.val;
@@ -39,7 +38,7 @@ implements CreateObjectCommand {
 
 
     @Override
-    public void execute(final PersistenceCommandContext context) {
+    public void execute() {
         if (log.isDebugEnabled()) {
             log.debug("create object - executing command for: {}", onManagedObject());
         }
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/DataNucleusDeleteObjectCommand.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/DataNucleusDeleteObjectCommand.java
index 786a0d1..9fa0a92 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/DataNucleusDeleteObjectCommand.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/commands/DataNucleusDeleteObjectCommand.java
@@ -22,19 +22,20 @@ import javax.jdo.PersistenceManager;
 
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
-import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommandContext;
 
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
-public class DataNucleusDeleteObjectCommand extends AbstractDataNucleusObjectCommand implements DestroyObjectCommand {
+public class DataNucleusDeleteObjectCommand 
+extends AbstractDataNucleusObjectCommand 
+implements DestroyObjectCommand {
 
     public DataNucleusDeleteObjectCommand(ManagedObject adapter, PersistenceManager persistenceManager) {
         super(adapter, persistenceManager);
     }
 
     @Override
-    public void execute(final PersistenceCommandContext context) {
+    public void execute() {
         if (log.isDebugEnabled()) {
             log.debug("destroy object - executing command for {}", onManagedObject());
         }
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
index 977575b..6e276b5 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
@@ -30,6 +30,7 @@ import org.apache.isis.persistence.jdo.datanucleus5.metamodel.IsisJdoMetamodelPl
 import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.spec.EntityState;
+import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
 import lombok.val;
@@ -88,8 +89,13 @@ public class JdoPersistenceCapableFacetImpl extends JdoPersistenceCapableFacetAb
         }
         
         val persistenceSession = super.getPersistenceSessionJdo();
-        //TODO don't bypass domain logic !? 
-        persistenceSession.getJdoPersistenceManager().makePersistent(pojo);
+        persistenceSession.makePersistentInTransaction(ManagedObject.of(spec, pojo));
+    }
+    
+    @Override
+    public void delete(ObjectSpecification spec, Object pojo) {
+        val persistenceSession = super.getPersistenceSessionJdo();
+        persistenceSession.destroyObjectInTransaction(ManagedObject.of(spec, pojo));
     }
     
     @Override
@@ -126,4 +132,6 @@ public class JdoPersistenceCapableFacetImpl extends JdoPersistenceCapableFacetAb
     }
 
 
+
+
 }
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java
index 0ba6d8b..9a68cd1 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java
@@ -69,7 +69,6 @@ final public class ObjectAdapterContext {
     @Getter private final SpecificationLoader specificationLoader;
     private final ObjectAdapterContext_ObjectAdapterProvider objectAdapterProviderMixin;
     private final ObjectAdapterContext_NewIdentifier newIdentifierMixin;
-    private final ObjectAdapterContext_DependencyInjection dependencyInjectionMixin;
     private final ServiceInjector serviceInjector;
     final ObjectAdapterContext_ObjectCreation objectCreationMixin;
     private final ObjectAdapterContext_LifecycleEventSupport lifecycleEventMixin;
@@ -84,7 +83,6 @@ final public class ObjectAdapterContext {
 
         this.objectAdapterProviderMixin = new ObjectAdapterContext_ObjectAdapterProvider(this, runtimeContext);
         this.newIdentifierMixin = new ObjectAdapterContext_NewIdentifier(persistenceSession, runtimeContext.getSpecificationLoader());
-        this.dependencyInjectionMixin = new ObjectAdapterContext_DependencyInjection(runtimeContext);
         this.objectCreationMixin = new ObjectAdapterContext_ObjectCreation(this, runtimeContext);
         this.lifecycleEventMixin = new ObjectAdapterContext_LifecycleEventSupport(runtimeContext);
 
@@ -94,7 +92,7 @@ final public class ObjectAdapterContext {
         this.specificationLoader = mmc.getSpecificationLoader();
         this.serviceInjector = mmc.getServiceInjector();
 
-        this.objectAdapterFactories = new ObjectAdapterContext_Factories(persistenceSession);
+        this.objectAdapterFactories = new ObjectAdapterContext_Factories();
     }
 
     // -- DEBUG
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext_Factories.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext_Factories.java
index b15c379..9878ad6 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext_Factories.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext_Factories.java
@@ -19,14 +19,13 @@
 package org.apache.isis.persistence.jdo.datanucleus5.objectadapter;
 
 import org.apache.isis.commons.internal.assertions._Assert;
-import org.apache.isis.persistence.jdo.datanucleus5.objectadapter.ObjectAdapterContext.ObjectAdapterFactories;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.adapter.oid.ParentedOid;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.persistence.jdo.datanucleus5.objectadapter.ObjectAdapterContext.ObjectAdapterFactories;
 import org.apache.isis.runtime.persistence.adapter.PojoAdapter;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.runtime.system.session.IsisSession;
 
 import static org.apache.isis.commons.internal.base._With.requires;
@@ -44,8 +43,6 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 class ObjectAdapterContext_Factories implements ObjectAdapterFactories {
 
-    private final PersistenceSession persistenceSession;
-
     @Override
     public ObjectAdapter createRootAdapter(final Object pojo, RootOid rootOid) {
         requires(rootOid, "rootOid");
@@ -79,7 +76,6 @@ class ObjectAdapterContext_Factories implements ObjectAdapterFactories {
             final Oid oid) {
         return PojoAdapter.of(
                 pojo, oid,
-                IsisSession.currentOrElseNull(),
-                persistenceSession);
+                IsisSession.currentOrElseNull());
     }
 }
\ No newline at end of file
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterLegacy.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterLegacy.java
deleted file mode 100644
index 1b8a9cb..0000000
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterLegacy.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.persistence.jdo.datanucleus5.objectadapter;
-
-import java.util.List;
-
-import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.metamodel.adapter.oid.Oid.Factory;
-import org.apache.isis.metamodel.adapter.oid.RootOid;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.schema.common.v1.CollectionDto;
-import org.apache.isis.schema.common.v1.OidDto;
-import org.apache.isis.schema.common.v1.ValueDto;
-import org.apache.isis.schema.common.v1.ValueType;
-import org.apache.isis.applib.util.schema.CommonDtoUtils;
-
-/**
- * TODO Interim class, expected to be removed, need to smoketest the CommandExecutorServiceDefault first
- */
-@Deprecated
-class ObjectAdapterLegacy {
-
-    // -- CommandExecutorServiceDefault --------------------------------------------------------
-
-    public static class __CommandExecutorServiceDefault {
-
-        public static ObjectAdapter adapterFor(Object targetObject) {
-            if(targetObject instanceof OidDto) {
-                final OidDto oidDto = (OidDto) targetObject;
-                return adapterFor(oidDto);
-            }
-            if(targetObject instanceof CollectionDto) {
-                final CollectionDto collectionDto = (CollectionDto) targetObject;
-                final List<ValueDto> valueDtoList = collectionDto.getValue();
-                final List<Object> pojoList = _Lists.newArrayList();
-                for (final ValueDto valueDto : valueDtoList) {
-                    ValueType valueType = collectionDto.getType();
-                    final Object valueOrOidDto = CommonDtoUtils.getValue(valueDto, valueType);
-                    // converting from adapter and back means we handle both
-                    // collections of references and of values
-                    final ObjectAdapter objectAdapter = adapterFor(valueOrOidDto);
-                    Object pojo = objectAdapter != null ? objectAdapter.getPojo() : null;
-                    pojoList.add(pojo);
-                }
-                return adapterFor(pojoList);
-            }
-            if(targetObject instanceof Bookmark) {
-                final Bookmark bookmark = (Bookmark) targetObject;
-                return adapterFor(bookmark);
-            }
-            return getPersistenceSession().adapterFor(targetObject);
-        }
-
-        private static ObjectAdapter adapterFor(final OidDto oidDto) {
-            final Bookmark bookmark = Bookmark.from(oidDto);
-            return adapterFor(bookmark);
-        }
-
-        private static ObjectAdapter adapterFor(final Bookmark bookmark) {
-            final RootOid rootOid = Factory.ofBookmark(bookmark);
-            return adapterFor(rootOid);
-        }
-
-        private static ObjectAdapter adapterFor(final RootOid rootOid) {
-            return getPersistenceSession().adapterFor(rootOid);
-        }
-
-        private static PersistenceSession getPersistenceSession() {
-            
-            return PersistenceSession.current(PersistenceSession.class)
-            .getFirst()
-            .orElseThrow(_Exceptions::unexpectedCodeReach);
-        }
-
-    }
-
-}
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdo.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdo.java
index 48515a4..21a5e83 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdo.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdo.java
@@ -18,13 +18,17 @@
  */
 package org.apache.isis.persistence.jdo.datanucleus5.persistence;
 
+import org.apache.isis.commons.internal.components.SessionScopedComponent;
+import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.runtime.persistence.objectstore.transaction.TransactionalResource;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
 
 /**
  * 
  * @since 2.0
  */
-public interface IsisPersistenceSessionJdo extends PersistenceSession {
+public interface IsisPersistenceSessionJdo 
+extends PersistenceSession, TransactionalResource, SessionScopedComponent, ObjectAdapterProvider {
 
     /**
      * Not type safe. For type-safe queries use <br/><br/> {@code pm().newNamedQuery(cls, queryName)}
@@ -32,7 +36,7 @@ public interface IsisPersistenceSessionJdo extends PersistenceSession {
      * @param queryName
      * @return
      */
-    default <T> javax.jdo.Query newJdoNamedQuery(Class<T> cls, String queryName){
+    default <T> javax.jdo.Query<T> newJdoNamedQuery(Class<T> cls, String queryName){
         return getJdoPersistenceManager().newNamedQuery(cls, queryName);
     }
 
@@ -41,7 +45,7 @@ public interface IsisPersistenceSessionJdo extends PersistenceSession {
      * @param cls
      * @return
      */
-    default <T> javax.jdo.Query newJdoQuery(Class<T> cls){
+    default <T> javax.jdo.Query<T> newJdoQuery(Class<T> cls){
         return getJdoPersistenceManager().newQuery(cls);
     }
 
@@ -51,7 +55,7 @@ public interface IsisPersistenceSessionJdo extends PersistenceSession {
      * @param filter
      * @return
      */
-    default <T> javax.jdo.Query newJdoQuery(Class<T> cls, String filter){
+    default <T> javax.jdo.Query<T> newJdoQuery(Class<T> cls, String filter){
         return getJdoPersistenceManager().newQuery(cls, filter);
     }
     
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisTransactionManagerJdo.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisTransactionManagerJdo.java
index 61f87df..d049576 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisTransactionManagerJdo.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisTransactionManagerJdo.java
@@ -29,7 +29,6 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.components.SessionScopedComponent;
 import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommand;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.runtime.system.transaction.IsisTransactionAspectSupport;
 import org.apache.isis.runtime.system.transaction.IsisTransactionManagerException;
 import org.apache.isis.runtime.system.transaction.IsisTransactionObject;
@@ -44,13 +43,13 @@ class IsisTransactionManagerJdo implements SessionScopedComponent {
     // -- constructor, fields
 
     @Getter
-    private final PersistenceSession persistenceSession;
+    private final IsisPersistenceSessionJdo persistenceSession;
 
     private final ServiceRegistry serviceRegistry;
     private final CommandContext commandContext;
     private final InteractionContext interactionContext;
 
-    IsisTransactionManagerJdo(ServiceRegistry serviceRegistry, PersistenceSession persistenceSession) {
+    IsisTransactionManagerJdo(ServiceRegistry serviceRegistry, IsisPersistenceSessionJdo persistenceSession) {
 
         this.serviceRegistry = serviceRegistry;
         this.persistenceSession = persistenceSession;
@@ -59,7 +58,7 @@ class IsisTransactionManagerJdo implements SessionScopedComponent {
     }
 
     public IsisTransactionJdo beginTransaction() {
-        return beginTransaction(/*command*/null);
+        return beginTransaction(/*existingCommandIfAny*/null);
     }
 
     /**
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
index 4d74150..11a8c70 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
@@ -49,13 +49,6 @@ import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.commands.DataNucleusCreateObjectCommand;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.commands.DataNucleusDeleteObjectCommand;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryFindAllInstancesProcessor;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryProcessor;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.spi.JdoObjectIdSerializer;
-import org.apache.isis.persistence.jdo.datanucleus5.objectadapter.ObjectAdapterContext;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.ObjectNotFoundException;
@@ -81,6 +74,13 @@ import org.apache.isis.metamodel.spec.EntityState;
 import org.apache.isis.metamodel.spec.FreeStandingList;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.commands.DataNucleusCreateObjectCommand;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.commands.DataNucleusDeleteObjectCommand;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryFindAllInstancesProcessor;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryProcessor;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.spi.JdoObjectIdSerializer;
+import org.apache.isis.persistence.jdo.datanucleus5.objectadapter.ObjectAdapterContext;
 import org.apache.isis.runtime.persistence.FixturesInstalledStateHolder;
 import org.apache.isis.runtime.persistence.NotPersistableException;
 import org.apache.isis.runtime.persistence.UnsupportedFindException;
@@ -91,7 +91,6 @@ import org.apache.isis.runtime.persistence.query.PersistenceQueryFindAllInstance
 import org.apache.isis.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 import org.apache.isis.runtime.services.RequestScopedService;
 import org.apache.isis.runtime.system.persistence.PersistenceQuery;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.security.api.authentication.AuthenticationSession;
 
 import static java.util.Objects.requireNonNull;
@@ -570,31 +569,16 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     // -- makePersistent
 
-    /**
-     * Makes an {@link ObjectAdapter} persistent. The specified object should be
-     * stored away via this object store's persistence mechanism, and have a
-     * new and unique OID assigned to it. The object, should also be added to
-     * the {@link PersistenceSession} as the object is implicitly 'in use'.
-     *
-     * <p>
-     * If the object has any associations then each of these, where they aren't
-     * already persistent, should also be made persistent by recursively calling
-     * this method.
-     *
-     * <p>
-     * If the object to be persisted is a collection, then each element of that
-     * collection, that is not already persistent, should be made persistent by
-     * recursively calling this method.
-     */
+
     @Override
-    public void makePersistentInTransaction(final ObjectAdapter adapter) {
+    public void makePersistentInTransaction(final ManagedObject adapter) {
         
         val pojo = adapter.getPojo();
         
         if (getEntityState(pojo).isAttached()) {
             throw new NotPersistableException("Object already persistent: " + adapter);
         }
-        if (adapter.isParentedCollection()) {
+        if (ManagedObject._isParentedCollection(adapter)) {
             //or should we just ignore this?
             throw new NotPersistableException("Cannot persist parented collection: " + adapter);
         }
@@ -609,15 +593,11 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         });
     }
 
-
     // -- destroyObjectInTransaction
 
-    /**
-     * Removes the specified object from the system. The specified object's data
-     * should be removed from the persistence mechanism.
-     */
+
     @Override
-    public void destroyObjectInTransaction(final ObjectAdapter adapter) {
+    public void destroyObjectInTransaction(final ManagedObject adapter) {
         val spec = adapter.getSpecification();
         if (spec.isParented()) {
             return;
@@ -650,7 +630,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      * </p>
      *
      */
-    private CreateObjectCommand newCreateObjectCommand(final ObjectAdapter adapter) {
+    private CreateObjectCommand newCreateObjectCommand(final ManagedObject adapter) {
 
         ensureOpened();
         
@@ -663,7 +643,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return new DataNucleusCreateObjectCommand(adapter, persistenceManager);
     }
 
-    private DestroyObjectCommand newDestroyObjectCommand(final ObjectAdapter adapter) {
+    private DestroyObjectCommand newDestroyObjectCommand(final ManagedObject adapter) {
         
         ensureOpened();
         
@@ -691,7 +671,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     private void executeCommands(final List<PersistenceCommand> commands) {
 
         for (final PersistenceCommand command : commands) {
-            command.execute(null);
+            command.execute();
         }
         persistenceManager.flush();
     }
@@ -876,7 +856,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     public ObjectAdapter adapterFor(Object pojo) {
         return objectAdapterContext.getObjectAdapterProvider().adapterFor(pojo);
     }
-
+    
     // -- HELPER
     
     private void debugLogNotPersistentIgnoring(Object domainObject) {
diff --git a/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java b/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
index 656d6c1..0aa3f74 100644
--- a/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
+++ b/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
@@ -25,7 +25,6 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
-import org.apache.isis.persistence.jdo.datanucleus5.persistence.PersistenceSession5;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid.Factory;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
@@ -47,7 +46,6 @@ public class PojoAdapterTest {
 
     @Mock private SpecificationLoader mockSpecificationLoader;
     @Mock private AuthenticationSession mockAuthenticationSession;
-    @Mock private PersistenceSession5 mockPersistenceSession;
 
     @Before
     public void setUp() throws Exception {
@@ -56,8 +54,7 @@ public class PojoAdapterTest {
         adapter = PojoAdapter.of(
                 domainObject, 
                 Factory.persistentOf(ObjectSpecId.of("CUS"), "1"),
-                mockSpecificationLoader, 
-                mockPersistenceSession);
+                mockSpecificationLoader);
 
         allowUnimportantMethodCallsOn();
     }
diff --git a/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java b/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
index e2650d5..1a627f9 100644
--- a/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
+++ b/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
@@ -22,7 +22,6 @@ package org.apache.isis.runtime.persistence.objectstore.transaction;
 import java.util.Iterator;
 
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.persistence.jdo.datanucleus5.persistence.PersistenceSession5;
 import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.adapter.oid.Oid.Factory;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
@@ -34,8 +33,6 @@ import lombok.val;
 
 public class PojoAdapterBuilder {
 
-    private PersistenceSession5 persistenceSession;
-
     private PojoAdapterBuilder(){
     }
 
@@ -146,11 +143,6 @@ public class PojoAdapterBuilder {
         return this;
     }
 
-    public PojoAdapterBuilder with(PersistenceSession5 persistenceSession) {
-        this.persistenceSession = persistenceSession;
-        return this;
-    }
-
     public PojoAdapterBuilder with(SpecificationLoader specificationLoader) {
         this.specificationLoader = specificationLoader;
         return this;
@@ -159,8 +151,7 @@ public class PojoAdapterBuilder {
     public PojoAdapter build() {
         val rootOid = persistence.createOid(objectSpecId, identifier);
         val oid = type.oidFor(rootOid, objectSpecId, aggregatedId);
-        val pojoAdapter = PojoAdapter.of(pojo, oid,
-                specificationLoader, persistenceSession);
+        val pojoAdapter = PojoAdapter.of(pojo, oid, specificationLoader);
         return pojoAdapter;
     }
 
diff --git a/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/system/ObjectMemberAbstractTest.java b/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/system/ObjectMemberAbstractTest.java
index 5d03d9f..4b801a9 100644
--- a/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/system/ObjectMemberAbstractTest.java
+++ b/core/persistence/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/system/ObjectMemberAbstractTest.java
@@ -19,6 +19,13 @@
 
 package org.apache.isis.runtime.system;
 
+import org.datanucleus.enhancement.Persistable;
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.MetaModelContext_forTesting;
@@ -51,15 +58,15 @@ import org.apache.isis.security.api.authentication.AuthenticationSession;
 import org.apache.isis.security.api.authentication.AuthenticationSessionProvider;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-import org.datanucleus.enhancement.Persistable;
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.emptyString;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 public class ObjectMemberAbstractTest {
 
@@ -95,8 +102,7 @@ public class ObjectMemberAbstractTest {
         persistentAdapter = PojoAdapter.of(
                 mockPersistable,
                 Factory.persistentOf(ObjectSpecId.of("CUS"), "1"),
-                mockSpecificationLoader,
-                null);
+                mockSpecificationLoader);
 
 
         transientAdapter = PojoAdapterBuilder.create()
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/repository/RepositoryServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/repository/RepositoryServiceDefault.java
index 788a625..0b2b813 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/repository/RepositoryServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/repository/RepositoryServiceDefault.java
@@ -42,7 +42,7 @@ import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
 
@@ -54,8 +54,8 @@ public class RepositoryServiceDefault implements RepositoryService {
     @Inject private FactoryService factoryService;
     @Inject private WrapperFactory wrapperFactory;
     @Inject private TransactionService transactionService;
-    @Inject private MetaModelContext metaModelContext;
     @Inject private IsisConfiguration isisConfiguration;
+    @Inject private ObjectManager objectManager; 
     
     private boolean autoFlush;
 
@@ -74,48 +74,41 @@ public class RepositoryServiceDefault implements RepositoryService {
     @Override
     public boolean isPersistent(final Object domainObject) {
         
-        val adapter = metaModelContext.getObjectManager().adapt(unwrapped(domainObject));
-        
-        val spec = adapter.getSpecification();
-        if(spec.isManagedBean() || spec.isViewModel()) {
-            // services and view models are treated as persistent objects
-            //FIXME bad design: this method should instead throw an IllegalArgEx. when called with non entity types!
-            return true; 
-        }
-        
-        val entityState = ManagedObject._entityState(adapter);
-        val isRepresentingPersistent = entityState!=null 
-                && (entityState.isAttached() || entityState.isDestroyed());
-        return isRepresentingPersistent;
+        val adapter = objectManager.adapt(unwrapped(domainObject));
+        return isPersistentObject(adapter);
     }
 
     @Override
     public boolean isDeleted(final Object domainObject) {
-        val adapter = metaModelContext.getObjectManager().adapt(unwrapped(domainObject));
+        val adapter = objectManager.adapt(unwrapped(domainObject));
         return ManagedObject._isDestroyed(adapter);
     }
 
 
     @Override
-    public <T> T persist(final T object) {
-        if (isPersistent(object)) {
-            return object;
-        }
-        val adapter = getPersistenceSession().adapterFor(unwrapped(object));
-
+    public <T> T persist(final T domainObject) {
+        
+        val adapter = objectManager.adapt(unwrapped(domainObject));
         if(adapter == null) {
             throw new PersistFailedException("Object not known to framework (unable to create/obtain an adapter)");
         }
-        if (adapter.isParentedCollection()) {
-            // TODO check aggregation is supported
-            return  object;
-        }
-        if (isPersistent(object)) {
-            throw new PersistFailedException("Object already persistent; OID=" + adapter.getOid());
+        if (isPersistentObject(adapter)) {
+            return domainObject;
         }
-        getPersistenceSession().makePersistentInTransaction(adapter);
-
-        return object;
+        ManagedObject._makePersistentInTransaction(adapter);
+
+//legacy of        
+//        if (ManagedObject._isParentedCollection(adapter)) {
+//            // TODO check aggregation is supported
+//            return domainObject;
+//        }
+//        if (isPersistentObject(adapter)) {
+//            val oid = ManagedObject._identify(adapter);
+//            throw new PersistFailedException("Object already persistent; OID=" + oid);
+//        }
+//        getPersistenceSession().makePersistentInTransaction(adapter);
+
+        return domainObject;
     }
 
 
@@ -132,18 +125,16 @@ public class RepositoryServiceDefault implements RepositoryService {
     }
 
     private void removeIfNotAlready(final Object object) {
-        if (!isPersistent(object)) {
-            return;
-        }
         if (object == null) {
             throw new IllegalArgumentException("Must specify a reference for disposing an object");
         }
-        val adapter = getPersistenceSession().adapterFor(unwrapped(object));
-        if (!isPersistent(object)) {
-            throw new RepositoryException("Object not persistent: " + adapter);
+        val adapter = objectManager.adapt(unwrapped(object));
+        if (!isPersistentObject(adapter)) {
+            return;
         }
-
-        getPersistenceSession().destroyObjectInTransaction(adapter);
+        ManagedObject._destroyObjectInTransaction(adapter);
+        // legacy of
+        //getPersistenceSession().destroyObjectInTransaction(adapter);
     }
 
     @Override
@@ -226,13 +217,31 @@ public class RepositoryServiceDefault implements RepositoryService {
         final List<T> instances = allMatches(query); // No need to fetch more than 2.
         return firstInstanceElseEmpty(instances);
     }
-
+    
+    // -- HELPER
+    
     private static <T> Optional<T> firstInstanceElseEmpty(final List<T> instances) {
         return instances.size() == 0
                 ? Optional.empty()
                 : Optional.of(instances.get(0));
     }
 
+    private boolean isPersistentObject(ManagedObject adapter) {
+        
+        val spec = adapter.getSpecification();
+        if(spec.isManagedBean() || spec.isViewModel()) {
+            // services and view models are treated as persistent objects
+            //FIXME bad design: this method should instead throw an IllegalArgEx
+            // when called with non entity types
+            return true; 
+        }
+        
+        val entityState = ManagedObject._entityState(adapter);
+        val isRepresentingPersistent = entityState!=null 
+                && (entityState.isAttached() || entityState.isDestroyed());
+        return isRepresentingPersistent;
+    }
+    
 
     private Object unwrapped(Object domainObject) {
         return wrapperFactory != null ? wrapperFactory.unwrap(domainObject) : domainObject;
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStore.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStore.java
index c21e0c7..44bb6c5 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStore.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStore.java
@@ -1,7 +1,10 @@
 package org.apache.isis.runtime.memento;
 
+import java.util.List;
+
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid;
+import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
 /**
@@ -14,4 +17,6 @@ public interface MementoStore {
     // -- TODO remove ObjectAdapter references from API
     ObjectAdapter adapterOfMemento(ObjectSpecification spec, Oid oid, Data data);
 
+    ManagedObject adapterForListOfPojos(List<Object> listOfPojos);
+
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java
index 9bf7084..675fd11 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java
@@ -19,15 +19,18 @@
 package org.apache.isis.runtime.memento;
 
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.apache.isis.applib.domain.DomainObjectList;
 import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.adapter.oid.ParentedOid;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
@@ -63,10 +66,10 @@ import lombok.extern.log4j.Log4j2;
  * @since 2.0
  */
 @Log4j2 @RequiredArgsConstructor
-class MementoStoreLegacy implements MementoStore {
+final class MementoStoreLegacy implements MementoStore {
 
     private final ObjectManager objectManager;
-    private final PersistenceSession persistenceSession;
+    private final ObjectAdapterProvider objectAdapterProvider;
     private final SpecificationLoader specificationLoader;
 
     @Override
@@ -88,14 +91,13 @@ class MementoStoreLegacy implements MementoStore {
             final ParentedOid collectionOid = (ParentedOid) oid;
             adapter = PojoAdapter.of(
                     collectionPojo, collectionOid,
-                    IsisSession.currentOrElseNull(),
-                    persistenceSession);
+                    IsisSession.currentOrElseNull());
 
         } else {
             _Assert.assertTrue("oid must be a RootOid representing an object because spec is not a collection and cannot be a value", oid instanceof RootOid);
             RootOid typedOid = (RootOid) oid;
             // recreate an adapter for the original OID
-            adapter = persistenceSession.adapterFor(typedOid);
+            adapter = objectAdapterProvider.adapterFor(typedOid);
 
             updateObject(adapter, data);
         }
@@ -106,22 +108,27 @@ class MementoStoreLegacy implements MementoStore {
         return adapter;
     }
     
+    @Override
+    public ManagedObject adapterForListOfPojos(List<Object> listOfPojos) {
+        
+        val domainObjectList = new DomainObjectList();
+        domainObjectList.setObjects(listOfPojos);
+        return ManagedObject._adapterOfList(specificationLoader, domainObjectList);
+    }
+    
     // -- HELPER
     
     private Object instantiateAndInjectServices(ObjectSpecification spec) {
         
         val objectCreateRequest = ObjectCreator.Request.of(spec);
         return objectManager.createObject(objectCreateRequest);
-        
-        // legacy of
-        //return dependencyInjectionMixin.instantiateAndInjectServices(objectSpec);
     }
 
     private ManagedObject recreateReference(Data data) {
         // handle values
         if (data instanceof StandaloneData) {
             val standaloneData = (StandaloneData) data;
-            return standaloneData.getAdapter(persistenceSession, specificationLoader);
+            return standaloneData.getAdapter(objectAdapterProvider, specificationLoader);
         }
 
         // reference to entity
@@ -130,7 +137,7 @@ class MementoStoreLegacy implements MementoStore {
         _Assert.assertTrue("can only create a reference to an entity", oid instanceof RootOid);
 
         val rootOid = (RootOid) oid;
-        val referencedAdapter = persistenceSession.adapterFor(rootOid);
+        val referencedAdapter = objectAdapterProvider.adapterFor(rootOid);
 
         if (data instanceof ObjectData) {
             if (rootOid.isTransient()) {
@@ -178,7 +185,7 @@ class MementoStoreLegacy implements MementoStore {
             updateFields(objectAdapter, data);
             
         } else if (dataIsTransient 
-                && persistenceSession.getEntityState(objectAdapter.getPojo()).isDetached()) {
+                && ManagedObject._entityState(objectAdapter).isDetached()) {
             updateFields(objectAdapter, data);
 
         } else if (objectAdapter.isParentedCollection()) {
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoCollection.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoCollection.java
index 051f882..3a5741b 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoCollection.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoCollection.java
@@ -57,7 +57,7 @@ final class ObjectAdapterMementoCollection implements ObjectAdapterMemento {
               .filter(_NullSafe::isPresent)
               .collect(Collectors.toCollection(ArrayList::new));
         
-        return IsisContext.getPersistenceSession().get().adapterFor(listOfPojos);
+        return mementoStore.adapterForListOfPojos(listOfPojos);
     }
 
     @Override
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
index 9229e62..e9b39de 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
@@ -72,47 +72,47 @@ final class ObjectAdapterMementoDefault implements Serializable {
     /**
      * Factory method
      */
-    public static ObjectAdapterMementoDefault createPersistent(
+    static ObjectAdapterMementoDefault createPersistent(
             RootOid rootOid, 
             SpecificationLoader specificationLoader) {
         
         return new ObjectAdapterMementoDefault(rootOid, specificationLoader);
     }
 
-    public static ObjectAdapterMementoDefault createForList(
+    static ObjectAdapterMementoDefault createForList(
             ArrayList<ObjectAdapterMementoDefault> list,
             ObjectSpecId objectSpecId) {
         
         return new ObjectAdapterMementoDefault(list, objectSpecId);
     }
 
-    public static ObjectAdapterMementoDefault createForList(
+    static ObjectAdapterMementoDefault createForList(
             Collection<ObjectAdapterMementoDefault> list,
             ObjectSpecId objectSpecId) {
         
         return list != null ? createForList(_Lists.newArrayList(list), objectSpecId) :  null;
     }
 
-    public static ObjectAdapterMementoDefault createForIterable(
-            Iterable<?> iterable,
-            ObjectSpecId specId,
-            PersistenceSession persistenceSession) {
-        
-        final List<ObjectAdapterMementoDefault> listOfMementos =
-                _NullSafe.stream(iterable)
-                .map(Functions.fromPojo(persistenceSession))
-                .collect(Collectors.toList());
-        return createForList(listOfMementos, specId);
-    }
-
-    public static ObjectAdapterMementoDefault createForEncodeable(
+//    static ObjectAdapterMementoDefault createForIterable(
+//            Iterable<?> iterable,
+//            ObjectSpecId specId,
+//            ObjectAdapterProvider objectAdapterProvider) {
+//        
+//        final List<ObjectAdapterMementoDefault> listOfMementos =
+//                _NullSafe.stream(iterable)
+//                .map(Functions.fromPojo(objectAdapterProvider))
+//                .collect(Collectors.toList());
+//        return createForList(listOfMementos, specId);
+//    }
+
+    static ObjectAdapterMementoDefault createForEncodeable(
             ObjectSpecId specId,
             String encodableValue) {
         
         return new ObjectAdapterMementoDefault(specId, encodableValue);
     }
 
-    public enum Cardinality {
+    enum Cardinality {
         /**
          * represents a single object
          */
@@ -163,9 +163,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
                 final List<Object> listOfPojos =
                         _Lists.map(memento.list, Functions.toPojo(mementoStore, specificationLoader));
 
-                PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
-                
-                return persistenceSession.adapterFor(listOfPojos);
+                return mementoStore.adapterForListOfPojos(listOfPojos);
             }
 
             @Override
@@ -519,17 +517,17 @@ final class ObjectAdapterMementoDefault implements Serializable {
         recreateStrategy = RecreateStrategy.LOOKUP;
     }
 
-    public Cardinality getCardinality() {
+    Cardinality getCardinality() {
         return cardinality;
     }
 
-    public ArrayList<ObjectAdapterMementoDefault> getList() {
+    ArrayList<ObjectAdapterMementoDefault> getList() {
         ensureVector();
         return list;
     }
 
 
-    public void resetVersion(
+    void resetVersion(
             MementoStore mementoStore,
             SpecificationLoader specificationLoader) {
         
@@ -538,12 +536,12 @@ final class ObjectAdapterMementoDefault implements Serializable {
     }
 
 
-    public Bookmark asBookmark() {
+    Bookmark asBookmark() {
         ensureScalar();
         return bookmark;
     }
 
-    public Bookmark asHintingBookmark() {
+    Bookmark asHintingBookmark() {
         val bookmark = asBookmark();
         return hintId != null && bookmark != null
                 ? new HintStore.BookmarkWithHintId(bookmark, hintId)
@@ -560,7 +558,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
      * best to call once and then hold onto the value thereafter. Alternatively,
      * can call {@link #setAdapter(ManagedObject)} to keep this memento in sync.
      */
-    public ManagedObject getObjectAdapter(
+    ManagedObject getObjectAdapter(
             MementoStore mementoStore,
             SpecificationLoader specificationLoader) {
         
@@ -583,12 +581,12 @@ final class ObjectAdapterMementoDefault implements Serializable {
      *
      * @param adapter
      */
-    public void setAdapter(ManagedObject adapter) {
+    void setAdapter(ManagedObject adapter) {
         ensureScalar();
         init(adapter);
     }
 
-    public ObjectSpecId getObjectSpecId() {
+    ObjectSpecId getObjectSpecId() {
         return objectSpecId;
     }
 
@@ -596,7 +594,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
      * Analogous to {@link List#contains(Object)}, but does not perform
      * {@link ConcurrencyChecking concurrency checking} of the OID.
      */
-    public boolean containedIn(
+    boolean containedIn(
             List<ObjectAdapterMementoDefault> mementos,
             MementoStore mementoStore,
             SpecificationLoader specificationLoader) {
@@ -643,9 +641,11 @@ final class ObjectAdapterMementoDefault implements Serializable {
     // -- FUNCTIONS
 
     @NoArgsConstructor(access = AccessLevel.PRIVATE)
-    public final static class Functions {
+    final static class Functions {
 
-        public static Function<Object, ObjectAdapterMementoDefault> fromPojo(final ObjectAdapterProvider adapterProvider) {
+        public static Function<Object, ObjectAdapterMementoDefault> fromPojo(
+                final ObjectAdapterProvider adapterProvider) {
+            
             return pojo->ObjectAdapterMementoDefault.createOrNull( adapterProvider.adapterFor(pojo) );
         }
 
@@ -690,5 +690,4 @@ final class ObjectAdapterMementoDefault implements Serializable {
     }
 
 
-
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
index 5252021..acf41f5 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
@@ -18,19 +18,15 @@
  */
 package org.apache.isis.runtime.memento;
 
-import java.util.UUID;
-
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.ioc.BeanSort;
+import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.objectmanager.ObjectManager;
-import org.apache.isis.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
@@ -70,8 +66,7 @@ implements ObjectAdapterMementoSupport {
 
     @Override
     public ObjectAdapterMemento mementoForPojo(Object pojo) {
-        val ps = IsisContext.getPersistenceSession().get();
-        val adapter = ps.adapterFor(pojo);
+        val adapter = objectManager.adapt(pojo);
         return mementoForAdapter(adapter);
     }
 
@@ -81,8 +76,8 @@ implements ObjectAdapterMementoSupport {
             return null;
         }
         if(mementoStore==null) {
-            val ps = IsisContext.getPersistenceSession().get();
-            mementoStore = new MementoStoreLegacy(objectManager, ps, specificationLoader);
+            val objectAdapterProvider = (ObjectAdapterProvider) IsisContext.getPersistenceSession().get();
+            mementoStore = new MementoStoreLegacy(objectManager, objectAdapterProvider, specificationLoader);
         }
         
         
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/adapter/ObjectAdapterForBean.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/adapter/ObjectAdapterForBean.java
index 01eca8a..c2979f6 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/adapter/ObjectAdapterForBean.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/adapter/ObjectAdapterForBean.java
@@ -56,10 +56,10 @@ public class ObjectAdapterForBean implements ObjectAdapter {
         return Oid.Factory.persistentOf(spec.getSpecId(), bean.getId());
     }
 
-    @Override
-    public ObjectAdapter getAggregateRoot() {
-        return this;
-    }
+//    @Override
+//    public ObjectAdapter getAggregateRoot() {
+//        return this;
+//    }
 
     @Override
     public String toString() {
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/adapter/PojoAdapter.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/adapter/PojoAdapter.java
index a8dad57..1b387bf 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/adapter/PojoAdapter.java
@@ -27,12 +27,10 @@ import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid;
-import org.apache.isis.metamodel.adapter.oid.ParentedOid;
 import org.apache.isis.metamodel.commons.ToString;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.runtime.system.session.IsisSession;
 
 import static org.apache.isis.commons.internal.base._With.requires;
@@ -43,7 +41,6 @@ import lombok.val;
 public final class PojoAdapter implements ObjectAdapter {
 
     private final SpecificationLoader specificationLoader;
-    private final PersistenceSession persistenceSession;
 
     @Getter(onMethod = @__(@Override)) private final Object pojo;
     @Getter(onMethod = @__(@Override)) private final Oid oid;
@@ -54,7 +51,7 @@ public final class PojoAdapter implements ObjectAdapter {
             final Object pojo,
             final Oid oid) {
 
-        return of(pojo, oid, IsisSession.currentOrElseNull(), null);
+        return of(pojo, oid, IsisSession.currentOrElseNull());
     }
 
     public static PojoAdapter ofValue(Serializable value) {
@@ -70,32 +67,28 @@ public final class PojoAdapter implements ObjectAdapter {
     public static PojoAdapter of(
             final Object pojo,
             final Oid oid,
-            final IsisSession isisSession,
-            final PersistenceSession persistenceSession) {
+            final IsisSession isisSession) {
 
         val specificationLoader = isisSession.getSpecificationLoader();
 
-        return new PojoAdapter(pojo, oid, specificationLoader, persistenceSession);
+        return new PojoAdapter(pojo, oid, specificationLoader);
     }
 
     public static PojoAdapter of(
             final Object pojo,
             final Oid oid,
-            final SpecificationLoader specificationLoader,
-            final PersistenceSession persistenceSession) {
-        return new PojoAdapter(pojo, oid, specificationLoader, persistenceSession);
+            final SpecificationLoader specificationLoader) {
+        return new PojoAdapter(pojo, oid, specificationLoader);
     }
 
     private PojoAdapter(
             final Object pojo,
             final Oid oid,
-            final SpecificationLoader specificationLoader,
-            final PersistenceSession persistenceSession) {
+            final SpecificationLoader specificationLoader) {
 
         Objects.requireNonNull(pojo);
 
         this.specificationLoader = specificationLoader;
-        this.persistenceSession = persistenceSession;
 
         if (pojo instanceof ObjectAdapter) {
             throw new IsisException("ObjectAdapter can't be used to wrap an ObjectAdapter: " + pojo);
@@ -125,16 +118,16 @@ public final class PojoAdapter implements ObjectAdapter {
 
     // -- getAggregateRoot
     
-    @Override
-    public ObjectAdapter getAggregateRoot() {
-        if(!isParentedCollection()) {
-            return this;
-        }
-        val collectionOid = (ParentedOid) oid;
-        val rootOid = collectionOid.getParentOid();
-        val rootAdapter = persistenceSession.adapterFor(rootOid);
-        return rootAdapter;
-    }
+//    @Override
+//    public ObjectAdapter getAggregateRoot() {
+//        if(!isParentedCollection()) {
+//            return this;
+//        }
+//        val collectionOid = (ParentedOid) oid;
+//        val rootOid = collectionOid.getParentOid();
+//        val rootAdapter = persistenceSession.adapterFor(rootOid);
+//        return rootAdapter;
+//    }
 
     @Override
     public String toString() {
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/objectstore/transaction/PersistenceCommand.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/objectstore/transaction/PersistenceCommand.java
index c0fdfc3..0eface0 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/objectstore/transaction/PersistenceCommand.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/objectstore/transaction/PersistenceCommand.java
@@ -22,7 +22,7 @@ package org.apache.isis.runtime.persistence.objectstore.transaction;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
 public interface PersistenceCommand {
-    void execute(PersistenceCommandContext context);
+    void execute();
 
     ManagedObject onManagedObject();
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/objectstore/transaction/PersistenceCommandContext.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/objectstore/transaction/PersistenceCommandContext.java
deleted file mode 100644
index 8be4ae8..0000000
--- a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/objectstore/transaction/PersistenceCommandContext.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.runtime.persistence.objectstore.transaction;
-
-public interface PersistenceCommandContext {
-
-    void start();
-
-    void end();
-
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/PersistenceSession.java
index 5057f90..fe07d42 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/PersistenceSession.java
@@ -25,20 +25,14 @@ import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.components.SessionScopedComponent;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.EntityState;
+import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommand;
-import org.apache.isis.runtime.persistence.objectstore.transaction.TransactionalResource;
 
-public interface PersistenceSession 
-extends 
-ObjectAdapterProvider,
-TransactionalResource, 
-SessionScopedComponent {
+public interface PersistenceSession {
 
     // -------------------------------------------------------------------------------------------------
     // -- STABLE API (DRAFT)
@@ -106,8 +100,29 @@ SessionScopedComponent {
     <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query);
     <T> ObjectAdapter firstMatchingQuery(final Query<T> query);
 
-    void destroyObjectInTransaction(ObjectAdapter adapter);
-    void makePersistentInTransaction(ObjectAdapter adapter);
+    /**
+     * Removes the specified object from the system. The specified object's data
+     * should be removed from the persistence mechanism.
+     */
+    void destroyObjectInTransaction(ManagedObject adapter);
+    
+    /**
+     * Makes an {@link ManagedObject} persistent. The specified object should be
+     * stored away via this object store's persistence mechanism, and have a
+     * new and unique OID assigned to it. The object, should also be added to
+     * the {@link PersistenceSession} as the object is implicitly 'in use'.
+     *
+     * <p>
+     * If the object has any associations then each of these, where they aren't
+     * already persistent, should also be made persistent by recursively calling
+     * this method.
+     *
+     * <p>
+     * If the object to be persisted is a collection, then each element of that
+     * collection, that is not already persistent, should be made persistent by
+     * recursively calling this method.
+     */
+    void makePersistentInTransaction(ManagedObject adapter);
 
     // -- OTHERS
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index d935d5d..9d2f223 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -98,9 +98,9 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract {
 
     @Override
     protected IModel<String> obtainInlinePromptModel() {
-        ObjectAdapterMemento modelObject = select2.getModelObject();
-        String str = modelObject != null ? modelObject.asString(): null;
-        return Model.of(str);
+        ObjectAdapterMemento inlinePromptMemento = select2.getModelObject();
+        String inlinePrompt = inlinePromptMemento != null ? inlinePromptMemento.asString(): null;
+        return Model.of(inlinePrompt);
     }