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 2022/08/27 13:28:00 UTC

[isis] branch master updated: ISIS-3167: refactor ManagedObjects nested utils into their own files

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 67a4569593 ISIS-3167: refactor ManagedObjects nested utils into their own files
67a4569593 is described below

commit 67a4569593a841dec8242c6120439fcd1219a630
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Aug 27 15:27:53 2022 +0200

    ISIS-3167: refactor ManagedObjects nested utils into their own files
    
    - prefixed with Mm .. short for metamodel
---
 .../core/metamodel/facets/DomainEventHelper.java   |  10 +-
 .../core/metamodel/facets/ImperativeAspect.java    |   3 +-
 ...ctionInvocationFacetForDomainEventAbstract.java |   6 +-
 .../ActionParameterValidationFacetViaMethod.java   |   4 +-
 .../method/ActionValidationFacetViaMethod.java     |   6 +-
 .../facets/collections/CollectionFacet.java        |   4 +-
 .../CollectionAccessorFacetViaAccessor.java        |   7 +-
 .../method/DisableForContextFacetViaMethod.java    |   4 +-
 .../method/HideForContextFacetViaMethod.java       |   4 +-
 .../autocomplete/AutoCompleteFacetAbstract.java    |   4 +-
 .../object/callbacks/CallbackFacetAbstract.java    |   4 +-
 .../choices/ChoicesFacetFromBoundedAbstract.java   |   4 +-
 .../facets/object/value/CompositeValueUpdater.java |   6 +-
 .../mandatory/MandatoryFacetAbstract.java          |   4 +-
 .../objectvalue/maxlen/MaxLengthFacetAbstract.java |   4 +-
 .../ActionParameterAutoCompleteFacetViaMethod.java |   5 +-
 .../ActionParameterChoicesFacetViaMethod.java      |   5 +-
 .../ActionParameterDefaultsFacetViaMethod.java     |   6 +-
 .../ActionParameterDisabledFacetViaMethod.java     |   6 +-
 .../ActionParameterHiddenFacetViaMethod.java       |   6 +-
 .../ActionParameterValidationFacetViaMethod.java   |   6 +-
 .../accessor/PropertyAccessorFacetViaAccessor.java |   7 +-
 .../method/PropertyAutoCompleteFacetMethod.java    |   7 +-
 .../method/PropertyChoicesFacetViaMethod.java      |   3 +-
 .../method/PropertyDefaultFacetViaMethod.java      |   4 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java |   4 +-
 .../clear/PropertyClearFacetViaClearMethod.java    |   4 +-
 .../clear/PropertyClearFacetViaSetterMethod.java   |   4 +-
 ...PropertyInitializationFacetViaSetterMethod.java |   4 +-
 .../modify/PropertySetterFacetViaSetterMethod.java |   4 +-
 .../method/PropertyValidateFacetViaMethod.java     |   4 +-
 .../interactions/ActionArgUsabilityContext.java    |   6 +-
 .../interactions/ActionArgValidityContext.java     |   6 +-
 .../interactions/ActionArgVisibilityContext.java   |   6 +-
 .../interactions/ActionUsabilityContext.java       |   4 +-
 .../interactions/ActionValidityContext.java        |   4 +-
 .../interactions/ActionVisibilityContext.java      |   4 +-
 .../interactions/CollectionAccessContext.java      |   4 +-
 .../interactions/CollectionVisibilityContext.java  |   4 +-
 .../metamodel/interactions/ObjectTitleContext.java |   4 +-
 .../interactions/ObjectValidityContext.java        |   4 +-
 .../interactions/ObjectVisibilityContext.java      |   4 +-
 .../metamodel/interactions/ParseValueContext.java  |   6 +-
 .../interactions/PropertyAccessContext.java        |   6 +-
 .../interactions/PropertyModifyContext.java        |   6 +-
 .../interactions/PropertyUsabilityContext.java     |   4 +-
 .../interactions/PropertyVisibilityContext.java    |   4 +-
 .../interactions/managed/ManagedMember.java        |   4 +-
 .../managed/ParameterNegotiationModel.java         |   4 +-
 .../managed/PropertyNegotiationModel.java          |   4 +-
 .../interactions/managed/_BindingUtil.java         |   8 +-
 .../interactions/managed/nonscalar/DataRow.java    |   4 +-
 .../isis/core/metamodel/object/ManagedObject.java  |  25 +-
 .../isis/core/metamodel/object/ManagedObjects.java | 643 +--------------------
 .../isis/core/metamodel/object/MmEntityUtil.java   | 239 ++++++++
 .../isis/core/metamodel/object/MmInvokeUtil.java   | 177 ++++++
 .../isis/core/metamodel/object/MmUnwrapUtil.java   | 126 ++++
 .../core/metamodel/object/MmVisibilityUtil.java    | 130 +++++
 .../core/metamodel/object/_InternalTitleUtil.java  | 123 ++++
 .../objectlifecycle/PropertyChangeRecord.java      |   4 +-
 .../services/title/TitleServiceDefault.java        |   4 +-
 .../specimpl/OneToOneAssociationDefault.java       |   4 +-
 .../metamodel/facets/ObjectAdapterUtilsTest.java   |  12 +-
 .../executor/MemberExecutorServiceDefault.java     |  20 +-
 .../isis/core/runtimeservices/executor/_Xray.java  |   6 +-
 .../repository/RepositoryServiceDefault.java       |  16 +-
 .../handlers/DomainObjectInvocationHandler.java    |  12 +-
 .../pdfjs/wkt/ui/components/PdfJsViewerPanel.java  |   4 +-
 .../changetracking/EntityChangeTrackerDefault.java |   3 +-
 .../interact/CollectionInteractionTest.java        |   4 +-
 .../JpaGeneratedLongIdEntityLifecycleTest.java     |  12 +-
 ...JpaNonGeneratedStringIdEntityLifecycleTest.java |  12 +-
 .../util/interaction/DataTableTester.java          |  12 +-
 .../interaction/DomainObjectTesterFactory.java     |   8 +-
 .../binding/BindingConverterForManagedObject.java  |   4 +-
 .../viewer/commons/model/object/ObjectUiModel.java |   4 +-
 .../resources/DomainObjectResourceServerside.java  |   6 +-
 .../wicket/model/models/ScalarUnwrappingModel.java |   4 +-
 .../models/interaction/BookmarkedObjectWkt.java    |   4 +-
 .../summary/CollectionContentsAsSummary.java       |   4 +-
 .../entity/icontitle/EntityIconAndTitlePanel.java  |   4 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   4 +-
 82 files changed, 1018 insertions(+), 865 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
index 30f75fdfdc..4c231c544c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
@@ -41,7 +41,7 @@ import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -119,8 +119,8 @@ public class DomainEventHelper {
                 event = existingEvent;
             } else {
                 // all other phases, create a new event
-                final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
-                final Object[] arguments = UnwrapUtil.multipleAsArray(argumentAdapters);
+                final S source = uncheckedCast(MmUnwrapUtil.single(head.getTarget()));
+                final Object[] arguments = MmUnwrapUtil.multipleAsArray(argumentAdapters);
                 final Identifier identifier = facetHolder.getFeatureIdentifier();
                 event = newActionDomainEvent(eventType, identifier, source, arguments);
 
@@ -248,7 +248,7 @@ public class DomainEventHelper {
             } else {
                 // all other phases, create a new event
 
-                final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
+                final S source = uncheckedCast(MmUnwrapUtil.single(head.getTarget()));
                 final Identifier identifier = facetHolder.getFeatureIdentifier();
 
                 event = newPropertyDomainEvent(eventType, identifier, source, oldValue, newValue);
@@ -344,7 +344,7 @@ public class DomainEventHelper {
         try {
             final CollectionDomainEvent<S, T> event;
 
-            final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
+            final S source = uncheckedCast(MmUnwrapUtil.single(head.getTarget()));
             final Identifier identifier = facetHolder.getFeatureIdentifier();
             event = newCollectionDomainEvent(eventType, phase, identifier, source);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeAspect.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeAspect.java
index 813ed014b9..641b7b577b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeAspect.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeAspect.java
@@ -25,6 +25,7 @@ import java.util.stream.Collectors;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
 
@@ -57,7 +58,7 @@ public class ImperativeAspect {
 
     public Object invokeSingleMethod(final ManagedObject domainObject) {
         val method = methods.getFirstOrFail();
-        final Object returnValue = ManagedObjects.InvokeUtil.invoke(method, domainObject);
+        final Object returnValue = MmInvokeUtil.invoke(method, domainObject);
         return returnValue;
     }
 
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 003e58eb09..29dd9a2c0c 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
@@ -42,7 +42,7 @@ import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.services.ixn.InteractionDtoFactory;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -146,8 +146,8 @@ implements ImperativeFacet {
 
         val method = methods.getFirstOrFail();
 
-        final Object[] executionParameters = UnwrapUtil.multipleAsArray(arguments);
-        final Object targetPojo = UnwrapUtil.single(head.getTarget());
+        final Object[] executionParameters = MmUnwrapUtil.multipleAsArray(arguments);
+        final Object targetPojo = MmUnwrapUtil.single(head.getTarget());
 
         final ActionSemanticsFacet semanticsFacet = getFacetHolder().getFacet(ActionSemanticsFacet.class);
         final boolean cacheable = semanticsFacet != null && semanticsFacet.value().isSafeAndRequestCacheable();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java
index fac3d6b438..486a034049 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java
@@ -28,8 +28,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.actions.validate.ActionParameterValidationFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -59,7 +59,7 @@ implements ImperativeFacet {
     @Override
     public String invalidReason(final ManagedObject owningAdapter, final ManagedObject proposedArgumentAdapter) {
         val method = methods.getFirstOrFail();
-        final Object returnValue = ManagedObjects.InvokeUtil.invoke(method, owningAdapter, proposedArgumentAdapter);
+        final Object returnValue = MmInvokeUtil.invoke(method, owningAdapter, proposedArgumentAdapter);
         if(returnValue instanceof String) {
             return (String) returnValue;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
index d014e14719..da66603d7b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
@@ -29,8 +29,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.actions.validate.ActionValidationFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -65,8 +65,8 @@ implements ImperativeFacet {
 
         val method = methods.getFirstOrFail();
         final Object returnValue = patConstructor.isPresent()
-                ? ManagedObjects.InvokeUtil.invokeWithPAT(patConstructor.get(), method, owningAdapter, proposedArgumentAdapters)
-                : ManagedObjects.InvokeUtil.invoke(method, owningAdapter, proposedArgumentAdapters);
+                ? MmInvokeUtil.invokeWithPAT(patConstructor.get(), method, owningAdapter, proposedArgumentAdapters)
+                : MmInvokeUtil.invoke(method, owningAdapter, proposedArgumentAdapters);
 
         if(returnValue instanceof String) {
             return (String) returnValue;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacet.java
index 51a35d3714..cad8c9f303 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacet.java
@@ -48,7 +48,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.PackedManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.NonNull;
@@ -131,7 +131,7 @@ public interface CollectionFacet extends Facet {
     public static Object[] toArrayOfPojos(@Nullable final ManagedObject container) {
         val elementAdapters = streamAdapters(container)
                 .collect(Collectors.toList());
-        return UnwrapUtil.multipleAsArray(elementAdapters);
+        return MmUnwrapUtil.multipleAsArray(elementAdapters);
     }
 
     @UtilityClass
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
index d3ec729af1..b3d853e1d7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
@@ -26,8 +26,9 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
+import org.apache.isis.core.metamodel.object.MmVisibilityUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.Getter;
@@ -59,7 +60,7 @@ implements ImperativeFacet {
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         val method = methods.getFirstOrFail();
-        final Object collectionOrArray = ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
+        final Object collectionOrArray = MmInvokeUtil.invoke(method, owningAdapter);
         if(collectionOrArray == null) {
             return null;
         }
@@ -69,7 +70,7 @@ implements ImperativeFacet {
         final boolean filterForVisibility = getConfiguration().getCore().getMetaModel().isFilterVisibility();
         if(filterForVisibility) {
 
-            val autofittedObjectContainer = ManagedObjects.VisibilityUtil
+            val autofittedObjectContainer = MmVisibilityUtil
                     .visiblePojosAutofit(collectionAdapter, interactionInitiatedBy, method.getReturnType());
 
             if (autofittedObjectContainer != null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
index f11bb04a1d..824b4af9d1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
@@ -27,8 +27,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -64,7 +64,7 @@ implements ImperativeFacet {
             return null;
         }
         val method = methods.getFirstOrFail();
-        final Object returnValue = ManagedObjects.InvokeUtil.invokeAutofit(method, target);
+        final Object returnValue = MmInvokeUtil.invokeAutofit(method, target);
         if(returnValue instanceof String) {
             return (String) returnValue;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethod.java
index 9b648e41e3..e143fa883c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethod.java
@@ -25,8 +25,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -55,7 +55,7 @@ implements ImperativeFacet {
             return null;
         }
         val method = methods.getFirstOrFail();
-        final Boolean isHidden = (Boolean) ManagedObjects.InvokeUtil.invokeAutofit(method, target);
+        final Boolean isHidden = (Boolean) MmInvokeUtil.invokeAutofit(method, target);
         return isHidden.booleanValue() ? "Hidden" : null;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
index 08d8a6fb71..48175a5b3e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
@@ -30,7 +30,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmVisibilityUtil;
 import org.apache.isis.core.metamodel.services.publishing.ExecutionPublisher;
 
 import lombok.val;
@@ -81,7 +81,7 @@ implements AutoCompleteFacet {
                 return getObjectManager().adapt(list);
         });
 
-        return ManagedObjects.VisibilityUtil.streamVisibleAdapters(resultAdapter, interactionInitiatedBy)
+        return MmVisibilityUtil.streamVisibleAdapters(resultAdapter, interactionInitiatedBy)
                 .collect(Can.toCan());
 
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
index 67881a19ed..209b7c2f75 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
@@ -25,8 +25,8 @@ import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 
@@ -57,7 +57,7 @@ implements CallbackFacet {
     @Override
     public final void invoke(final ManagedObject adapter) {
         // as a side effect memoizes the list of methods and locks it so cannot add any more
-        ManagedObjects.InvokeUtil.invokeAll(getMethods(), adapter);
+        MmInvokeUtil.invokeAll(getMethods(), adapter);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
index 20169bf59e..d9af48b5f3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmVisibilityUtil;
 import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
@@ -114,7 +114,7 @@ implements
         val resultTypeSpec = specForType(resulType).orElse(null);
         val queryRequest = ObjectBulkLoader.Request.of(resultTypeSpec, query);
         val allMatching = getObjectManager().queryObjects(queryRequest)
-                .filter(ManagedObjects.VisibilityUtil.filterOn(interactionInitiatedBy));
+                .filter(MmVisibilityUtil.filterOn(interactionInitiatedBy));
 
         return allMatching;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/CompositeValueUpdater.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/CompositeValueUpdater.java
index e469d3bb97..8c51a31c91 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/CompositeValueUpdater.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/CompositeValueUpdater.java
@@ -25,7 +25,7 @@ import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember.AuthorizationException;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionMixedIn;
@@ -80,8 +80,8 @@ public abstract class CompositeValueUpdater {
             final InteractionHead head, final Can<ManagedObject> parameters) {
         val method = delegate.getFacetedMethod().getMethod();
 
-        final Object[] executionParameters = UnwrapUtil.multipleAsArray(parameters);
-        final Object targetPojo = UnwrapUtil.single(head.getTarget());
+        final Object[] executionParameters = MmUnwrapUtil.multipleAsArray(parameters);
+        final Object targetPojo = MmUnwrapUtil.single(head.getTarget());
 
         val resultPojo = CanonicalInvoker
                 .invoke(method, targetPojo, executionParameters);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
index dcdb896174..2f1785e125 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.interactions.PropertyModifyContext;
 import org.apache.isis.core.metamodel.interactions.ProposedHolder;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -72,7 +72,7 @@ implements MandatoryFacet {
     @Override
     public final boolean isRequiredButNull(final ManagedObject adapter) {
         if(getSemantics().isRequired()) {
-            val pojo = UnwrapUtil.single(adapter);
+            val pojo = MmUnwrapUtil.single(adapter);
 
             // special case string handling.
             if(pojo instanceof String) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java
index 018167a93b..a294474cef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java
@@ -26,7 +26,7 @@ import org.apache.isis.core.metamodel.facets.SingleIntValueFacetAbstract;
 import org.apache.isis.core.metamodel.interactions.ProposedHolder;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 import lombok.val;
 
@@ -57,7 +57,7 @@ implements MaxLengthFacet {
      */
     @Override
     public boolean exceeds(final ManagedObject adapter) {
-        final String str = UnwrapUtil.singleAsStringOrElse(adapter, null);
+        final String str = MmUnwrapUtil.singleAsStringOrElse(adapter, null);
         if (str == null) {
             return false;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
index 3e63143811..ec071465ea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
@@ -30,6 +30,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacetAbstract;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
 
@@ -78,9 +79,9 @@ implements ImperativeFacet {
 
         val method = methods.getFirstOrFail();
         final Object collectionOrArray = patConstructor.isPresent()
-                ? ManagedObjects.InvokeUtil.invokeWithPAT(
+                ? MmInvokeUtil.invokeWithPAT(
                         patConstructor.get(), method, owningAdapter, pendingArgs, Collections.singletonList(searchArg))
-                : ManagedObjects.InvokeUtil.invokeAutofit(
+                : MmInvokeUtil.invokeAutofit(
                         method, owningAdapter, pendingArgs, Collections.singletonList(searchArg));
 
         if (collectionOrArray == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
index c1c589a359..9d3fcc4204 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
@@ -29,6 +29,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacetAbstract;
 import org.apache.isis.core.metamodel.interactions.managed.ActionInteractionHead;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -71,8 +72,8 @@ implements ImperativeFacet {
 
         val method = methods.getFirstOrFail();
         final Object collectionOrArray = patConstructor.isPresent()
-                ? ManagedObjects.InvokeUtil.invokeWithPAT(patConstructor.get(), method, head.getTarget(), pendingArgs)
-                : ManagedObjects.InvokeUtil.invokeAutofit(method, head.getTarget(), pendingArgs);
+                ? MmInvokeUtil.invokeWithPAT(patConstructor.get(), method, head.getTarget(), pendingArgs)
+                : MmInvokeUtil.invokeAutofit(method, head.getTarget(), pendingArgs);
         if (collectionOrArray == null) {
             return Can.empty();
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
index fb5ebb38f7..fd46c0c223 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
@@ -29,8 +29,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacetAbstract;
 import org.apache.isis.core.metamodel.interactions.managed.ParameterNegotiationModel;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -78,11 +78,11 @@ implements ImperativeFacet {
 
         val defaultValue = patConstructor.isPresent()
             // PAT programming model
-            ? ManagedObjects.InvokeUtil
+            ? MmInvokeUtil
                     .invokeWithPAT(patConstructor.get(), method,
                             pendingArgs.getActionTarget(), pendingArgs.getParamValues())
             // else support legacy programming model, call any-arg defaultNAct(...)
-            : ManagedObjects.InvokeUtil
+            : MmInvokeUtil
                     .invokeAutofit(method,
                         pendingArgs.getActionTarget(), pendingArgs.getParamValues());
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
index 4e2a04182b..921cd782cc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
@@ -29,8 +29,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.param.disable.ActionParameterDisabledFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -67,8 +67,8 @@ implements ImperativeFacet {
 
         val method = methods.getFirstOrFail();
         final Object returnValue = patConstructor.isPresent()
-                ? ManagedObjects.InvokeUtil.invokeWithPAT(patConstructor.get(), method, owningAdapter, pendingArgs)
-                : ManagedObjects.InvokeUtil.invokeAutofit(method, owningAdapter, pendingArgs);
+                ? MmInvokeUtil.invokeWithPAT(patConstructor.get(), method, owningAdapter, pendingArgs)
+                : MmInvokeUtil.invokeAutofit(method, owningAdapter, pendingArgs);
 
         if(returnValue instanceof String) {
             return (String) returnValue;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java
index 8040c3ee92..5b6c8b28ec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java
@@ -28,8 +28,8 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.param.hide.ActionParameterHiddenFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -64,8 +64,8 @@ implements ImperativeFacet {
 
         val method = methods.getFirstOrFail();
         final Object returnValue = patConstructor.isPresent()
-                ? ManagedObjects.InvokeUtil.invokeWithPAT(patConstructor.get(), method, owningAdapter, argumentAdapters)
-                : ManagedObjects.InvokeUtil.invokeAutofit(method, owningAdapter, argumentAdapters);
+                ? MmInvokeUtil.invokeWithPAT(patConstructor.get(), method, owningAdapter, argumentAdapters)
+                : MmInvokeUtil.invokeAutofit(method, owningAdapter, argumentAdapters);
 
         if(returnValue instanceof Boolean) {
             return (Boolean) returnValue;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
index 28ccaf2879..06c55bb4cb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
@@ -29,8 +29,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.param.validate.ActionParameterValidationFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -68,8 +68,8 @@ implements ImperativeFacet {
 
         val method = methods.getFirstOrFail();
         final Object returnValue = patConstructor.isPresent()
-                ? ManagedObjects.InvokeUtil.invokeWithPAT(patConstructor.get(), method, owningAdapter, pendingArgs)
-                : ManagedObjects.InvokeUtil.invoke(method, owningAdapter, proposedArgument);
+                ? MmInvokeUtil.invokeWithPAT(patConstructor.get(), method, owningAdapter, pendingArgs)
+                : MmInvokeUtil.invoke(method, owningAdapter, proposedArgument);
 
         if(returnValue instanceof String) {
             return (String) returnValue;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
index d9a8cb3c76..4799de9fea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
@@ -26,8 +26,9 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
+import org.apache.isis.core.metamodel.object.MmVisibilityUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.Getter;
@@ -60,7 +61,7 @@ implements ImperativeFacet {
             final ManagedObject owningAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
         val method = methods.getFirstOrFail();
-        final Object referencedObject = ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
+        final Object referencedObject = MmInvokeUtil.invoke(method, owningAdapter);
 
         if(referencedObject == null) {
             return null;
@@ -69,7 +70,7 @@ implements ImperativeFacet {
         boolean filterForVisibility = super.getMetaModelContext().getConfiguration().getCore().getMetaModel().isFilterVisibility();
         if(filterForVisibility) {
             final ManagedObject referencedAdapter = getObjectManager().adapt(referencedObject);
-            final boolean visible = ManagedObjects.VisibilityUtil
+            final boolean visible = MmVisibilityUtil
                     .isVisible(referencedAdapter, interactionInitiatedBy);
             if (!visible) {
                 return null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java
index 9ae4b03de8..e3e0e7325d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java
@@ -27,8 +27,9 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
 import org.apache.isis.core.metamodel.facets.properties.autocomplete.PropertyAutoCompleteFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
+import org.apache.isis.core.metamodel.object.MmVisibilityUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -69,14 +70,14 @@ implements ImperativeFacet {
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         val method = methods.getFirstOrFail();
-        final Object collectionOrArray = ManagedObjects.InvokeUtil.invoke(method, owningAdapter, searchArg);
+        final Object collectionOrArray = MmInvokeUtil.invoke(method, owningAdapter, searchArg);
         if (collectionOrArray == null) {
             return null;
         }
 
         val collectionAdapter = getObjectManager().adapt(collectionOrArray);
 
-        val visiblePojos = ManagedObjects.VisibilityUtil
+        val visiblePojos = MmVisibilityUtil
                 .visiblePojosAsArray(collectionAdapter, interactionInitiatedBy);
 
         return visiblePojos;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
index 04c6b1f882..5ac52bb04e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.properties.choices.PropertyChoicesFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
 
@@ -63,7 +64,7 @@ implements ImperativeFacet {
 
         val method = methods.getFirstOrFail();
         val elementSpec = specForTypeElseFail(((FacetedMethod) getFacetHolder()).getType());
-        val optionPojos = ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
+        val optionPojos = MmInvokeUtil.invoke(method, owningAdapter);
         val visibleChoices = ManagedObjects
                 .adaptMultipleOfTypeThenRefetchThenFilterByVisibility(
                         elementSpec, optionPojos, interactionInitiatedBy);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
index 634c33aee3..9a8096ffdf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
@@ -26,8 +26,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.properties.defaults.PropertyDefaultFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -54,7 +54,7 @@ implements ImperativeFacet {
     @Override
     public ManagedObject getDefault(final ManagedObject owningAdapter) {
         val method = methods.getFirstOrFail();
-        final Object result = ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
+        final Object result = MmInvokeUtil.invoke(method, owningAdapter);
         if (result == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
index 172332d366..b2ceca7743 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
@@ -37,7 +37,7 @@ import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySe
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySettingAccessor;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.services.ixn.InteractionDtoFactory;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
@@ -194,7 +194,7 @@ implements
 
                 // ... post the executing event
                 val oldValuePojo = getterFacet.getProperty(head.getTarget(), interactionInitiatedBy);
-                val newValuePojo = UnwrapUtil.single(newValueAdapterMutatable);
+                val newValuePojo = MmUnwrapUtil.single(newValueAdapterMutatable);
 
                 val propertyDomainEvent =
                         domainEventHelper.postEventForProperty(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
index 23697fe9f7..8724f43191 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
@@ -25,8 +25,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 import lombok.Getter;
@@ -55,7 +55,7 @@ implements ImperativeFacet {
             final ManagedObject targetAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
         val method = methods.getFirstOrFail();
-        ManagedObjects.InvokeUtil.invoke(method, targetAdapter);
+        MmInvokeUtil.invoke(method, targetAdapter);
         return targetAdapter;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
index 36a6ec1385..27d5a8ea83 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
@@ -25,8 +25,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 import lombok.Getter;
@@ -56,7 +56,7 @@ implements ImperativeFacet {
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         val method = methods.getFirstOrFail();
-        ManagedObjects.InvokeUtil.invoke(method, targetAdapter);
+        MmInvokeUtil.invoke(method, targetAdapter);
         return targetAdapter;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
index ce08d07497..e62a1100da 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
@@ -24,8 +24,8 @@ import java.util.function.BiConsumer;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -52,7 +52,7 @@ implements ImperativeFacet {
     @Override
     public void initProperty(final ManagedObject owningAdapter, final ManagedObject initialAdapter) {
         val method = methods.getFirstOrFail();
-        ManagedObjects.InvokeUtil.invoke(method, owningAdapter, initialAdapter);
+        MmInvokeUtil.invoke(method, owningAdapter, initialAdapter);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
index 6886cb42d0..d2916060a8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
@@ -25,8 +25,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 import lombok.Getter;
@@ -57,7 +57,7 @@ implements ImperativeFacet {
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         val method = methods.getFirstOrFail();
-        ManagedObjects.InvokeUtil.invoke(method, targetAdapter, valueAdapter);
+        MmInvokeUtil.invoke(method, targetAdapter, valueAdapter);
         return targetAdapter;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
index 89c41b07c2..c297842f1a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
@@ -27,8 +27,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.properties.validating.PropertyValidateFacetAbstract;
+import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
 
 public class PropertyValidateFacetViaMethod extends PropertyValidateFacetAbstract implements ImperativeFacet {
 
@@ -59,7 +59,7 @@ public class PropertyValidateFacetViaMethod extends PropertyValidateFacetAbstrac
 
     @Override
     public String invalidReason(final ManagedObject owningAdapter, final ManagedObject proposedAdapter) {
-        final Object returnValue = ManagedObjects.InvokeUtil.invoke(method, owningAdapter, proposedAdapter);
+        final Object returnValue = MmInvokeUtil.invoke(method, owningAdapter, proposedAdapter);
         if(returnValue instanceof String) {
             return (String) returnValue;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java
index 32f836ed4d..20b4cc71e5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java
@@ -26,7 +26,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import lombok.Getter;
@@ -65,9 +65,9 @@ implements ActionInteractionContext {
     @Override
     public ActionArgumentUsabilityEvent createInteractionEvent() {
         return new ActionArgumentUsabilityEvent(
-                UnwrapUtil.single(getTarget()),
+                MmUnwrapUtil.single(getTarget()),
                 getIdentifier(),
-                UnwrapUtil.multipleAsArray(getArgs().toList()),
+                MmUnwrapUtil.multipleAsArray(getArgs().toList()),
                 getPosition());
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
index a96eef4819..b923591d31 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
@@ -24,7 +24,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import lombok.Getter;
@@ -64,9 +64,9 @@ implements ProposedHolder, ActionInteractionContext {
     @Override
     public ActionArgumentEvent createInteractionEvent() {
         return new ActionArgumentEvent(
-                UnwrapUtil.single(getTarget()),
+                MmUnwrapUtil.single(getTarget()),
                 getIdentifier(),
-                UnwrapUtil.multipleAsArray(getArgs().toList()),
+                MmUnwrapUtil.multipleAsArray(getArgs().toList()),
                 getPosition());
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java
index 87f93dd005..9cf0ed2e4d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java
@@ -26,7 +26,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import lombok.Getter;
@@ -65,9 +65,9 @@ implements ActionInteractionContext {
     @Override
     public ActionArgumentVisibilityEvent createInteractionEvent() {
         return new ActionArgumentVisibilityEvent(
-                UnwrapUtil.single(getTarget()),
+                MmUnwrapUtil.single(getTarget()),
                 getIdentifier(),
-                UnwrapUtil.multipleAsArray(getArgs().toList()),
+                MmUnwrapUtil.multipleAsArray(getArgs().toList()),
                 getPosition());
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
index 457ac488a7..0cfdacf63e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.ActionUsabilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 /**
@@ -53,7 +53,7 @@ implements ActionInteractionContext {
 
     @Override
     public ActionUsabilityEvent createInteractionEvent() {
-        return new ActionUsabilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
+        return new ActionUsabilityEvent(MmUnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java
index 770577204c..2de91116d1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java
@@ -24,7 +24,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import lombok.Getter;
@@ -59,7 +59,7 @@ implements ActionInteractionContext {
     @Override
     public ActionInvocationEvent createInteractionEvent() {
         return new ActionInvocationEvent(
-                UnwrapUtil.single(getTarget()), getIdentifier(), UnwrapUtil.multipleAsArray(getArgs().toList()));
+                MmUnwrapUtil.single(getTarget()), getIdentifier(), MmUnwrapUtil.multipleAsArray(getArgs().toList()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
index f4a9e9ec9b..6cd967fdad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.ActionVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 /**
@@ -53,7 +53,7 @@ implements ActionInteractionContext  {
 
     @Override
     public ActionVisibilityEvent createInteractionEvent() {
-        return new ActionVisibilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
+        return new ActionVisibilityEvent(MmUnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java
index cebd343229..ed86c1245a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java
@@ -22,7 +22,7 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.CollectionAccessEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -39,7 +39,7 @@ public class CollectionAccessContext extends AccessContext {
 
     @Override
     public CollectionAccessEvent createInteractionEvent() {
-        return new CollectionAccessEvent(UnwrapUtil.single(getTarget()), getIdentifier());
+        return new CollectionAccessEvent(MmUnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java
index 5efd8b4308..f7336cf23b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.CollectionVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -42,7 +42,7 @@ extends VisibilityContext {
 
     @Override
     public CollectionVisibilityEvent createInteractionEvent() {
-        return new CollectionVisibilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
+        return new CollectionVisibilityEvent(MmUnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java
index e0879b002c..a63973abd2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.services.wrapper.events.ObjectTitleEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -47,7 +47,7 @@ extends AccessContext {
 
     @Override
     public ObjectTitleEvent createInteractionEvent() {
-        return new ObjectTitleEvent(UnwrapUtil.single(getTarget()), getIdentifier(), getTitle());
+        return new ObjectTitleEvent(MmUnwrapUtil.single(getTarget()), getIdentifier(), getTitle());
     }
 
     private String getTitle() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java
index bb2c8588b1..76aefbe989 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.services.wrapper.events.ObjectValidityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -47,7 +47,7 @@ implements ProposedHolder {
 
     @Override
     public ObjectValidityEvent createInteractionEvent() {
-        return new ObjectValidityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
+        return new ObjectValidityEvent(MmUnwrapUtil.single(getTarget()), getIdentifier());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java
index f737f164bf..49f2189cc9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java
@@ -24,7 +24,7 @@ import org.apache.isis.applib.services.wrapper.events.ObjectVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -47,7 +47,7 @@ implements ProposedHolder {
 
     @Override
     public ObjectVisibilityEvent createInteractionEvent() {
-        return new ObjectVisibilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
+        return new ObjectVisibilityEvent(MmUnwrapUtil.single(getTarget()), getIdentifier());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java
index 5f18676aee..dc74965b60 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.services.wrapper.events.ParseValueEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -52,8 +52,8 @@ implements ProposedHolder {
 
     @Override
     public ParseValueEvent createInteractionEvent() {
-        final String proposedPojo = (String) UnwrapUtil.single(getProposed());
-        return new ParseValueEvent(UnwrapUtil.single(getTarget()), getIdentifier(), proposedPojo);
+        final String proposedPojo = (String) MmUnwrapUtil.single(getProposed());
+        return new ParseValueEvent(MmUnwrapUtil.single(getTarget()), getIdentifier(), proposedPojo);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java
index eb836726ee..d07b937d88 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.services.wrapper.events.PropertyAccessEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -54,9 +54,9 @@ extends AccessContext {
     @Override
     public PropertyAccessEvent createInteractionEvent() {
         return new PropertyAccessEvent(
-                UnwrapUtil.single(getTarget()),
+                MmUnwrapUtil.single(getTarget()),
                 getIdentifier(),
-                UnwrapUtil.single(getValue()));
+                MmUnwrapUtil.single(getValue()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java
index 09babf2f76..32814a18ee 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java
@@ -25,7 +25,7 @@ import org.apache.isis.applib.services.wrapper.events.PropertyModifyEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -62,9 +62,9 @@ implements ProposedHolder {
     @Override
     public PropertyModifyEvent createInteractionEvent() {
         return new PropertyModifyEvent(
-                UnwrapUtil.single(getTarget()),
+                MmUnwrapUtil.single(getTarget()),
                 getIdentifier(),
-                UnwrapUtil.single(getProposed()));
+                MmUnwrapUtil.single(getProposed()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java
index b954e01f30..9ec396da21 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.PropertyUsabilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -42,7 +42,7 @@ extends UsabilityContext {
 
     @Override
     public PropertyUsabilityEvent createInteractionEvent() {
-        return new PropertyUsabilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
+        return new PropertyUsabilityEvent(MmUnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java
index 7075db0493..22b668fd79 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.PropertyVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -41,7 +41,7 @@ public class PropertyVisibilityContext extends VisibilityContext {
 
     @Override
     public PropertyVisibilityEvent createInteractionEvent() {
-        return new PropertyVisibilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
+        return new PropertyVisibilityEvent(MmUnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
index bb518a3891..704ac9a6ea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
@@ -25,8 +25,8 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.Veto;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 
@@ -61,7 +61,7 @@ implements ManagedFeature {
     public ManagedObject getOwner() {
         //XXX this is a safeguard
         // see also org.apache.isis.core.metamodel.interactions.managed.ManagedProperty.ManagedProperty(ManagedObject, OneToOneAssociation, Where)
-        EntityUtil.refetch(owner);
+        MmEntityUtil.refetch(owner);
         return owner;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
index 3b739ad723..a9d8662b9b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
@@ -37,9 +37,9 @@ import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.interactions.managed._BindingUtil.TargetFormat;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
@@ -277,7 +277,7 @@ public class ParameterNegotiationModel {
             this.negotiationModel = negotiationModel;
 
             bindableParamValue = _Bindables.forValue(initialValue);
-            bindableParamValue.setValueRefiner(EntityUtil::refetch);
+            bindableParamValue.setValueRefiner(MmEntityUtil::refetch);
             bindableParamValue.setValueGuard(ManagedObjects.assertInstanceOf(metaModel.getElementType()));
             bindableParamValue.addListener((e,o,n)->{
                 if(n==null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
index 2e5b7786f9..97afc730a4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
@@ -30,9 +30,9 @@ import org.apache.isis.commons.internal.debug._Debug;
 import org.apache.isis.commons.internal.debug.xray.XrayUi;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.interactions.managed._BindingUtil.TargetFormat;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.NonNull;
@@ -68,7 +68,7 @@ public class PropertyNegotiationModel implements ManagedValue {
             : currentValue;
 
         proposedValue = _Bindables.forValue(defaultValue);
-        proposedValue.setValueRefiner(EntityUtil::refetch);
+        proposedValue.setValueRefiner(MmEntityUtil::refetch);
         proposedValue.setValueGuard(ManagedObjects.assertInstanceOf(propMeta.getElementType()));
         proposedValue.addListener((e,o,n)->{
             invalidateChoicesAndValidation();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/_BindingUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/_BindingUtil.java
index da5e4d830c..fa000790b7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/_BindingUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/_BindingUtil.java
@@ -28,7 +28,7 @@ import org.apache.isis.commons.internal.binding._Bindables;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -153,7 +153,7 @@ class _BindingUtil {
         case TITLE: {
             val renderer = eitherRendererOrParser.left().orElseThrow();
             return bindableValue.map(value->{
-                        val pojo = ManagedObjects.UnwrapUtil.single(value);
+                        val pojo = MmUnwrapUtil.single(value);
                         val title = renderer.titlePresentation(context, pojo);
                         return title;
                     });
@@ -161,7 +161,7 @@ class _BindingUtil {
         case HTML: {
             val renderer = eitherRendererOrParser.left().orElseThrow();
             return bindableValue.map(value->{
-                        val pojo = ManagedObjects.UnwrapUtil.single(value);
+                        val pojo = MmUnwrapUtil.single(value);
                         val html = renderer.htmlPresentation(context, pojo);
                         return html;
                     });
@@ -170,7 +170,7 @@ class _BindingUtil {
             val parser = eitherRendererOrParser.right().orElseThrow();
             return bindableValue.mapToBindable(
                     value->{
-                        val pojo = ManagedObjects.UnwrapUtil.single(value);
+                        val pojo = MmUnwrapUtil.single(value);
                         val text = parser.parseableTextRepresentation(context, pojo);
                         //System.err.printf("toText: %s -> '%s'%n", ""+value, text);
                         return text;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java
index d26eec5fc6..d3e729fc33 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java
@@ -22,8 +22,8 @@ import java.util.UUID;
 
 import org.apache.isis.commons.internal.binding._Bindables;
 import org.apache.isis.commons.internal.binding._Bindables.BooleanBindable;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
 
 import lombok.Getter;
 
@@ -54,7 +54,7 @@ public class DataRow {
     }
 
     public ManagedObject getRowElement() {
-        return EntityUtil.refetch(rowElement);
+        return MmEntityUtil.refetch(rowElement);
     }
 
     public ManagedObject getCellElement(final DataColumn column) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
index ed7e9a26cf..f8f034039b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
@@ -25,7 +25,6 @@ import java.util.function.UnaryOperator;
 import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -91,31 +90,13 @@ public interface ManagedObject extends HasMetaModelContext {
 
     public default String htmlString(
             final @Nullable ObjectFeature feature) {
-
-        if(!ManagedObjects.isSpecified(this)) {
-            return "";
-        }
-
-        val spec = getSpecification();
-        val valueFacet = spec.valueFacet().orElse(null);
-
-        if(valueFacet==null) {
-            return String.format("missing ValueFacet %s", spec.getCorrespondingClass());
-        }
-
-        @SuppressWarnings("unchecked")
-        val renderer = (Renderer<Object>) valueFacet.selectRendererForFeature(feature).orElse(null);
-        if(renderer==null) {
-            return String.format("missing Renderer %s", spec.getCorrespondingClass());
-        }
-
-        return renderer.htmlPresentation(valueFacet.createValueSemanticsContext(feature), this.getPojo());
+        return _InternalTitleUtil.htmlString(this, feature);
     }
 
     // -- TITLE
 
     public default String titleString(final UnaryOperator<TitleRenderRequest.TitleRenderRequestBuilder> onBuilder) {
-        return ManagedObjects.TitleUtil
+        return _InternalTitleUtil
                 .titleString(onBuilder.apply(
                         TitleRenderRequest.builder()
                         .object(this))
@@ -123,7 +104,7 @@ public interface ManagedObject extends HasMetaModelContext {
     }
 
     public default String titleString() {
-        return ManagedObjects.TitleUtil.titleString(
+        return _InternalTitleUtil.titleString(
                 TitleRenderRequest.builder()
                 .object(this)
                 .build());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObjects.java
index d98f698b5a..3667e0013b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObjects.java
@@ -18,51 +18,26 @@
  */
 package org.apache.isis.core.metamodel.object;
 
-import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.Set;
-import java.util.function.Predicate;
 import java.util.function.Supplier;
 import java.util.function.UnaryOperator;
-import java.util.stream.Stream;
 
 import org.springframework.lang.Nullable;
 import org.springframework.util.ClassUtils;
 
-import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.applib.services.repository.EntityState;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.functional.Try;
-import org.apache.isis.commons.internal.assertions._Assert;
-import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.base._Objects;
-import org.apache.isis.commons.internal.collections._Arrays;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.config.beans.PersistenceStack;
-import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
 import org.apache.isis.core.metamodel.commons.ClassExtensions;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
-import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
-import org.apache.isis.core.metamodel.interactions.InteractionHead;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.ObjectVisibilityContext;
-import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 
@@ -301,8 +276,8 @@ public final class ManagedObjects {
         @SuppressWarnings({"rawtypes" })
         @Override
         public int compare(final @Nullable ManagedObject a, final @Nullable ManagedObject b) {
-            val aPojo = UnwrapUtil.single(a);
-            val bPojo = UnwrapUtil.single(b);
+            val aPojo = MmUnwrapUtil.single(a);
+            val bPojo = MmUnwrapUtil.single(b);
             if(Objects.equals(aPojo, bPojo)) {
                 return 0;
             }
@@ -444,8 +419,8 @@ public final class ManagedObjects {
 
         return _NullSafe.streamAutodetect(collectionOrArray)
         .map(pojo->ManagedObject.of(elementSpec, pojo)) // pojo is nullable here
-        .peek(ManagedObjects.EntityUtil::refetch)
-        .filter(ManagedObjects.VisibilityUtil.filterOn(interactionInitiatedBy))
+        .peek(MmEntityUtil::refetch)
+        .filter(MmVisibilityUtil.filterOn(interactionInitiatedBy))
         .collect(Can.toCan());
     }
 
@@ -481,7 +456,7 @@ public final class ManagedObjects {
         val mmc = object.getSpecification().getMetaModelContext();
 
         val result =  Try.call(()->{
-            final Object returnValue = ManagedObjects.InvokeUtil.invoke(method, object);
+            final Object returnValue = MmInvokeUtil.invoke(method, object);
             if(returnValue instanceof String) {
                 return (String) returnValue;
             }
@@ -535,613 +510,5 @@ public final class ManagedObjects {
 
     // -- TITLE UTILITIES
 
-    @UtilityClass
-    static final class TitleUtil {
-
-        // -- TITLE SUPPORT
-
-        String titleString(@NonNull final TitleRenderRequest titleRenderRequest) {
-
-            val managedObject = titleRenderRequest.getObject();
-
-            if(!ManagedObjects.isSpecified(managedObject)) {
-                return "unspecified object";
-            }
-
-            return managedObject.getSpecification().isNonScalar()
-                ? collectionTitleString(
-                        managedObject,
-                        managedObject.getSpecification().getFacet(CollectionFacet.class))
-                : objectTitleString(titleRenderRequest)
-                    .trim();
-        }
-
-        // -- HELPER
-
-        private String objectTitleString(@NonNull final TitleRenderRequest titleRenderRequest) {
-            val managedObject = titleRenderRequest.getObject();
-            if (managedObject.getPojo() instanceof String) {
-                return (String) managedObject.getPojo();
-            }
-            val spec = managedObject.getSpecification();
-            return Optional.ofNullable(spec.getTitle(titleRenderRequest))
-                    .orElseGet(()->getDefaultTitle(managedObject));
-        }
-
-        private String collectionTitleString(final ManagedObject managedObject, final CollectionFacet facet) {
-            final int size = facet.size(managedObject);
-            val elementSpec = managedObject.getElementSpecification().orElse(null);
-            if (elementSpec == null
-                    || elementSpec.getFullIdentifier().equals(Object.class.getName())) {
-                switch (size) {
-                case -1:
-                    return "Objects";
-                case 0:
-                    return "No objects";
-                case 1:
-                    return "1 object";
-                default:
-                    return size + " objects";
-                }
-            } else {
-                switch (size) {
-                case -1:
-                    return elementSpec.getPluralName();
-                case 0:
-                    return "No " + elementSpec.getPluralName();
-                case 1:
-                    return "1 " + elementSpec.getSingularName();
-                default:
-                    return size + " " + elementSpec.getPluralName();
-                }
-            }
-        }
-
-        private String getDefaultTitle(final ManagedObject managedObject) {
-            return "A" + (" " + managedObject.getSpecification().getSingularName()).toLowerCase();
-        }
-    }
-
-    // -- ENTITY UTILITIES
-
-    @UtilityClass
-    public static final class EntityUtil {
-
-        @NonNull
-        public static Optional<PersistenceStack> getPersistenceStandard(final @Nullable ManagedObject adapter) {
-            if(adapter==null) {
-                return Optional.empty();
-            }
-            val spec = adapter.getSpecification();
-            if(spec==null || !spec.isEntity()) {
-                return Optional.empty();
-            }
-
-            val entityFacet = spec.getFacet(EntityFacet.class);
-            if(entityFacet==null) {
-                return Optional.empty();
-            }
-
-            return Optional.of(entityFacet.getPersistenceStack());
-        }
-
-        @NonNull
-        public static EntityState getEntityState(final @Nullable ManagedObject adapter) {
-            if(isNullOrUnspecifiedOrEmpty(adapter)) {
-                return EntityState.NOT_PERSISTABLE;
-            }
-            val spec = adapter.getSpecification();
-            val pojo = adapter.getPojo();
-
-            if(!spec.isEntity()) {
-                return EntityState.NOT_PERSISTABLE;
-            }
-
-            val entityFacet = spec.getFacet(EntityFacet.class);
-            if(entityFacet==null) {
-                throw _Exceptions.unrecoverable("Entity types must have an EntityFacet");
-            }
-
-            return entityFacet.getEntityState(pojo);
-        }
-
-        public static void persistInCurrentTransaction(final ManagedObject managedObject) {
-            requiresEntity(managedObject);
-            val spec = managedObject.getSpecification();
-            val entityFacet = spec.getFacet(EntityFacet.class);
-            entityFacet.persist(managedObject.getPojo());
-        }
-
-        public static void destroyInCurrentTransaction(final ManagedObject managedObject) {
-            requiresEntity(managedObject);
-            val spec = managedObject.getSpecification();
-            val entityFacet = spec.getFacet(EntityFacet.class);
-            entityFacet.delete(managedObject.getPojo());
-        }
-
-        public static void requiresEntity(final ManagedObject managedObject) {
-            if(isNullOrUnspecifiedOrEmpty(managedObject)) {
-                throw _Exceptions.illegalArgument("requires an entity object but got null, unspecified or empty");
-            }
-            val spec = managedObject.getSpecification();
-            if(!spec.isEntity()) {
-                throw _Exceptions.illegalArgument("not an entity type %s (sort=%s)",
-                        spec.getCorrespondingClass(),
-                        spec.getBeanSort());
-            }
-        }
-
-        /**
-         * @param managedObject
-         * @return managedObject
-         * @throws AssertionError if managedObject is a detached entity
-         */
-        @NonNull
-        public static ManagedObject requiresAttached(final @NonNull ManagedObject managedObject) {
-            if(managedObject instanceof PackedManagedObject) {
-                ((PackedManagedObject)managedObject).unpack().forEach(EntityUtil::requiresAttached);
-                return managedObject;
-            }
-            val entityState = EntityUtil.getEntityState(managedObject);
-            if(entityState.isPersistable()) {
-                // ensure we have an attached entity
-                _Assert.assertEquals(
-                        EntityState.PERSISTABLE_ATTACHED,
-                        entityState,
-                        ()-> String.format("entity %s is required to be attached (not detached)",
-                                managedObject.getSpecification().getLogicalTypeName()));
-            }
-            return managedObject;
-        }
-
-        public static ManagedObject refetch(final @Nullable ManagedObject managedObject) {
-            if(isNullOrUnspecifiedOrEmpty(managedObject)) {
-                return managedObject;
-            }
-            if(managedObject instanceof PackedManagedObject) {
-                ((PackedManagedObject)managedObject).unpack().forEach(EntityUtil::refetch);
-                return managedObject;
-            }
-            val entityState = EntityUtil.getEntityState(managedObject);
-            if(!entityState.isPersistable()) {
-                return managedObject;
-            }
-            if(!entityState.isDetached()) {
-                return managedObject;
-            }
-
-            val spec = managedObject.getSpecification();
-            val objectManager = managedObject.getObjectManager();
-
-            val reattached = bookmark(managedObject)
-            .map(bookmark->
-                    ObjectLoader.Request.of(
-                                    spec,
-                                    bookmark))
-            .map(loadRequest->Try.call(
-                    ()->objectManager.loadObject(loadRequest)))
-            .map(loadResult->
-                    // a valid scenario for entities: not found eg. after deletion,
-                    // which will fail the load request
-                    loadResult.isFailure()
-                            ? ManagedObject.empty(managedObject.getSpecification())
-                            : loadResult.getValue().get()
-            )
-            .orElse(managedObject);
-
-            // handles deleted entities
-            if(isNullOrUnspecifiedOrEmpty(reattached)) {
-                // returns the 'emptied' ManagedObject from above
-                return reattached;
-            }
-
-            val newState = EntityUtil.getEntityState(reattached);
-            _Assert.assertTrue(newState.isAttached());
-
-            _Casts.castTo(_ManagedObjectWithBookmark.class, managedObject)
-            .ifPresent(obj->obj.replacePojo(old->reattached.getPojo()));
-
-            return managedObject;
-        }
-
-        public static void requiresWhenFirstIsBookmarkableSecondIsAttached(
-                final ManagedObject first,
-                final ManagedObject second) {
-
-            if(!ManagedObjects.isIdentifiable(first) || !ManagedObjects.isSpecified(second)) {
-                return;
-            }
-            val secondSpec = second.getSpecification();
-            if(secondSpec.isParented() || !secondSpec.isEntity()) {
-                return;
-            }
-
-            if(!EntityUtil.isAttached(second)) {
-                throw _Exceptions.illegalArgument(
-                        "can't set a reference to a transient object [%s] from a persistent one [%s]",
-                        second,
-                        first.titleString());
-            }
-        }
-
-        // -- SHORTCUTS
-
-        public static boolean isAttached(final @Nullable ManagedObject adapter) {
-            return EntityUtil.getEntityState(adapter).isAttached();
-        }
-
-        public static boolean isDetachedOrRemoved(final @Nullable ManagedObject adapter) {
-            return EntityUtil.getEntityState(adapter).isDetachedOrRemoved();
-        }
-
-        /** only supported by JDO - always false with JPA */
-        public static boolean isRemoved(final @Nullable ManagedObject adapter) {
-            return EntityUtil.getEntityState(adapter).isRemoved();
-        }
-
-        public static ManagedObject assertAttachedWhenEntity(final @Nullable ManagedObject adapter) {
-            if(adapter instanceof PackedManagedObject) {
-                for(val element : ((PackedManagedObject)adapter).unpack()) {
-                    assertAttachedWhenEntity(element);
-                }
-            }
-            val state = EntityUtil.getEntityState(adapter);
-            if(state.isPersistable()) {
-                _Assert.assertEquals(EntityState.PERSISTABLE_ATTACHED, state,
-                        ()->String.format("detached entity %s", adapter));
-            }
-            return adapter;
-        }
-
-        public static ManagedObject computeIfDetached(
-                final @Nullable ManagedObject adapter,
-                final UnaryOperator<ManagedObject> onDetachedEntity) {
-            val state = EntityUtil.getEntityState(adapter);
-            if(state.isPersistable()
-                    &&!state.isAttached()) {
-                return onDetachedEntity.apply(adapter);
-            }
-            return adapter;
-        }
-
-    }
-
-    // -- VISIBILITY UTIL
-
-    @UtilityClass
-    public static final class VisibilityUtil {
-
-        public static Predicate<? super ManagedObject> filterOn(final InteractionInitiatedBy interactionInitiatedBy) {
-            return $->ManagedObjects.VisibilityUtil.isVisible($, interactionInitiatedBy);
-        }
-
-        /**
-         * Filters a collection (an adapter around either a Collection or an Object[]) and returns a stream of
-         * {@link ManagedObject}s of those that are visible (as per any facet(s) installed on the element class
-         * of the collection).
-         * @param collectionAdapter - an adapter around a collection (as returned by a getter of a collection, or of an autoCompleteNXxx() or choicesNXxx() method, etc
-         * @param interactionInitiatedBy
-         */
-        public static Stream<ManagedObject> streamVisibleAdapters(
-                final ManagedObject collectionAdapter,
-                final InteractionInitiatedBy interactionInitiatedBy) {
-
-            return CollectionFacet.streamAdapters(collectionAdapter)
-                    .filter(VisibilityUtil.filterOn(interactionInitiatedBy));
-        }
-
-        private static Stream<Object> streamVisiblePojos(
-                final ManagedObject collectionAdapter,
-                final InteractionInitiatedBy interactionInitiatedBy) {
-
-            return CollectionFacet.streamAdapters(collectionAdapter)
-                    .filter(VisibilityUtil.filterOn(interactionInitiatedBy))
-                    .map(UnwrapUtil::single);
-        }
-
-        public static Object[] visiblePojosAsArray(
-                final ManagedObject collectionAdapter,
-                final InteractionInitiatedBy interactionInitiatedBy) {
-
-            return streamVisiblePojos(collectionAdapter, interactionInitiatedBy)
-                    .collect(_Arrays.toArray(Object.class));
-        }
-
-        public static Object visiblePojosAutofit(
-                final ManagedObject collectionAdapter,
-                final InteractionInitiatedBy interactionInitiatedBy,
-                final Class<?> requiredContainerType) {
-
-            val visiblePojoStream = streamVisiblePojos(collectionAdapter, interactionInitiatedBy);
-            val autofittedObjectContainer = CollectionFacet.AutofitUtils
-                    .collect(visiblePojoStream, requiredContainerType);
-            return autofittedObjectContainer;
-        }
-
-
-        /**
-         * @param adapter - wrapper of domain object whose visibility is being checked,
-         *      must not be a mixin
-         * @param interactionInitiatedBy
-         */
-        public static boolean isVisible(
-                final ManagedObject adapter,
-                final InteractionInitiatedBy interactionInitiatedBy) {
-
-            if(isNullOrUnspecifiedOrEmpty(adapter)) {
-                // a choices list could include a null (eg example in ToDoItems#choices1Categorized()); want to show as "visible"
-                return true;
-            }
-            val spec = adapter.getSpecification();
-            if(spec.isEntity()) {
-                if(EntityUtil.isDetachedOrRemoved(adapter)) {
-                    return false;
-                }
-            }
-            if(interactionInitiatedBy == InteractionInitiatedBy.FRAMEWORK) {
-                return true;
-            }
-            val visibilityContext = createVisibleInteractionContext(
-                    adapter,
-                    InteractionInitiatedBy.USER,
-                    Where.OBJECT_FORMS);
-
-            return InteractionUtils.isVisibleResult(spec, visibilityContext)
-                    .isNotVetoing();
-        }
-
-        private static VisibilityContext createVisibleInteractionContext(
-                final ManagedObject objectAdapter,
-                final InteractionInitiatedBy interactionInitiatedBy,
-                final Where where) {
-
-            return new ObjectVisibilityContext(
-                    InteractionHead.regular(objectAdapter),
-                    objectAdapter.getSpecification().getFeatureIdentifier(),
-                    interactionInitiatedBy,
-                    where);
-        }
-
-    }
-
-
-    // -- INVOCATION UTILITY
-
-    @UtilityClass
-    public static final class InvokeUtil {
-
-        /** PAT ... Parameters as Tuple */
-        public static Object invokeWithPAT(
-                final Constructor<?> ppmConstructor,
-                final Method method,
-                final ManagedObject adapter,
-                final Can<ManagedObject> pendingArguments,
-                final List<Object> additionalArguments) {
-
-            val ppmTuple = CanonicalInvoker.construct(ppmConstructor, UnwrapUtil.multipleAsArray(pendingArguments));
-            val paramPojos = _Arrays.combineWithExplicitType(Object.class, ppmTuple, additionalArguments.toArray());
-            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter), paramPojos);
-        }
-
-        /** PAT ... Parameters as Tuple */
-        public static Object invokeWithPAT(
-                final Constructor<?> ppmConstructor,
-                final Method method,
-                final ManagedObject adapter,
-                final Can<ManagedObject> argumentAdapters) {
-            return invokeWithPAT(ppmConstructor, method, adapter, argumentAdapters, Collections.emptyList());
-        }
-
-        public static void invokeAll(final Iterable<Method> methods, final ManagedObject adapter) {
-            CanonicalInvoker.invokeAll(methods, UnwrapUtil.single(adapter));
-        }
-
-        public static Object invoke(final Method method, final ManagedObject adapter) {
-            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter));
-        }
-
-        public static Object invoke(final Method method, final ManagedObject adapter, final Object arg0) {
-            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter), new Object[] {arg0});
-        }
-
-        public static Object invoke(final Method method, final ManagedObject adapter, final Can<ManagedObject> argumentAdapters) {
-            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter), UnwrapUtil.multipleAsArray(argumentAdapters));
-        }
-
-        public static Object invoke(final Method method, final ManagedObject adapter, final ManagedObject arg0Adapter) {
-            return invoke(method, adapter, UnwrapUtil.single(arg0Adapter));
-        }
-
-        public static Object invoke(final Method method, final ManagedObject adapter, final ManagedObject[] argumentAdapters) {
-            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter), UnwrapUtil.multipleAsArray(argumentAdapters));
-        }
-
-        /**
-         * Invokes the method, adjusting arguments as required to make them fit the method's parameters.
-         * <p>
-         * That is:
-         * <ul>
-         * <li>if the method declares parameters but arguments are missing, then will provide 'null' defaults for these.</li>
-         * </ul>
-         */
-        public static Object invokeAutofit(final Method method, final ManagedObject adapter) {
-            return invoke(method, adapter, new ManagedObject[method.getParameterTypes().length]);
-        }
-
-        /**
-         * Invokes the method, adjusting arguments as required to make them fit the method's parameters.
-         * <p>
-         * That is:
-         * <ul>
-         * <li>if the method declares parameters but arguments are missing, then will provide 'null' defaults for these.</li>
-         * <li>if the method does not declare all parameters for arguments, then truncates arguments.</li>
-         * <li>any {@code additionalArgValues} must also fit at the end of the resulting parameter list</li>
-         * </ul>
-         */
-        public static Object invokeAutofit(
-                final Method method,
-                final ManagedObject target,
-                final Can<? extends ManagedObject> pendingArgs,
-                final List<Object> additionalArgValues) {
-
-            val argArray = adjust(method, pendingArgs, additionalArgValues);
-
-            return CanonicalInvoker.invoke(method, UnwrapUtil.single(target), argArray);
-        }
-
-        /**
-         * same as {@link #invokeAutofit(Method, ManagedObject, Can, List)} w/o additionalArgValues
-         */
-        public static Object invokeAutofit(
-                final Method method,
-                final ManagedObject target,
-                final Can<? extends ManagedObject> pendingArgs) {
-
-            return invokeAutofit(method, target, pendingArgs, Collections.emptyList());
-        }
-
-        private static Object[] adjust(
-                final Method method,
-                final Can<? extends ManagedObject> pendingArgs,
-                final List<Object> additionalArgValues) {
-
-            val parameterTypes = method.getParameterTypes();
-            val paramCount = parameterTypes.length;
-            val additionalArgCount = additionalArgValues.size();
-            val pendingArgsToConsiderCount = paramCount - additionalArgCount;
-
-            val argIterator = argIteratorFrom(pendingArgs);
-            val adjusted = new Object[paramCount];
-            for(int i=0; i<pendingArgsToConsiderCount; i++) {
-
-                val paramType = parameterTypes[i];
-                val arg = argIterator.hasNext() ? UnwrapUtil.single(argIterator.next()) : null;
-
-                adjusted[i] = honorPrimitiveDefaults(paramType, arg);
-            }
-
-            // add the additional parameter values (if any)
-            int paramIndex = pendingArgsToConsiderCount;
-            for(val additionalArg : additionalArgValues) {
-                val paramType = parameterTypes[paramIndex];
-                adjusted[paramIndex] = honorPrimitiveDefaults(paramType, additionalArg);
-                ++paramIndex;
-            }
-
-            return adjusted;
-
-        }
-
-        private static Iterator<? extends ManagedObject> argIteratorFrom(final Can<? extends ManagedObject> pendingArgs) {
-            return pendingArgs!=null ? pendingArgs.iterator() : Collections.emptyIterator();
-        }
-
-        private static Object honorPrimitiveDefaults(
-                final Class<?> expectedType,
-                final @Nullable Object value) {
-
-            if(value == null && expectedType.isPrimitive()) {
-                return ClassExtensions.toDefault(expectedType);
-            }
-            return value;
-        }
-
-
-    }
-
-    // -- UNWRAP UTILITY
-
-    @UtilityClass
-    public static final class UnwrapUtil {
-
-        // -- SINGLE
-
-        @Nullable
-        public static Object single(final @Nullable ManagedObject adapter) {
-            return ManagedObjects.isSpecified(adapter)
-                    ? adapter.getPojo()
-                    : null;
-        }
-
-        @Nullable
-        public static String singleAsStringOrElse(final @Nullable ManagedObject adapter, final @Nullable String orElse) {
-            final Object obj = UnwrapUtil.single(adapter);
-            if (obj == null) {
-                return null;
-            }
-            if (obj instanceof String) {
-                return (String) obj;
-            }
-            return orElse;
-        }
-
-        // -- AS ARRAY
-
-        @Nullable
-        public static Object[] multipleAsArray(final @NonNull Can<ManagedObject> adapters) {
-            val unwrappedObjects = _Arrays.mapCollection(adapters.toList(), UnwrapUtil::single);
-            return unwrappedObjects;
-        }
-
-        @Nullable
-        public static Object[] multipleAsArray(final @Nullable Collection<ManagedObject> adapters) {
-            val unwrappedObjects = _Arrays.mapCollection(adapters, UnwrapUtil::single);
-            return unwrappedObjects;
-        }
-
-        @Nullable
-        public static Object[] multipleAsArray(final @Nullable ManagedObject[] adapters) {
-            val unwrappedObjects = _Arrays.map(adapters, UnwrapUtil::single);
-            return unwrappedObjects;
-        }
-
-        // -- AS LIST
-
-        /**
-         *
-         * @param adapters
-         * @return non-null, unmodifiable
-         */
-        public static List<Object> multipleAsList(final @Nullable Collection<? extends ManagedObject> adapters) {
-            if (adapters == null) {
-                return Collections.emptyList();
-            }
-            return adapters.stream()
-                    .map(UnwrapUtil::single)
-                    .collect(_Lists.toUnmodifiable());
-        }
-
-        /**
-         *
-         * @param adapters
-         * @return non-null, unmodifiable
-         */
-        public static List<Object> multipleAsList(final @Nullable Can<? extends ManagedObject> adapters) {
-            if (adapters == null) {
-                return Collections.emptyList();
-            }
-            return adapters.stream()
-                    .map(UnwrapUtil::single)
-                    .collect(_Lists.toUnmodifiable());
-        }
-
-
-        /**
-         *
-         * @param adapters
-         * @return non-null, unmodifiable
-         */
-        public static Set<Object> multipleAsSet(final @Nullable Collection<? extends ManagedObject> adapters) {
-            if (adapters == null) {
-                return Collections.emptySet();
-            }
-            return adapters.stream()
-                    .map(UnwrapUtil::single)
-                    .collect(_Sets.toUnmodifiable());
-        }
-
-    }
-
-
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmEntityUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmEntityUtil.java
new file mode 100644
index 0000000000..13e2d3bf21
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmEntityUtil.java
@@ -0,0 +1,239 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.object;
+
+import java.util.Optional;
+import java.util.function.UnaryOperator;
+
+import org.springframework.lang.Nullable;
+
+import org.apache.isis.applib.services.repository.EntityState;
+import org.apache.isis.commons.functional.Try;
+import org.apache.isis.commons.internal.assertions._Assert;
+import org.apache.isis.commons.internal.base._Casts;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.config.beans.PersistenceStack;
+import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
+import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
+
+import lombok.NonNull;
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public final class MmEntityUtil {
+
+    @NonNull
+    public static Optional<PersistenceStack> getPersistenceStandard(final @Nullable ManagedObject adapter) {
+        if(adapter==null) {
+            return Optional.empty();
+        }
+        val spec = adapter.getSpecification();
+        if(spec==null || !spec.isEntity()) {
+            return Optional.empty();
+        }
+
+        val entityFacet = spec.getFacet(EntityFacet.class);
+        if(entityFacet==null) {
+            return Optional.empty();
+        }
+
+        return Optional.of(entityFacet.getPersistenceStack());
+    }
+
+    @NonNull
+    public static EntityState getEntityState(final @Nullable ManagedObject adapter) {
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)) {
+            return EntityState.NOT_PERSISTABLE;
+        }
+        val spec = adapter.getSpecification();
+        val pojo = adapter.getPojo();
+
+        if(!spec.isEntity()) {
+            return EntityState.NOT_PERSISTABLE;
+        }
+
+        val entityFacet = spec.getFacet(EntityFacet.class);
+        if(entityFacet==null) {
+            throw _Exceptions.unrecoverable("Entity types must have an EntityFacet");
+        }
+
+        return entityFacet.getEntityState(pojo);
+    }
+
+    public static void persistInCurrentTransaction(final ManagedObject managedObject) {
+        requiresEntity(managedObject);
+        val spec = managedObject.getSpecification();
+        val entityFacet = spec.getFacet(EntityFacet.class);
+        entityFacet.persist(managedObject.getPojo());
+    }
+
+    public static void destroyInCurrentTransaction(final ManagedObject managedObject) {
+        requiresEntity(managedObject);
+        val spec = managedObject.getSpecification();
+        val entityFacet = spec.getFacet(EntityFacet.class);
+        entityFacet.delete(managedObject.getPojo());
+    }
+
+    public static void requiresEntity(final ManagedObject managedObject) {
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(managedObject)) {
+            throw _Exceptions.illegalArgument("requires an entity object but got null, unspecified or empty");
+        }
+        val spec = managedObject.getSpecification();
+        if(!spec.isEntity()) {
+            throw _Exceptions.illegalArgument("not an entity type %s (sort=%s)",
+                    spec.getCorrespondingClass(),
+                    spec.getBeanSort());
+        }
+    }
+
+    /**
+     * @param managedObject
+     * @return managedObject
+     * @throws AssertionError if managedObject is a detached entity
+     */
+    @NonNull
+    public static ManagedObject requiresAttached(final @NonNull ManagedObject managedObject) {
+        if(managedObject instanceof PackedManagedObject) {
+            ((PackedManagedObject)managedObject).unpack().forEach(MmEntityUtil::requiresAttached);
+            return managedObject;
+        }
+        val entityState = MmEntityUtil.getEntityState(managedObject);
+        if(entityState.isPersistable()) {
+            // ensure we have an attached entity
+            _Assert.assertEquals(
+                    EntityState.PERSISTABLE_ATTACHED,
+                    entityState,
+                    ()-> String.format("entity %s is required to be attached (not detached)",
+                            managedObject.getSpecification().getLogicalTypeName()));
+        }
+        return managedObject;
+    }
+
+    public static ManagedObject refetch(final @Nullable ManagedObject managedObject) {
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(managedObject)) {
+            return managedObject;
+        }
+        if(managedObject instanceof PackedManagedObject) {
+            ((PackedManagedObject)managedObject).unpack().forEach(MmEntityUtil::refetch);
+            return managedObject;
+        }
+        val entityState = MmEntityUtil.getEntityState(managedObject);
+        if(!entityState.isPersistable()) {
+            return managedObject;
+        }
+        if(!entityState.isDetached()) {
+            return managedObject;
+        }
+
+        val spec = managedObject.getSpecification();
+        val objectManager = managedObject.getObjectManager();
+
+        val reattached = ManagedObjects.bookmark(managedObject)
+        .map(bookmark->
+                ObjectLoader.Request.of(
+                                spec,
+                                bookmark))
+        .map(loadRequest->Try.call(
+                ()->objectManager.loadObject(loadRequest)))
+        .map(loadResult->
+                // a valid scenario for entities: not found eg. after deletion,
+                // which will fail the load request
+                loadResult.isFailure()
+                        ? ManagedObject.empty(managedObject.getSpecification())
+                        : loadResult.getValue().get()
+        )
+        .orElse(managedObject);
+
+        // handles deleted entities
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(reattached)) {
+            // returns the 'emptied' ManagedObject from above
+            return reattached;
+        }
+
+        val newState = MmEntityUtil.getEntityState(reattached);
+        _Assert.assertTrue(newState.isAttached());
+
+        _Casts.castTo(_ManagedObjectWithBookmark.class, managedObject)
+        .ifPresent(obj->obj.replacePojo(old->reattached.getPojo()));
+
+        return managedObject;
+    }
+
+    public static void requiresWhenFirstIsBookmarkableSecondIsAttached(
+            final ManagedObject first,
+            final ManagedObject second) {
+
+        if(!ManagedObjects.isIdentifiable(first) || !ManagedObjects.isSpecified(second)) {
+            return;
+        }
+        val secondSpec = second.getSpecification();
+        if(secondSpec.isParented() || !secondSpec.isEntity()) {
+            return;
+        }
+
+        if(!MmEntityUtil.isAttached(second)) {
+            throw _Exceptions.illegalArgument(
+                    "can't set a reference to a transient object [%s] from a persistent one [%s]",
+                    second,
+                    first.titleString());
+        }
+    }
+
+    // -- SHORTCUTS
+
+    public static boolean isAttached(final @Nullable ManagedObject adapter) {
+        return MmEntityUtil.getEntityState(adapter).isAttached();
+    }
+
+    public static boolean isDetachedOrRemoved(final @Nullable ManagedObject adapter) {
+        return MmEntityUtil.getEntityState(adapter).isDetachedOrRemoved();
+    }
+
+    /** only supported by JDO - always false with JPA */
+    public static boolean isRemoved(final @Nullable ManagedObject adapter) {
+        return MmEntityUtil.getEntityState(adapter).isRemoved();
+    }
+
+    public static ManagedObject assertAttachedWhenEntity(final @Nullable ManagedObject adapter) {
+        if(adapter instanceof PackedManagedObject) {
+            for(val element : ((PackedManagedObject)adapter).unpack()) {
+                assertAttachedWhenEntity(element);
+            }
+        }
+        val state = MmEntityUtil.getEntityState(adapter);
+        if(state.isPersistable()) {
+            _Assert.assertEquals(EntityState.PERSISTABLE_ATTACHED, state,
+                    ()->String.format("detached entity %s", adapter));
+        }
+        return adapter;
+    }
+
+    public static ManagedObject computeIfDetached(
+            final @Nullable ManagedObject adapter,
+            final UnaryOperator<ManagedObject> onDetachedEntity) {
+        val state = MmEntityUtil.getEntityState(adapter);
+        if(state.isPersistable()
+                &&!state.isAttached()) {
+            return onDetachedEntity.apply(adapter);
+        }
+        return adapter;
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmInvokeUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmInvokeUtil.java
new file mode 100644
index 0000000000..a52e76affa
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmInvokeUtil.java
@@ -0,0 +1,177 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.object;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.springframework.lang.Nullable;
+
+import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal.collections._Arrays;
+import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
+import org.apache.isis.core.metamodel.commons.ClassExtensions;
+
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public final class MmInvokeUtil {
+
+    /** PAT ... Parameters as Tuple */
+    public static Object invokeWithPAT(
+            final Constructor<?> ppmConstructor,
+            final Method method,
+            final ManagedObject adapter,
+            final Can<ManagedObject> pendingArguments,
+            final List<Object> additionalArguments) {
+
+        val ppmTuple = CanonicalInvoker.construct(ppmConstructor, MmUnwrapUtil.multipleAsArray(pendingArguments));
+        val paramPojos = _Arrays.combineWithExplicitType(Object.class, ppmTuple, additionalArguments.toArray());
+        return CanonicalInvoker.invoke(method, MmUnwrapUtil.single(adapter), paramPojos);
+    }
+
+    /** PAT ... Parameters as Tuple */
+    public static Object invokeWithPAT(
+            final Constructor<?> ppmConstructor,
+            final Method method,
+            final ManagedObject adapter,
+            final Can<ManagedObject> argumentAdapters) {
+        return invokeWithPAT(ppmConstructor, method, adapter, argumentAdapters, Collections.emptyList());
+    }
+
+    public static void invokeAll(final Iterable<Method> methods, final ManagedObject adapter) {
+        CanonicalInvoker.invokeAll(methods, MmUnwrapUtil.single(adapter));
+    }
+
+    public static Object invoke(final Method method, final ManagedObject adapter) {
+        return CanonicalInvoker.invoke(method, MmUnwrapUtil.single(adapter));
+    }
+
+    public static Object invoke(final Method method, final ManagedObject adapter, final Object arg0) {
+        return CanonicalInvoker.invoke(method, MmUnwrapUtil.single(adapter), new Object[] {arg0});
+    }
+
+    public static Object invoke(final Method method, final ManagedObject adapter, final Can<ManagedObject> argumentAdapters) {
+        return CanonicalInvoker.invoke(method, MmUnwrapUtil.single(adapter), MmUnwrapUtil.multipleAsArray(argumentAdapters));
+    }
+
+    public static Object invoke(final Method method, final ManagedObject adapter, final ManagedObject arg0Adapter) {
+        return invoke(method, adapter, MmUnwrapUtil.single(arg0Adapter));
+    }
+
+    public static Object invoke(final Method method, final ManagedObject adapter, final ManagedObject[] argumentAdapters) {
+        return CanonicalInvoker.invoke(method, MmUnwrapUtil.single(adapter), MmUnwrapUtil.multipleAsArray(argumentAdapters));
+    }
+
+    /**
+     * Invokes the method, adjusting arguments as required to make them fit the method's parameters.
+     * <p>
+     * That is:
+     * <ul>
+     * <li>if the method declares parameters but arguments are missing, then will provide 'null' defaults for these.</li>
+     * </ul>
+     */
+    public static Object invokeAutofit(final Method method, final ManagedObject adapter) {
+        return invoke(method, adapter, new ManagedObject[method.getParameterTypes().length]);
+    }
+
+    /**
+     * Invokes the method, adjusting arguments as required to make them fit the method's parameters.
+     * <p>
+     * That is:
+     * <ul>
+     * <li>if the method declares parameters but arguments are missing, then will provide 'null' defaults for these.</li>
+     * <li>if the method does not declare all parameters for arguments, then truncates arguments.</li>
+     * <li>any {@code additionalArgValues} must also fit at the end of the resulting parameter list</li>
+     * </ul>
+     */
+    public static Object invokeAutofit(
+            final Method method,
+            final ManagedObject target,
+            final Can<? extends ManagedObject> pendingArgs,
+            final List<Object> additionalArgValues) {
+
+        val argArray = adjust(method, pendingArgs, additionalArgValues);
+
+        return CanonicalInvoker.invoke(method, MmUnwrapUtil.single(target), argArray);
+    }
+
+    /**
+     * same as {@link #invokeAutofit(Method, ManagedObject, Can, List)} w/o additionalArgValues
+     */
+    public static Object invokeAutofit(
+            final Method method,
+            final ManagedObject target,
+            final Can<? extends ManagedObject> pendingArgs) {
+
+        return invokeAutofit(method, target, pendingArgs, Collections.emptyList());
+    }
+
+    private static Object[] adjust(
+            final Method method,
+            final Can<? extends ManagedObject> pendingArgs,
+            final List<Object> additionalArgValues) {
+
+        val parameterTypes = method.getParameterTypes();
+        val paramCount = parameterTypes.length;
+        val additionalArgCount = additionalArgValues.size();
+        val pendingArgsToConsiderCount = paramCount - additionalArgCount;
+
+        val argIterator = argIteratorFrom(pendingArgs);
+        val adjusted = new Object[paramCount];
+        for(int i=0; i<pendingArgsToConsiderCount; i++) {
+
+            val paramType = parameterTypes[i];
+            val arg = argIterator.hasNext() ? MmUnwrapUtil.single(argIterator.next()) : null;
+
+            adjusted[i] = honorPrimitiveDefaults(paramType, arg);
+        }
+
+        // add the additional parameter values (if any)
+        int paramIndex = pendingArgsToConsiderCount;
+        for(val additionalArg : additionalArgValues) {
+            val paramType = parameterTypes[paramIndex];
+            adjusted[paramIndex] = honorPrimitiveDefaults(paramType, additionalArg);
+            ++paramIndex;
+        }
+
+        return adjusted;
+
+    }
+
+    private static Iterator<? extends ManagedObject> argIteratorFrom(final Can<? extends ManagedObject> pendingArgs) {
+        return pendingArgs!=null ? pendingArgs.iterator() : Collections.emptyIterator();
+    }
+
+    private static Object honorPrimitiveDefaults(
+            final Class<?> expectedType,
+            final @Nullable Object value) {
+
+        if(value == null && expectedType.isPrimitive()) {
+            return ClassExtensions.toDefault(expectedType);
+        }
+        return value;
+    }
+
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmUnwrapUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmUnwrapUtil.java
new file mode 100644
index 0000000000..17596f8a62
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmUnwrapUtil.java
@@ -0,0 +1,126 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.object;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.springframework.lang.Nullable;
+
+import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal.collections._Arrays;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Sets;
+
+import lombok.NonNull;
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public final class MmUnwrapUtil {
+
+    // -- SINGLE
+
+    @Nullable
+    public static Object single(final @Nullable ManagedObject adapter) {
+        return ManagedObjects.isSpecified(adapter)
+                ? adapter.getPojo()
+                : null;
+    }
+
+    @Nullable
+    public static String singleAsStringOrElse(final @Nullable ManagedObject adapter, final @Nullable String orElse) {
+        final Object obj = MmUnwrapUtil.single(adapter);
+        if (obj == null) {
+            return null;
+        }
+        if (obj instanceof String) {
+            return (String) obj;
+        }
+        return orElse;
+    }
+
+    // -- AS ARRAY
+
+    @Nullable
+    public static Object[] multipleAsArray(final @NonNull Can<ManagedObject> adapters) {
+        val unwrappedObjects = _Arrays.mapCollection(adapters.toList(), MmUnwrapUtil::single);
+        return unwrappedObjects;
+    }
+
+    @Nullable
+    public static Object[] multipleAsArray(final @Nullable Collection<ManagedObject> adapters) {
+        val unwrappedObjects = _Arrays.mapCollection(adapters, MmUnwrapUtil::single);
+        return unwrappedObjects;
+    }
+
+    @Nullable
+    public static Object[] multipleAsArray(final @Nullable ManagedObject[] adapters) {
+        val unwrappedObjects = _Arrays.map(adapters, MmUnwrapUtil::single);
+        return unwrappedObjects;
+    }
+
+    // -- AS LIST
+
+    /**
+     *
+     * @param adapters
+     * @return non-null, unmodifiable
+     */
+    public static List<Object> multipleAsList(final @Nullable Collection<? extends ManagedObject> adapters) {
+        if (adapters == null) {
+            return Collections.emptyList();
+        }
+        return adapters.stream()
+                .map(MmUnwrapUtil::single)
+                .collect(_Lists.toUnmodifiable());
+    }
+
+    /**
+     *
+     * @param adapters
+     * @return non-null, unmodifiable
+     */
+    public static List<Object> multipleAsList(final @Nullable Can<? extends ManagedObject> adapters) {
+        if (adapters == null) {
+            return Collections.emptyList();
+        }
+        return adapters.stream()
+                .map(MmUnwrapUtil::single)
+                .collect(_Lists.toUnmodifiable());
+    }
+
+
+    /**
+     *
+     * @param adapters
+     * @return non-null, unmodifiable
+     */
+    public static Set<Object> multipleAsSet(final @Nullable Collection<? extends ManagedObject> adapters) {
+        if (adapters == null) {
+            return Collections.emptySet();
+        }
+        return adapters.stream()
+                .map(MmUnwrapUtil::single)
+                .collect(_Sets.toUnmodifiable());
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmVisibilityUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmVisibilityUtil.java
new file mode 100644
index 0000000000..aac795ed12
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmVisibilityUtil.java
@@ -0,0 +1,130 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.object;
+
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.commons.internal.collections._Arrays;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
+import org.apache.isis.core.metamodel.interactions.InteractionHead;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.ObjectVisibilityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public final class MmVisibilityUtil {
+
+    public static Predicate<? super ManagedObject> filterOn(final InteractionInitiatedBy interactionInitiatedBy) {
+        return $->MmVisibilityUtil.isVisible($, interactionInitiatedBy);
+    }
+
+    /**
+     * Filters a collection (an adapter around either a Collection or an Object[]) and returns a stream of
+     * {@link ManagedObject}s of those that are visible (as per any facet(s) installed on the element class
+     * of the collection).
+     * @param collectionAdapter - an adapter around a collection (as returned by a getter of a collection, or of an autoCompleteNXxx() or choicesNXxx() method, etc
+     * @param interactionInitiatedBy
+     */
+    public static Stream<ManagedObject> streamVisibleAdapters(
+            final ManagedObject collectionAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        return CollectionFacet.streamAdapters(collectionAdapter)
+                .filter(MmVisibilityUtil.filterOn(interactionInitiatedBy));
+    }
+
+    private static Stream<Object> streamVisiblePojos(
+            final ManagedObject collectionAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        return CollectionFacet.streamAdapters(collectionAdapter)
+                .filter(MmVisibilityUtil.filterOn(interactionInitiatedBy))
+                .map(MmUnwrapUtil::single);
+    }
+
+    public static Object[] visiblePojosAsArray(
+            final ManagedObject collectionAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        return streamVisiblePojos(collectionAdapter, interactionInitiatedBy)
+                .collect(_Arrays.toArray(Object.class));
+    }
+
+    public static Object visiblePojosAutofit(
+            final ManagedObject collectionAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Class<?> requiredContainerType) {
+
+        val visiblePojoStream = streamVisiblePojos(collectionAdapter, interactionInitiatedBy);
+        val autofittedObjectContainer = CollectionFacet.AutofitUtils
+                .collect(visiblePojoStream, requiredContainerType);
+        return autofittedObjectContainer;
+    }
+
+
+    /**
+     * @param adapter - wrapper of domain object whose visibility is being checked,
+     *      must not be a mixin
+     * @param interactionInitiatedBy
+     */
+    public static boolean isVisible(
+            final ManagedObject adapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)) {
+            // a choices list could include a null (eg example in ToDoItems#choices1Categorized()); want to show as "visible"
+            return true;
+        }
+        val spec = adapter.getSpecification();
+        if(spec.isEntity()) {
+            if(MmEntityUtil.isDetachedOrRemoved(adapter)) {
+                return false;
+            }
+        }
+        if(interactionInitiatedBy == InteractionInitiatedBy.FRAMEWORK) {
+            return true;
+        }
+        val visibilityContext = createVisibleInteractionContext(
+                adapter,
+                InteractionInitiatedBy.USER,
+                Where.OBJECT_FORMS);
+
+        return InteractionUtils.isVisibleResult(spec, visibilityContext)
+                .isNotVetoing();
+    }
+
+    private static VisibilityContext createVisibleInteractionContext(
+            final ManagedObject objectAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+
+        return new ObjectVisibilityContext(
+                InteractionHead.regular(objectAdapter),
+                objectAdapter.getSpecification().getFeatureIdentifier(),
+                interactionInitiatedBy,
+                where);
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_InternalTitleUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_InternalTitleUtil.java
new file mode 100644
index 0000000000..c0a8a98a98
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_InternalTitleUtil.java
@@ -0,0 +1,123 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.object;
+
+import java.util.Optional;
+
+import org.springframework.lang.Nullable;
+
+import org.apache.isis.applib.value.semantics.Renderer;
+import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
+import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+
+import lombok.NonNull;
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+final class _InternalTitleUtil {
+
+    // -- TITLE SUPPORT
+
+    String titleString(@NonNull final TitleRenderRequest titleRenderRequest) {
+
+        val managedObject = titleRenderRequest.getObject();
+
+        if(!ManagedObjects.isSpecified(managedObject)) {
+            return "unspecified object";
+        }
+
+        return managedObject.getSpecification().isNonScalar()
+            ? collectionTitleString(
+                    managedObject,
+                    managedObject.getSpecification().getFacet(CollectionFacet.class))
+            : objectTitleString(titleRenderRequest)
+                .trim();
+    }
+
+    String htmlString(
+            final @Nullable ManagedObject adapter,
+            final @Nullable ObjectFeature feature) {
+
+        if(!ManagedObjects.isSpecified(adapter)) {
+            return "";
+        }
+
+        val spec = adapter.getSpecification();
+        val valueFacet = spec.valueFacet().orElse(null);
+
+        if(valueFacet==null) {
+            return String.format("missing ValueFacet %s", spec.getCorrespondingClass());
+        }
+
+        @SuppressWarnings("unchecked")
+        val renderer = (Renderer<Object>) valueFacet.selectRendererForFeature(feature).orElse(null);
+        if(renderer==null) {
+            return String.format("missing Renderer %s", spec.getCorrespondingClass());
+        }
+
+        return renderer.htmlPresentation(valueFacet.createValueSemanticsContext(feature), adapter.getPojo());
+    }
+
+    // -- HELPER
+
+    private String objectTitleString(@NonNull final TitleRenderRequest titleRenderRequest) {
+        val managedObject = titleRenderRequest.getObject();
+        if (managedObject.getPojo() instanceof String) {
+            return (String) managedObject.getPojo();
+        }
+        val spec = managedObject.getSpecification();
+        return Optional.ofNullable(spec.getTitle(titleRenderRequest))
+                .orElseGet(()->getDefaultTitle(managedObject));
+    }
+
+    private String collectionTitleString(final ManagedObject managedObject, final CollectionFacet facet) {
+        final int size = facet.size(managedObject);
+        val elementSpec = managedObject.getElementSpecification().orElse(null);
+        if (elementSpec == null
+                || elementSpec.getFullIdentifier().equals(Object.class.getName())) {
+            switch (size) {
+            case -1:
+                return "Objects";
+            case 0:
+                return "No objects";
+            case 1:
+                return "1 object";
+            default:
+                return size + " objects";
+            }
+        } else {
+            switch (size) {
+            case -1:
+                return elementSpec.getPluralName();
+            case 0:
+                return "No " + elementSpec.getPluralName();
+            case 1:
+                return "1 " + elementSpec.getSingularName();
+            default:
+                return size + " " + elementSpec.getPluralName();
+            }
+        }
+    }
+
+    private String getDefaultTitle(final ManagedObject managedObject) {
+        return "A" + (" " + managedObject.getSpecification().getSingularName()).toLowerCase();
+    }
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java
index 0d4f358f14..671ecd12b0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java
@@ -25,7 +25,7 @@ import org.apache.isis.applib.services.publishing.spi.EntityPropertyChange;
 import org.apache.isis.applib.services.xactn.TransactionId;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 import lombok.EqualsAndHashCode;
@@ -136,7 +136,7 @@ public final class PropertyChangeRecord {
 
     private Object getPropertyValue() {
         val referencedAdapter = getProperty().get(getEntity(), InteractionInitiatedBy.FRAMEWORK);
-        return ManagedObjects.UnwrapUtil.single(referencedAdapter);
+        return MmUnwrapUtil.single(referencedAdapter);
     }
 
 
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 a1195f56ac..7c2d56d266 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
@@ -30,8 +30,8 @@ import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.core.metamodel.IsisModuleCoreMetamodel;
 import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 
 import lombok.RequiredArgsConstructor;
@@ -61,7 +61,7 @@ public class TitleServiceDefault implements TitleService {
             return "[UNSPECIFIED]";
         }
 
-        if(EntityUtil.isDetachedOrRemoved(objectAdapter)) {
+        if(MmEntityUtil.isDetachedOrRemoved(objectAdapter)) {
             return "[DETACHED]";
         } else {
             return objectAdapter.getSpecification().getTitle(
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 dc81e0788f..7754c2b19a 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
@@ -49,9 +49,9 @@ import org.apache.isis.core.metamodel.interactions.PropertyVisibilityContext;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
@@ -203,7 +203,7 @@ implements OneToOneAssociation {
             throw _Exceptions.unexpectedCodeReach();
         }
 
-        EntityUtil.requiresWhenFirstIsBookmarkableSecondIsAttached(ownerAdapter, newReferencedAdapter);
+        MmEntityUtil.requiresWhenFirstIsBookmarkableSecondIsAttached(ownerAdapter, newReferencedAdapter);
 
         return propertySetterFacet.setProperty(this, ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java
index 41f1e73a31..3fda55187f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java
@@ -26,7 +26,7 @@ import org.junit.Test;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -42,33 +42,33 @@ public class ObjectAdapterUtilsTest {
 
     @Test
     public void testUnwrapObjectWhenNull() {
-        assertNull(UnwrapUtil.single((ManagedObject)null));
+        assertNull(MmUnwrapUtil.single((ManagedObject)null));
     }
 
     @Test
     public void testUnwrapObjectWhenNotNull() {
         underlyingDomainObject = new Object(); 
         expectAdapterWillReturn(underlyingDomainObject);
-        assertEquals(underlyingDomainObject, UnwrapUtil.single(mockObjectAdapter));
+        assertEquals(underlyingDomainObject, MmUnwrapUtil.single(mockObjectAdapter));
     }
 
     @Test
     public void testUnwrapStringWhenNull() {
-        assertNull(UnwrapUtil.singleAsStringOrElse(null, null));
+        assertNull(MmUnwrapUtil.singleAsStringOrElse(null, null));
     }
 
     @Test
     public void testUnwrapStringWhenNotNullButNotString() {
         underlyingDomainObject = new Object(); 
         expectAdapterWillReturn(underlyingDomainObject);
-        assertNull(UnwrapUtil.singleAsStringOrElse(mockObjectAdapter, null));
+        assertNull(MmUnwrapUtil.singleAsStringOrElse(mockObjectAdapter, null));
     }
 
     @Test
     public void testUnwrapStringWhenNotNullAndString() {
         underlyingDomainObject = "huzzah";
         expectAdapterWillReturn(underlyingDomainObject);
-        assertEquals("huzzah", UnwrapUtil.singleAsStringOrElse(mockObjectAdapter, null));
+        assertEquals("huzzah", MmUnwrapUtil.singleAsStringOrElse(mockObjectAdapter, null));
     }
 
     private void expectAdapterWillReturn(final Object domainObject) {
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
index 8712d28d88..4cc45784e3 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
@@ -57,8 +57,10 @@ import org.apache.isis.core.metamodel.facets.properties.property.modify.Property
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmVisibilityUtil;
 import org.apache.isis.core.metamodel.object.PackedManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager.EntityAdaptingMode;
 import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
@@ -144,10 +146,10 @@ implements MemberExecutorService {
         log.debug("about to invoke action {}", actionId);
 
         val targetAdapter = head.getTarget();
-        val targetPojo = UnwrapUtil.single(targetAdapter);
+        val targetPojo = MmUnwrapUtil.single(targetAdapter);
 
         val argumentPojos = argumentAdapters.stream()
-                .map(UnwrapUtil::single)
+                .map(MmUnwrapUtil::single)
                 .collect(_Lists.toUnmodifiable());
 
         val actionInvocation =
@@ -217,8 +219,8 @@ implements MemberExecutorService {
         val propertyId = owningProperty.getFeatureIdentifier();
 
         val targetManagedObject = head.getTarget();
-        val target = UnwrapUtil.single(targetManagedObject);
-        val argValue = UnwrapUtil.single(newValueAdapter);
+        val target = MmUnwrapUtil.single(targetManagedObject);
+        val argValue = MmUnwrapUtil.single(newValueAdapter);
 
         val propertyEdit = new PropertyEdit(interaction, propertyId, target, argValue);
         val executor = propertyExecutorFactory
@@ -260,8 +262,8 @@ implements MemberExecutorService {
             final InteractionHead head,
             final Can<ManagedObject> arguments) {
 
-        final Object[] executionParameters = UnwrapUtil.multipleAsArray(arguments);
-        final Object targetPojo = UnwrapUtil.single(head.getTarget());
+        final Object[] executionParameters = MmUnwrapUtil.multipleAsArray(arguments);
+        final Object targetPojo = MmUnwrapUtil.single(head.getTarget());
         return CanonicalInvoker.invoke(method, targetPojo, executionParameters);
     }
 
@@ -276,7 +278,7 @@ implements MemberExecutorService {
             return;
         }
 
-        val entityState = ManagedObjects.EntityUtil.getEntityState(resultAdapter);
+        val entityState = MmEntityUtil.getEntityState(resultAdapter);
         if(entityState.isDetached())   {
             // ensure that any still-to-be-persisted adapters get persisted to DB.
             getTransactionService().flushTransaction();
@@ -311,7 +313,7 @@ implements MemberExecutorService {
             return resultAdapter;
         }
 
-        return ManagedObjects.VisibilityUtil.isVisible(resultAdapter, interactionInitiatedBy)
+        return MmVisibilityUtil.isVisible(resultAdapter, interactionInitiatedBy)
                 ? resultAdapter
                 : null;
     }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/_Xray.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/_Xray.java
index 000079a694..e5c8f99dbc 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/_Xray.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/_Xray.java
@@ -28,7 +28,7 @@ import org.apache.isis.commons.internal.debug.xray.XrayUi;
 import org.apache.isis.core.metamodel.execution.InteractionInternal;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.security.util.XrayUtil;
@@ -56,7 +56,7 @@ final class _Xray {
                 : String.format("action invocation w/ %d args:\n  %s",
                         argumentAdapters.size(),
                         argumentAdapters.stream()
-                        .map(ManagedObjects.UnwrapUtil::single)
+                        .map(MmUnwrapUtil::single)
                         .map(obj->"" + obj)
                         .collect(Collectors.joining(",\n  ")));
 
@@ -76,7 +76,7 @@ final class _Xray {
 
         val participantLabel = owningProperty.getFeatureIdentifier().getLogicalIdentityString("\n#");
         val enteringLabel = String.format("property edit -> '%s'",
-                ManagedObjects.UnwrapUtil.single(newValueAdapter));
+                MmUnwrapUtil.single(newValueAdapter));
 
         return enterInvocation(iaTracker, interaction, participantLabel, enteringLabel);
     }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
index 4e108510d2..22dd0420c9 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
@@ -47,8 +47,8 @@ import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader;
 import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;
@@ -82,7 +82,7 @@ public class RepositoryServiceDefault implements RepositoryService {
     @Override
     public EntityState getEntityState(final @Nullable Object object) {
         val adapter = objectManager.adapt(unwrapped(object));
-        return EntityUtil.getEntityState(adapter);
+        return MmEntityUtil.getEntityState(adapter);
     }
 
     @Override
@@ -98,12 +98,12 @@ public class RepositoryServiceDefault implements RepositoryService {
             throw new PersistFailedException("Object not known to framework (unable to create/obtain an adapter)");
         }
         // only persist detached entities, otherwise skip
-        val entityState = EntityUtil.getEntityState(adapter);
+        val entityState = MmEntityUtil.getEntityState(adapter);
         if(!entityState.isPersistable()
                 || entityState.isAttached()) {
             return domainObject;
         }
-        EntityUtil.persistInCurrentTransaction(adapter);
+        MmEntityUtil.persistInCurrentTransaction(adapter);
         return domainObject;
     }
 
@@ -121,8 +121,8 @@ public class RepositoryServiceDefault implements RepositoryService {
             return; // noop
         }
         val adapter = objectManager.adapt(unwrapped(domainObject));
-        if(EntityUtil.isAttached(adapter)) {
-            EntityUtil.destroyInCurrentTransaction(adapter);
+        if(MmEntityUtil.isAttached(adapter)) {
+            MmEntityUtil.destroyInCurrentTransaction(adapter);
         }
     }
 
@@ -179,7 +179,7 @@ public class RepositoryServiceDefault implements RepositoryService {
 
         val queryRequest = ObjectBulkLoader.Request.of(resultTypeSpec, query);
         val allMatching = objectManager.queryObjects(queryRequest);
-        final List<T> resultList = _Casts.uncheckedCast(UnwrapUtil.multipleAsList(allMatching));
+        final List<T> resultList = _Casts.uncheckedCast(MmUnwrapUtil.multipleAsList(allMatching));
         return resultList;
     }
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
index a0aa9167fa..84ed080cfb 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -53,8 +53,8 @@ import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ActionInteractionHead;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
-import org.apache.isis.core.metamodel.object.ManagedObjects.UnwrapUtil;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
@@ -313,7 +313,7 @@ extends DelegatingInvocationHandlerDefault<T> {
         val spec = targetAdapter.getSpecification();
         if(spec.isEntity()) {
             return runExecutionTask(()->{
-                EntityUtil.persistInCurrentTransaction(targetAdapter);
+                MmEntityUtil.persistInCurrentTransaction(targetAdapter);
                 return null;
             });
         }
@@ -340,7 +340,7 @@ extends DelegatingInvocationHandlerDefault<T> {
             val interactionInitiatedBy = getInteractionInitiatedBy();
             val currentReferencedAdapter = property.get(targetAdapter, interactionInitiatedBy);
 
-            val currentReferencedObj = UnwrapUtil.single(currentReferencedAdapter);
+            val currentReferencedObj = MmUnwrapUtil.single(currentReferencedAdapter);
 
 
             val propertyAccessEvent = new PropertyAccessEvent(
@@ -405,7 +405,7 @@ extends DelegatingInvocationHandlerDefault<T> {
             val interactionInitiatedBy = getInteractionInitiatedBy();
             val currentReferencedAdapter = collection.get(targetAdapter, interactionInitiatedBy);
 
-            val currentReferencedObj = UnwrapUtil.single(currentReferencedAdapter);
+            val currentReferencedObj = MmUnwrapUtil.single(currentReferencedAdapter);
 
             val collectionAccessEvent = new CollectionAccessEvent(getDelegate(), collection.getFeatureIdentifier());
 
@@ -483,7 +483,7 @@ extends DelegatingInvocationHandlerDefault<T> {
             val returnedAdapter = objectAction.execute(
                     head, argAdapters,
                     interactionInitiatedBy);
-            return UnwrapUtil.single(returnedAdapter);
+            return MmUnwrapUtil.single(returnedAdapter);
 
         });
 
diff --git a/extensions/vw/pdfjs/wicket/ui/src/main/java/org/apache/isis/extensions/pdfjs/wkt/ui/components/PdfJsViewerPanel.java b/extensions/vw/pdfjs/wicket/ui/src/main/java/org/apache/isis/extensions/pdfjs/wkt/ui/components/PdfJsViewerPanel.java
index 2cb0749fb5..d91de2b629 100644
--- a/extensions/vw/pdfjs/wicket/ui/src/main/java/org/apache/isis/extensions/pdfjs/wkt/ui/components/PdfJsViewerPanel.java
+++ b/extensions/vw/pdfjs/wicket/ui/src/main/java/org/apache/isis/extensions/pdfjs/wkt/ui/components/PdfJsViewerPanel.java
@@ -39,7 +39,7 @@ import org.apache.wicket.request.resource.ByteArrayResource;
 
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.value.Blob;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.extensions.pdfjs.applib.config.PdfJsConfig;
 import org.apache.isis.extensions.pdfjs.applib.config.Scale;
 import org.apache.isis.extensions.pdfjs.applib.spi.PdfJsViewerAdvisor;
@@ -318,7 +318,7 @@ implements IRequestListener {
     // -- HELPER
 
     private Blob getBlob() {
-        return (Blob) ManagedObjects.UnwrapUtil.single(scalarModel().getObject());
+        return (Blob) MmUnwrapUtil.single(scalarModel().getObject());
     }
 
     private static ByteArrayResource asBlobResource(final @NonNull Blob blob) {
diff --git a/persistence/commons/src/main/java/org/apache/isis/persistence/jpa/integration/changetracking/EntityChangeTrackerDefault.java b/persistence/commons/src/main/java/org/apache/isis/persistence/jpa/integration/changetracking/EntityChangeTrackerDefault.java
index 4a3a68e3b7..ca3bcb32b9 100644
--- a/persistence/commons/src/main/java/org/apache/isis/persistence/jpa/integration/changetracking/EntityChangeTrackerDefault.java
+++ b/persistence/commons/src/main/java/org/apache/isis/persistence/jpa/integration/changetracking/EntityChangeTrackerDefault.java
@@ -59,6 +59,7 @@ import org.apache.isis.core.metamodel.facets.object.publish.entitychange.EntityC
 import org.apache.isis.core.metamodel.facets.properties.property.entitychangepublishing.EntityPropertyChangePublishingPolicyFacet;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.services.objectlifecycle.HasEnlistedEntityPropertyChanges;
 import org.apache.isis.core.metamodel.services.objectlifecycle.PropertyChangeRecord;
 import org.apache.isis.core.metamodel.services.objectlifecycle.PropertyChangeRecordId;
@@ -157,7 +158,7 @@ implements
                 // set post values, which have been left empty up to now
                 .peek(rec -> {
                     // assuming this check correctly detects deleted entities (JDO)
-                    if(ManagedObjects.EntityUtil.isDetachedOrRemoved(rec.getEntity())) {
+                    if(MmEntityUtil.isDetachedOrRemoved(rec.getEntity())) {
                         rec.withPostValueSetToDeleted();
                     } else {
                         rec.withPostValueSetToCurrent();
diff --git a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CollectionInteractionTest.java b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CollectionInteractionTest.java
index c1ab7f18d5..d20ccd548c 100644
--- a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CollectionInteractionTest.java
+++ b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CollectionInteractionTest.java
@@ -29,7 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.testdomain.model.interaction.Configuration_usingInteractionDomain;
 import org.apache.isis.testdomain.model.interaction.InteractionDemo;
@@ -65,7 +65,7 @@ class CollectionInteractionTest extends InteractionTestAbstract {
         tester.assertUsabilityIsNotVetoed();
 
         val expectedElements = tester.streamCollectionElements()
-                .map(ManagedObjects.UnwrapUtil::single)
+                .map(MmUnwrapUtil::single)
                 .collect(Collectors.toList());
         assertEquals(4, expectedElements.size());
 
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/entitylifecycle/JpaGeneratedLongIdEntityLifecycleTest.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/entitylifecycle/JpaGeneratedLongIdEntityLifecycleTest.java
index cd98acdb06..92f46de460 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/entitylifecycle/JpaGeneratedLongIdEntityLifecycleTest.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/entitylifecycle/JpaGeneratedLongIdEntityLifecycleTest.java
@@ -39,7 +39,7 @@ import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.testdomain.conf.Configuration_usingJpa;
 import org.apache.isis.testdomain.jpa.entities.JpaEntityGeneratedLongId;
@@ -78,7 +78,7 @@ class JpaGeneratedLongIdEntityLifecycleTest {
         assertTrue(entity.getSpecification().isEntity());
         assertEquals(
                 EntityState.PERSISTABLE_DETACHED,
-                ManagedObjects.EntityUtil.getEntityState(entity));
+                MmEntityUtil.getEntityState(entity));
 
         setEntityRef(entity);
 
@@ -93,7 +93,7 @@ class JpaGeneratedLongIdEntityLifecycleTest {
 
         assertEquals(
                 EntityState.PERSISTABLE_ATTACHED,
-                ManagedObjects.EntityUtil.getEntityState(entity));
+                MmEntityUtil.getEntityState(entity));
         assertEquals(1, repository.allInstances(JpaEntityGeneratedLongId.class).size());
 
     }
@@ -104,7 +104,7 @@ class JpaGeneratedLongIdEntityLifecycleTest {
         // expected post-condition (after persist, and having entered a new transaction)
         assertEquals(
                 EntityState.PERSISTABLE_DETACHED,
-                ManagedObjects.EntityUtil.getEntityState(getEntityRef()));
+                MmEntityUtil.getEntityState(getEntityRef()));
 
         val id = ((JpaEntityGeneratedLongId)getEntityRef().getPojo()).getId();
 
@@ -117,7 +117,7 @@ class JpaGeneratedLongIdEntityLifecycleTest {
         // expected pre-condition (before removal)
         assertEquals(
                 EntityState.PERSISTABLE_ATTACHED,
-                ManagedObjects.EntityUtil.getEntityState(entity));
+                MmEntityUtil.getEntityState(entity));
 
         repository.remove(entity.getPojo());
 
@@ -156,7 +156,7 @@ class JpaGeneratedLongIdEntityLifecycleTest {
     static void assertDetachedOrDeleted(final ManagedObject entity) {
         assertEquals(
                 EntityState.PERSISTABLE_DETACHED, // if undecidable we currently return PERSISTABLE_DETACHED;
-                ManagedObjects.EntityUtil.getEntityState(entity));
+                MmEntityUtil.getEntityState(entity));
     }
 
 
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/entitylifecycle/JpaNonGeneratedStringIdEntityLifecycleTest.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/entitylifecycle/JpaNonGeneratedStringIdEntityLifecycleTest.java
index 718ecde43d..2cad44d6b7 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/entitylifecycle/JpaNonGeneratedStringIdEntityLifecycleTest.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/entitylifecycle/JpaNonGeneratedStringIdEntityLifecycleTest.java
@@ -39,7 +39,7 @@ import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.testdomain.conf.Configuration_usingJpa;
 import org.apache.isis.testdomain.jpa.entities.JpaEntityNonGeneratedStringId;
@@ -78,7 +78,7 @@ class JpaNonGeneratedStringIdEntityLifecycleTest {
         assertTrue(entity.getSpecification().isEntity());
         assertEquals(
                 EntityState.PERSISTABLE_DETACHED,
-                ManagedObjects.EntityUtil.getEntityState(entity));
+                MmEntityUtil.getEntityState(entity));
 
         setEntityRef(entity);
     }
@@ -92,7 +92,7 @@ class JpaNonGeneratedStringIdEntityLifecycleTest {
 
         assertEquals(
                 EntityState.PERSISTABLE_ATTACHED,
-                ManagedObjects.EntityUtil.getEntityState(entity));
+                MmEntityUtil.getEntityState(entity));
         assertEquals(1, repository.allInstances(JpaEntityNonGeneratedStringId.class).size());
 
     }
@@ -103,7 +103,7 @@ class JpaNonGeneratedStringIdEntityLifecycleTest {
         // expected post-condition (after persist, and having entered a new transaction)
         assertEquals(
                 EntityState.PERSISTABLE_DETACHED,
-                ManagedObjects.EntityUtil.getEntityState(getEntityRef()));
+                MmEntityUtil.getEntityState(getEntityRef()));
 
         val id = ((JpaEntityNonGeneratedStringId)getEntityRef().getPojo()).getName();
 
@@ -116,7 +116,7 @@ class JpaNonGeneratedStringIdEntityLifecycleTest {
         // expected pre-condition (before removal)
         assertEquals(
                 EntityState.PERSISTABLE_ATTACHED,
-                ManagedObjects.EntityUtil.getEntityState(entity));
+                MmEntityUtil.getEntityState(entity));
 
         repository.remove(entity.getPojo());
 
@@ -155,7 +155,7 @@ class JpaNonGeneratedStringIdEntityLifecycleTest {
     static void assertDetachedOrDeleted(final ManagedObject entity) {
         assertEquals(
                 EntityState.PERSISTABLE_DETACHED, // if undecidable we currently return PERSISTABLE_DETACHED;
-                ManagedObjects.EntityUtil.getEntityState(entity));
+                MmEntityUtil.getEntityState(entity));
     }
 
 
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DataTableTester.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DataTableTester.java
index 3f3459a75e..1fb092d56a 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DataTableTester.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DataTableTester.java
@@ -27,7 +27,7 @@ import org.apache.isis.commons.binding.Observable;
 import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataColumn;
 import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataRow;
 import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataTableModel;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -41,21 +41,21 @@ public class DataTableTester {
     public void assertUnfilteredDataElements(final List<Object> expectedPojoElements) {
         assertEquals(expectedPojoElements,
                 dataTable.getDataElements().getValue()
-                .map(ManagedObjects.UnwrapUtil::single).toList());
+                .map(MmUnwrapUtil::single).toList());
     }
 
     public void assertFilteredDataElements(final List<Object> expectedPojoElements) {
         assertEquals(expectedPojoElements,
                 dataTable.getDataRowsFiltered().getValue()
                 .map(DataRow::getRowElement)
-                .map(ManagedObjects.UnwrapUtil::single).toList());
+                .map(MmUnwrapUtil::single).toList());
     }
 
     public void assertSelectedDataElements(final List<Object> expectedPojoElements) {
         assertEquals(expectedPojoElements,
                 dataTable.getDataRowsSelected().getValue()
                 .map(DataRow::getRowElement)
-                .map(ManagedObjects.UnwrapUtil::single).toList());
+                .map(MmUnwrapUtil::single).toList());
     }
 
     public void assertDataRowSelectionWhenToggledOn(
@@ -78,10 +78,10 @@ public class DataTableTester {
         assertEquals(
                 dataTable.getDataRowsFiltered().getValue()
                 .map(DataRow::getRowElement)
-                .map(ManagedObjects.UnwrapUtil::single).toList(),
+                .map(MmUnwrapUtil::single).toList(),
                 dataTable.getDataRowsSelected().getValue()
                 .map(DataRow::getRowElement)
-                .map(ManagedObjects.UnwrapUtil::single).toList());
+                .map(MmUnwrapUtil::single).toList());
     }
 
     public void assertDataRowSelectionIsEmpty() {
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java
index 4a8e3d99fa..231d8c5e13 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java
@@ -70,7 +70,7 @@ import org.apache.isis.core.metamodel.interactions.managed.PropertyInteraction;
 import org.apache.isis.core.metamodel.interactions.managed.PropertyNegotiationModel;
 import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataTableModel;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
@@ -421,7 +421,7 @@ public class DomainObjectTesterFactory {
                         .get(param.getParamNr())
                         .ifPresent(pojoTest->
                             pojoTest.accept(
-                                    ManagedObjects.UnwrapUtil.single(param.getValue().getValue())
+                                    MmUnwrapUtil.single(param.getValue().getValue())
                                     ));
                 });
 
@@ -460,7 +460,7 @@ public class DomainObjectTesterFactory {
         }
 
         private static List<Object> choicesFor(final ManagedValue param) {
-            return ManagedObjects.UnwrapUtil.multipleAsList(param.getChoices().getValue());
+            return MmUnwrapUtil.multipleAsList(param.getChoices().getValue());
         }
 
         @SuppressWarnings("unchecked")
@@ -548,7 +548,7 @@ public class DomainObjectTesterFactory {
                                     objManager
                                     .adapt(
                                         argMapper
-                                        .apply(ManagedObjects.UnwrapUtil.single(param.getValue().getValue())))));
+                                        .apply(MmUnwrapUtil.single(param.getValue().getValue())))));
                     });
 
                 },
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/binding/BindingConverterForManagedObject.java b/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/binding/BindingConverterForManagedObject.java
index 5e301c3c7a..06b02e91c7 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/binding/BindingConverterForManagedObject.java
+++ b/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/binding/BindingConverterForManagedObject.java
@@ -20,7 +20,7 @@ package org.apache.isis.viewer.commons.model.binding;
 
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.Getter;
@@ -39,7 +39,7 @@ implements BindingConverter<ManagedObject, T> {
 
     @Override
     public T toRight(final ManagedObject adapter) {
-        return _Casts.uncheckedCast(ManagedObjects.UnwrapUtil.single(adapter));
+        return _Casts.uncheckedCast(MmUnwrapUtil.single(adapter));
     }
 
 }
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/object/ObjectUiModel.java b/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/object/ObjectUiModel.java
index 2c4102a6cc..0e82c6b39b 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/object/ObjectUiModel.java
+++ b/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/object/ObjectUiModel.java
@@ -22,7 +22,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmVisibilityUtil;
 
 import lombok.RequiredArgsConstructor;
 
@@ -31,7 +31,7 @@ public interface ObjectUiModel {
     ManagedObject getManagedObject();
 
     default boolean isVisible() {
-        return ManagedObjects.VisibilityUtil
+        return MmVisibilityUtil
                 .isVisible(getManagedObject(), InteractionInitiatedBy.USER);
     }
 
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
index 17b47284ea..4b0c458272 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
@@ -53,9 +53,9 @@ import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facets.object.icon.ObjectIcon;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedMember;
 import org.apache.isis.core.metamodel.interactions.managed.MemberInteraction.AccessIntent;
-import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.interactions.managed.PropertyInteraction;
+import org.apache.isis.core.metamodel.object.ManagedObject;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
@@ -150,7 +150,7 @@ implements DomainObjectResource {
                     .createWithBody(HttpStatusCode.BAD_REQUEST, objectRepr, validity.getReason()));
         }
 
-        EntityUtil.persistInCurrentTransaction(adapter);
+        MmEntityUtil.persistInCurrentTransaction(adapter);
 
         val domainResourceHelper = _DomainResourceHelper.ofObjectResource(resourceContext, adapter);
 
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarUnwrappingModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarUnwrappingModel.java
index 5284bbb0e0..00cd1f9e7f 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarUnwrappingModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarUnwrappingModel.java
@@ -24,7 +24,7 @@ import org.springframework.util.ClassUtils;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -73,7 +73,7 @@ extends ChainingModel<T> {
     // -- HELPER
 
     private T unwrap(final ManagedObject objectAdapter) {
-        val pojo = ManagedObjects.UnwrapUtil.single(objectAdapter);
+        val pojo = MmUnwrapUtil.single(objectAdapter);
         if(pojo==null
                 || !ClassUtils.resolvePrimitiveIfNecessary(type)
                         .isAssignableFrom(ClassUtils.resolvePrimitiveIfNecessary(pojo.getClass()))) {
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
index 78556caed2..ae10000006 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
@@ -31,7 +31,7 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.viewer.wicket.model.models.ModelAbstract;
 
@@ -145,7 +145,7 @@ extends ModelAbstract<ManagedObject> {
     public final ManagedObject getObjectAndRefetch() {
         //EntityUtil.assertAttachedWhenEntity()//guard
         val entityOrViewmodel = super.getObject();
-        return EntityUtil.computeIfDetached(entityOrViewmodel, this::reload);
+        return MmEntityUtil.computeIfDetached(entityOrViewmodel, this::reload);
     }
 
     @Override
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
index 7f812d5828..d34e9e99b8 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
@@ -34,7 +34,7 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataRow;
 import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataTableModel;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -143,7 +143,7 @@ implements CollectionCountProvider {
                     values.add(null);
                     continue;
                 }
-                final Object valueObj = ManagedObjects.UnwrapUtil.single(valueAdapter);
+                final Object valueObj = MmUnwrapUtil.single(valueAdapter);
                 if (valueObj == null) {
                     values.add(null);
                     continue;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
index 8a85327e66..e1d142e2a7 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
@@ -29,7 +29,7 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFactory;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ObjectAdapterModel;
@@ -65,7 +65,7 @@ extends PanelAbstract<ManagedObject, ObjectAdapterModel> {
     }
 
     protected ManagedObject getTargetAdapter() {
-        val targetAdapter = EntityUtil.refetch(getModel().getObject());
+        val targetAdapter = MmEntityUtil.refetch(getModel().getObject());
         return targetAdapter;
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index 2821465c8f..bb3c128a58 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -34,7 +34,7 @@ import org.apache.isis.commons.functional.Either;
 import org.apache.isis.commons.internal.debug._Debug;
 import org.apache.isis.commons.internal.debug.xray.XrayUi;
 import org.apache.isis.core.config.IsisConfiguration.Viewer.Wicket;
-import org.apache.isis.core.metamodel.object.ManagedObjects.EntityUtil;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.FormExecutor;
@@ -153,7 +153,7 @@ implements FormExecutor {
 
             if(log.isDebugEnabled()) {
                 log.debug("about to redirect with {} after execution result {}",
-                        EntityUtil.getEntityState(resultAdapter),
+                        MmEntityUtil.getEntityState(resultAdapter),
                         resultAdapter);
             }