You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/10/24 12:57:50 UTC

[isis] branch v2 updated (b772877 -> fafd77b)

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

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


 discard b772877  ISIS-2158: multiple simplifications ...
     new fafd77b  ISIS-2158: multiple simplifications ...

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (b772877)
            \
             N -- N -- N   refs/heads/v2 (fafd77b)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

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


Summary of changes:
 .../isis/metamodel/consent/InteractionAdvisor.java | 14 ++++
 .../org/apache/isis/metamodel/facetapi/Facet.java  | 22 +++++
 .../isis/metamodel/facetapi/FacetAbstract.java     | 83 +++++++++++++-----
 .../isis/metamodel/facetapi/FacetHolder.java       | 87 ++++++++++++++-----
 .../isis/metamodel/facetapi/FacetHolderImpl.java   | 97 +++++++++++++---------
 .../apache/isis/metamodel/facetapi/FacetUtil.java  | 45 ++--------
 .../isis/metamodel/facetapi/MultiTypedFacet.java   | 44 ----------
 .../metamodel/facets/FacetFactoryAbstract.java     |  6 --
 .../apache/isis/metamodel/facets/MarkerFacet.java  | 26 ------
 .../isis/metamodel/facets/MarkerFacetAbstract.java | 32 -------
 .../facets/MultipleValueFacetAbstract.java         | 32 -------
 .../actions/command/CommandFacetAbstract.java      |  4 +-
 .../facets/actions/homepage/HomePageFacet.java     |  4 +-
 .../actions/homepage/HomePageFacetAbstract.java    |  4 +-
 .../actions/prototype/PrototypeFacetAbstract.java  |  4 +-
 .../actions/publish/PublishedActionFacet.java      |  4 +-
 .../publish/PublishedActionFacetAbstract.java      |  4 +-
 .../facets/all/deficiencies/DeficiencyFacet.java   | 16 ++++
 .../metamodel/facets/all/hide/HiddenFacet.java     |  3 +-
 .../metamodel/facets/all/named/NamedFacet.java     |  4 +-
 .../facets/all/named/NamedFacetAbstract.java       | 10 +--
 .../parented/ParentedCollectionFacetDefault.java   |  4 +-
 .../facets/members/hidden/HiddenFacetAbstract.java | 21 +----
 .../members/order/MemberOrderFacetAbstract.java    |  4 +-
 .../facets/object/cached/CachedFacet.java          | 42 ----------
 .../facets/object/cached/CachedFacetAbstract.java  | 36 --------
 .../facets/object/cached/CachedFacetUtils.java     | 32 -------
 .../facets/object/defaults/DefaultedFacet.java     |  4 +-
 .../facets/object/entity/EntityFacet.java          |  4 +-
 .../impl/ObjectValidPropertiesFacetImpl.java       |  2 +-
 .../object/parented/ParentedCollectionFacet.java   |  4 +-
 .../parented/ParentedCollectionFacetAbstract.java  |  4 +-
 .../publishedobject/PublishedObjectFacet.java      |  4 +-
 .../PublishedObjectFacetAbstract.java              |  4 +-
 .../RecreatableObjectFacetAbstract.java            |  4 +-
 ...ObjectFacetDeclarativeInitializingAbstract.java |  2 +-
 .../facets/object/value/EqualByContentFacet.java   |  8 +-
 .../object/value/EqualByContentFacetAbstract.java  |  4 +-
 .../metamodel/facets/object/value/ValueFacet.java  |  5 +-
 .../facets/object/value/ValueFacetAbstract.java    | 36 ++------
 .../facets/object/value/ValueFacetSimple.java      | 19 +----
 .../value/annotcfg/ValueFacetAnnotation.java       | 62 +++++++-------
 ...ValueFacetAnnotationOrConfigurationFactory.java |  2 +-
 .../annotcfg/ValueFacetFromConfiguration.java      |  4 +-
 .../vsp/ValueFacetUsingSemanticsProvider.java      |  4 +-
 .../ValueFacetUsingSemanticsProviderFactory.java   |  2 +-
 .../facets/object/wizard/WizardFacetAbstract.java  |  4 +-
 .../objectvalue/labelat/LabelAtFacetAbstract.java  |  4 +-
 .../objectvalue/mandatory/MandatoryFacet.java      |  3 +-
 .../mandatory/MandatoryFacetAbstract.java          |  5 +-
 .../multiline/MultiLineFacetAbstract.java          |  4 +-
 .../objectvalue/regex/RegExFacetAbstract.java      |  4 +-
 .../propcoll/notpersisted/NotPersistedFacet.java   |  4 +-
 .../notpersisted/NotPersistedFacetAbstract.java    |  4 +-
 .../properties/publish/PublishedPropertyFacet.java |  4 +-
 .../publish/PublishedPropertyFacetAbstract.java    |  5 +-
 .../searchable/SearchableFacetAbstract.java        |  4 +-
 .../spec/feature/OneToOneAssociation.java          |  5 --
 .../specimpl/ObjectActionContributee.java          | 48 +----------
 .../specloader/specimpl/ObjectActionDefault.java   | 10 ++-
 .../specloader/specimpl/ObjectActionMixedIn.java   | 12 +--
 .../specimpl/ObjectActionParameterAbstract.java    | 85 ++-----------------
 .../specimpl/ObjectAssociationAbstract.java        |  6 ++
 .../specloader/specimpl/ObjectMemberAbstract.java  | 64 +-------------
 .../specimpl/OneToManyAssociationContributee.java  |  7 +-
 .../specimpl/OneToManyAssociationMixedIn.java      |  9 +-
 .../specimpl/OneToOneAssociationContributee.java   |  8 +-
 .../specimpl/OneToOneAssociationDefault.java       | 18 +---
 .../specimpl/OneToOneAssociationMixedIn.java       |  7 +-
 ...ObjectAssociationAbstractTest_alwaysHidden.java |  2 +-
 ...doPersistenceCapableAnnotationFacetFactory.java |  2 +-
 .../JdoPersistenceCapableFacetAbstract.java        | 26 +-----
 .../facets/object/version/JdoVersionFacet.java     |  4 +-
 .../version/JdoVersionFacetFromAnnotation.java     |  4 +-
 .../prop/notpersistent/JdoNotPersistentFacet.java  |  5 +-
 .../JdoNotPersistentFacetAbstract.java             |  7 +-
 .../facets/prop/primarykey/JdoPrimaryKeyFacet.java |  5 +-
 .../primarykey/JdoPrimaryKeyFacetAbstract.java     |  7 +-
 .../runtime/system/ObjectMemberAbstractTest.java   | 12 ++-
 .../memento/ObjectAdapterMementoDefault.java       |  3 +
 80 files changed, 430 insertions(+), 833 deletions(-)
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/MultiTypedFacet.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MarkerFacet.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MarkerFacetAbstract.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MultipleValueFacetAbstract.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacet.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacetAbstract.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacetUtils.java


[isis] 01/01: ISIS-2158: multiple simplifications ...

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

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

commit fafd77bef1b59a3cf002fba9fa2da645e8ffb9b2
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Oct 24 11:28:29 2019 +0200

    ISIS-2158: multiple simplifications ...
    
    - code de-duplication
    - thread safety for facetholder
    - remove MarkerFacet
    - remove CachedFacet
    - remove MultiTypedFacet
---
 .../isis/metamodel/consent/InteractionAdvisor.java | 14 ++++
 .../org/apache/isis/metamodel/facetapi/Facet.java  | 22 +++++
 .../isis/metamodel/facetapi/FacetAbstract.java     | 83 +++++++++++++-----
 .../isis/metamodel/facetapi/FacetHolder.java       | 87 ++++++++++++++-----
 .../isis/metamodel/facetapi/FacetHolderImpl.java   | 97 +++++++++++++---------
 .../apache/isis/metamodel/facetapi/FacetUtil.java  | 45 ++--------
 .../isis/metamodel/facetapi/MultiTypedFacet.java   | 44 ----------
 .../metamodel/facets/FacetFactoryAbstract.java     |  6 --
 .../apache/isis/metamodel/facets/MarkerFacet.java  | 26 ------
 .../isis/metamodel/facets/MarkerFacetAbstract.java | 32 -------
 .../facets/MultipleValueFacetAbstract.java         | 32 -------
 .../actions/command/CommandFacetAbstract.java      |  4 +-
 .../facets/actions/homepage/HomePageFacet.java     |  4 +-
 .../actions/homepage/HomePageFacetAbstract.java    |  4 +-
 .../actions/prototype/PrototypeFacetAbstract.java  |  4 +-
 .../actions/publish/PublishedActionFacet.java      |  4 +-
 .../publish/PublishedActionFacetAbstract.java      |  4 +-
 .../facets/all/deficiencies/DeficiencyFacet.java   | 16 ++++
 .../metamodel/facets/all/hide/HiddenFacet.java     |  3 +-
 .../metamodel/facets/all/named/NamedFacet.java     |  4 +-
 .../facets/all/named/NamedFacetAbstract.java       | 10 +--
 .../parented/ParentedCollectionFacetDefault.java   |  4 +-
 .../facets/members/hidden/HiddenFacetAbstract.java | 21 +----
 .../members/order/MemberOrderFacetAbstract.java    |  4 +-
 .../facets/object/cached/CachedFacet.java          | 42 ----------
 .../facets/object/cached/CachedFacetAbstract.java  | 36 --------
 .../facets/object/cached/CachedFacetUtils.java     | 32 -------
 .../facets/object/defaults/DefaultedFacet.java     |  4 +-
 .../facets/object/entity/EntityFacet.java          |  4 +-
 .../impl/ObjectValidPropertiesFacetImpl.java       |  2 +-
 .../object/parented/ParentedCollectionFacet.java   |  4 +-
 .../parented/ParentedCollectionFacetAbstract.java  |  4 +-
 .../publishedobject/PublishedObjectFacet.java      |  4 +-
 .../PublishedObjectFacetAbstract.java              |  4 +-
 .../RecreatableObjectFacetAbstract.java            |  4 +-
 ...ObjectFacetDeclarativeInitializingAbstract.java |  2 +-
 .../facets/object/value/EqualByContentFacet.java   |  8 +-
 .../object/value/EqualByContentFacetAbstract.java  |  4 +-
 .../metamodel/facets/object/value/ValueFacet.java  |  5 +-
 .../facets/object/value/ValueFacetAbstract.java    | 36 ++------
 .../facets/object/value/ValueFacetSimple.java      | 19 +----
 .../value/annotcfg/ValueFacetAnnotation.java       | 62 +++++++-------
 ...ValueFacetAnnotationOrConfigurationFactory.java |  2 +-
 .../annotcfg/ValueFacetFromConfiguration.java      |  4 +-
 .../vsp/ValueFacetUsingSemanticsProvider.java      |  4 +-
 .../ValueFacetUsingSemanticsProviderFactory.java   |  2 +-
 .../facets/object/wizard/WizardFacetAbstract.java  |  4 +-
 .../objectvalue/labelat/LabelAtFacetAbstract.java  |  4 +-
 .../objectvalue/mandatory/MandatoryFacet.java      |  3 +-
 .../mandatory/MandatoryFacetAbstract.java          |  5 +-
 .../multiline/MultiLineFacetAbstract.java          |  4 +-
 .../objectvalue/regex/RegExFacetAbstract.java      |  4 +-
 .../propcoll/notpersisted/NotPersistedFacet.java   |  4 +-
 .../notpersisted/NotPersistedFacetAbstract.java    |  4 +-
 .../properties/publish/PublishedPropertyFacet.java |  4 +-
 .../publish/PublishedPropertyFacetAbstract.java    |  5 +-
 .../searchable/SearchableFacetAbstract.java        |  4 +-
 .../spec/feature/OneToOneAssociation.java          |  5 --
 .../specimpl/ObjectActionContributee.java          | 48 +----------
 .../specloader/specimpl/ObjectActionDefault.java   | 10 ++-
 .../specloader/specimpl/ObjectActionMixedIn.java   | 12 +--
 .../specimpl/ObjectActionParameterAbstract.java    | 85 ++-----------------
 .../specimpl/ObjectAssociationAbstract.java        |  6 ++
 .../specloader/specimpl/ObjectMemberAbstract.java  | 64 +-------------
 .../specimpl/OneToManyAssociationContributee.java  |  7 +-
 .../specimpl/OneToManyAssociationMixedIn.java      |  9 +-
 .../specimpl/OneToOneAssociationContributee.java   |  8 +-
 .../specimpl/OneToOneAssociationDefault.java       | 18 +---
 .../specimpl/OneToOneAssociationMixedIn.java       |  7 +-
 ...ObjectAssociationAbstractTest_alwaysHidden.java |  2 +-
 ...doPersistenceCapableAnnotationFacetFactory.java |  2 +-
 .../JdoPersistenceCapableFacetAbstract.java        | 26 +-----
 .../facets/object/version/JdoVersionFacet.java     |  4 +-
 .../version/JdoVersionFacetFromAnnotation.java     |  4 +-
 .../prop/notpersistent/JdoNotPersistentFacet.java  |  5 +-
 .../JdoNotPersistentFacetAbstract.java             |  7 +-
 .../facets/prop/primarykey/JdoPrimaryKeyFacet.java |  5 +-
 .../primarykey/JdoPrimaryKeyFacetAbstract.java     |  7 +-
 .../runtime/system/ObjectMemberAbstractTest.java   | 12 ++-
 .../memento/ObjectAdapterMementoDefault.java       |  3 +
 .../IsisWicketApplication_newPageFactory.java      |  6 +-
 81 files changed, 435 insertions(+), 834 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/consent/InteractionAdvisor.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/consent/InteractionAdvisor.java
index 60303b4..24bc793 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/consent/InteractionAdvisor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/consent/InteractionAdvisor.java
@@ -20,6 +20,7 @@
 package org.apache.isis.metamodel.consent;
 
 import java.util.Map;
+import java.util.function.Consumer;
 
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -80,6 +81,19 @@ public interface InteractionAdvisor {
             return false;
         }
 
+        @Override
+        public void addAlias(Class<? extends Facet> alias) {
+        }
+
+        @Override
+        public void forEachAlias(Consumer<Class<? extends Facet>> onAlias) {
+        }
+
+        @Override
+        public boolean hasAlias(Class<? extends Facet> alias) {
+            return false;
+        }
+
     };
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/Facet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/Facet.java
index cfa156e..97beef6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/Facet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/Facet.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.metamodel.facetapi;
 
+import java.util.function.Consumer;
+
 import org.apache.isis.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
 
 public interface Facet extends FacetWithAttributes {
@@ -94,5 +96,25 @@ public interface Facet extends FacetWithAttributes {
      */
     public boolean alwaysReplace();
 
+    // -- FACET ALIAS SUPPORT
+    
+    /**
+     * Add an alias by which the facet can be looked up.
+     * @since 2.0
+     */
+    void addAlias(Class<? extends Facet> alias);
+
+    /**
+     * Traverses all aliases (if any).
+     * @since 2.0
+     */
+    void forEachAlias(Consumer<Class<? extends Facet>> onAlias);
+
+    /**
+     * Whether has an alias by which the facet can be looked up.
+     * @since 2.0
+     */
+    boolean hasAlias(Class<? extends Facet> alias);
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetAbstract.java
index 40cc3e1..33bfb4d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetAbstract.java
@@ -21,7 +21,10 @@ package org.apache.isis.metamodel.facetapi;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
+import java.util.function.Consumer;
 
+import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.metamodel.MetaModelContext;
 
@@ -40,6 +43,8 @@ public abstract class FacetAbstract implements Facet, MetaModelContext.Delegatin
     private Facet underlyingFacet;
 
     private final Class<? extends Facet> facetType;
+    private Set<Class<? extends Facet>> facetAliasTypes; // lazy init
+    
     private final boolean derived;
     private FacetHolder holder;
 
@@ -53,14 +58,21 @@ public abstract class FacetAbstract implements Facet, MetaModelContext.Delegatin
     private IdentifiedHolder identifiedHolder;
 
     public FacetAbstract(
-            final Class<? extends Facet> facetType,
-            final FacetHolder holder,
-            final Derivation derivation) {
+            Class<? extends Facet> facetType,
+            FacetHolder holder,
+            Derivation derivation) {
         
         this.facetType = requires(facetType, "facetType"); 
         setFacetHolder(holder);
         this.derived = (derivation == Derivation.DERIVED);
     }
+    
+    protected FacetAbstract(
+            Class<? extends Facet> facetType,
+            FacetHolder holder) {
+        
+        this(facetType, holder, Derivation.NOT_DERIVED);
+    }
 
     @Override
     public final Class<? extends Facet> facetType() {
@@ -99,13 +111,13 @@ public abstract class FacetAbstract implements Facet, MetaModelContext.Delegatin
     @Override
     public void setUnderlyingFacet(final Facet underlyingFacet) {
         if(underlyingFacet != null) {
-            if(underlyingFacet instanceof MultiTypedFacet) {
-                val multiTypedFacet = (MultiTypedFacet) underlyingFacet;
-                val matches = compatible(multiTypedFacet);
-                if(!matches) {
-                    throw new IllegalArgumentException("illegal argument, expected underlying facet (a multi-valued facet) to have equivalent to the facet type (or facet types) of this facet");
-                }
-            } else {
+//            if(underlyingFacet instanceof MultiTypedFacet) {
+//                val multiTypedFacet = (MultiTypedFacet) underlyingFacet;
+//                val matches = compatible(multiTypedFacet);
+//                if(!matches) {
+//                    throw new IllegalArgumentException("illegal argument, expected underlying facet (a multi-valued facet) to have equivalent to the facet type (or facet types) of this facet");
+//                }
+//            } else {
                 
                 val underlyingFacetType = underlyingFacet.facetType();
                 if(!Objects.equals(underlyingFacetType, facetType)) {
@@ -116,22 +128,22 @@ public abstract class FacetAbstract implements Facet, MetaModelContext.Delegatin
                     throw _Exceptions.unrecoverable(msg);
                 }
  
-            }
+ //           }
         }
         this.underlyingFacet = underlyingFacet;
     }
 
-    private boolean compatible(final MultiTypedFacet multiTypedFacet) {
-
-        if (!(this instanceof MultiTypedFacet)) {
-            return multiTypedFacet.containsFacetTypeOf(this.facetType);
-        }
-
-        val thisAsMultiTyped = (MultiTypedFacet) this;
-        
-        return thisAsMultiTyped.facetTypes()
-                .anyMatch(multiTypedFacet::containsFacetTypeOf);
-    }
+//    private boolean compatible(final MultiTypedFacet multiTypedFacet) {
+//
+//        if (!(this instanceof MultiTypedFacet)) {
+//            return multiTypedFacet.containsFacetTypeOf(this.facetType);
+//        }
+//
+//        val thisAsMultiTyped = (MultiTypedFacet) this;
+//        
+//        return thisAsMultiTyped.facetTypes()
+//                .anyMatch(multiTypedFacet::containsFacetTypeOf);
+//    }
 
     /**
      * Assume implementation is <i>not</i> a no-op.
@@ -247,5 +259,32 @@ public abstract class FacetAbstract implements Facet, MetaModelContext.Delegatin
     public static interface Validating {
     }
 
+    // -- FACET ALIAS SUPPORT
+    
+    @Override
+    public void addAlias(Class<? extends Facet> alias) {
+        if(facetAliasTypes==null) {
+            facetAliasTypes = _Sets.newHashSet();
+        }
+        facetAliasTypes.add(alias);
+    }
+    
+    @Override
+    public void forEachAlias(Consumer<Class<? extends Facet>> onAlias) {
+        if(facetAliasTypes!=null) {
+            facetAliasTypes.forEach(onAlias);
+        }
+    }
+    
+    @Override
+    public boolean hasAlias(Class<? extends Facet> alias) {
+        if(facetAliasTypes==null) {
+            return false;
+        }
+        return facetAliasTypes.contains(alias);
+    }
+
+    
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolder.java
index 031eb5e..02f56e1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolder.java
@@ -23,6 +23,8 @@ import java.util.stream.Stream;
 
 import org.apache.isis.metamodel.MetaModelContext;
 
+import lombok.val;
+
 /**
  * Anything in the metamodel (which also includes peers in the reflector) that
  * can be extended.
@@ -50,13 +52,19 @@ public interface FacetHolder {
      * Convenience; saves having to {@link #getFacet(Class)} and then check if
      * <tt>null</tt> and not a no-op.
      */
-    boolean containsDoOpFacet(Class<? extends Facet> facetType);
+    default boolean containsDoOpFacet(Class<? extends Facet> facetType) {
+        val facet = getFacet(facetType);
+        return facet != null && !facet.isNoop();
+    }
 
     /**
      * As {@link #containsDoOpFacet(Class)}, which additional requirement that the
      * facet is not {@link Facet#isDerived()}.
      */
-    boolean containsDoOpNotDerivedFacet(Class<? extends Facet> facetType);
+    default boolean containsDoOpNotDerivedFacet(Class<? extends Facet> facetType) {
+        val facet = getFacet(facetType);
+        return facet != null && !facet.isNoop() && !facet.isDerived();
+    }
 
     Stream<Facet> streamFacets();
 
@@ -72,33 +80,66 @@ public interface FacetHolder {
     void addFacet(Facet facet);
 
     /**
-     * Adds the {@link MultiTypedFacet multi-typed facet}, extracting each of
-     * its {@link MultiTypedFacet#facetTypes() types} as keys.
-     *
-     * <p>
-     * If there are any facet of the same type, they will be overwritten
-     * <i>provided</i> that either the {@link Facet} specifies to
-     * {@link Facet#alwaysReplace() always replace} or if the existing
-     * {@link Facet} is a {@link Facet#isNoop() no-op}.
-     */
-    void addMultiTypedFacet(MultiTypedFacet facet);
-
-    /**
-     * Remove the facet whose type is that reported by {@link Facet#facetType()}
-     * .
+     * Replaces any existing facet with the given one, while copying any underlying 
+     * facet from the existing to the given one.
+     * 
+     * @param facet
+     * @since 2.0
      */
-    void removeFacet(Facet facet);
-
+    void addOrReplaceFacet(Facet facet);
+    
     /**
-     * Remove the facet of the specified type.
+     * 
+     * @since 2.0
      */
-    void removeFacet(Class<? extends Facet> facetType);
-
+    MetaModelContext getMetaModelContext();
 
     /**
-     * 
+     * For those that implement through delegation.
      * @since 2.0
+     *
      */
-    MetaModelContext getMetaModelContext();
+    public static interface Delegating extends FacetHolder {
+        
+        FacetHolder getFacetHolder();
+
+        @Override
+        default public int getFacetCount() {
+            return getFacetHolder().getFacetCount();
+        }
+
+        @Override
+        default public <T extends Facet> T getFacet(Class<T> cls) {
+            return getFacetHolder().getFacet(cls);
+        }
+
+        @Override
+        default public boolean containsFacet(Class<? extends Facet> facetType) {
+            return getFacetHolder().containsFacet(facetType);
+        }
+
+        @Override
+        default public Stream<Facet> streamFacets() {
+            return getFacetHolder().streamFacets();
+        }
+
+        @Override
+        default public void addFacet(Facet facet) {
+            getFacetHolder().addFacet(facet);
+        }
+
+        @Override
+        default public void addOrReplaceFacet(Facet facet) {
+            getFacetHolder().addOrReplaceFacet(facet);
+        }
+
+        @Override
+        default public MetaModelContext getMetaModelContext() {
+            return getFacetHolder().getMetaModelContext();
+        }
+        
+        
+    }
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolderImpl.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolderImpl.java
index 82e4447..5a3ea55 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolderImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolderImpl.java
@@ -20,9 +20,13 @@
 package org.apache.isis.metamodel.facetapi;
 
 import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Stream;
 
+import org.apache.isis.commons.internal.base._Lazy;
+import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.MetaModelContextAware;
 
@@ -30,6 +34,7 @@ import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.val;
 
 /**
  * For base subclasses or, more likely, to help write tests.
@@ -40,66 +45,61 @@ public class FacetHolderImpl implements FacetHolder, MetaModelContextAware {
     private MetaModelContext metaModelContext;
     
     private final Map<Class<? extends Facet>, Facet> facetsByClass = new ConcurrentHashMap<>();
+    private final _Lazy<Set<Facet>> snapshot = _Lazy.threadSafe(this::snapshot);
 
-    @Override
-    public boolean containsFacet(final Class<? extends Facet> facetType) {
-        return facetsByClass.containsKey(facetType);
+    private Set<Facet> snapshot() {
+        val snapshot = _Sets.<Facet>newHashSet();
+        facetsByClass.values().forEach(snapshot::add);
+        return snapshot;
     }
-
-    @Override
-    public boolean containsDoOpFacet(final Class<? extends Facet> facetType) {
-        final Facet facet = getFacet(facetType);
-        return facet != null && !facet.isNoop();
-    }
-
+    
     @Override
-    public boolean containsDoOpNotDerivedFacet(final Class<? extends Facet> facetType) {
-        final Facet facet = getFacet(facetType);
-        return facet != null && !facet.isNoop() && !facet.isDerived();
+    public boolean containsFacet(Class<? extends Facet> facetType) {
+        return facetsByClass.containsKey(facetType);
     }
 
     @Override
-    public void addFacet(final Facet facet) {
+    public void addFacet(Facet facet) {
         addFacet(facet.facetType(), facet);
     }
 
     @Override
-    public void addMultiTypedFacet(final MultiTypedFacet mtFacet) {
-        mtFacet.facetTypes()
-        .forEach(facetType->addFacet(facetType, mtFacet.getFacet(facetType)));
-    }
-
-    @Override
-    public void removeFacet(final Facet facet) {
-        FacetUtil.removeFacet(facetsByClass, facet);
-    }
-
-    @Override
-    public void removeFacet(final Class<? extends Facet> facetType) {
-        FacetUtil.removeFacet(facetsByClass, facetType);
-    }
-
-    @Override
-    public <T extends Facet> T getFacet(final Class<T> facetType) {
+    public <T extends Facet> T getFacet(Class<T> facetType) {
         return uncheckedCast(facetsByClass.get(facetType));
     }
 
     @Override
     public Stream<Facet> streamFacets() {
-        return facetsByClass.values()
-                .stream()
-                .distinct();
+        synchronized(snapshot) {
+            return snapshot.get().stream(); // consumers should play nice and don't take too long  
+        }
     }
 
     @Override
     public int getFacetCount() {
-        return facetsByClass.size();
+        synchronized(snapshot) {
+            return snapshot.get().size();    
+        }
+    }
+    
+    @Override
+    public void addOrReplaceFacet(Facet facet) {
+        
+        Optional.ofNullable(getFacet(facet.facetType()))
+        .filter(each -> facet.getClass() == each.getClass())
+        .ifPresent(existingFacet -> {
+            remove(existingFacet);
+            val underlyingFacet = existingFacet.getUnderlyingFacet();
+            facet.setUnderlyingFacet(underlyingFacet);
+        } );
+        
+        addFacet(facet);
     }
 
     // -- HELPER
 
-    private void addFacet(final Class<? extends Facet> facetType, final Facet facet) {
-        final Facet existingFacet = getFacet(facetType);
+    private void addFacet(Class<? extends Facet> facetType, Facet facet) {
+        val existingFacet = getFacet(facetType);
         if (existingFacet == null || existingFacet.isNoop()) {
             put(facetType, facet);
             return;
@@ -114,8 +114,27 @@ public class FacetHolderImpl implements FacetHolder, MetaModelContextAware {
         put(facetType, facet);
     }
 
-    private void put(final Class<? extends Facet> facetType, final Facet facet) {
-        facetsByClass.put(facetType, facet);
+    private void put(Class<? extends Facet> facetType, Facet facet) {
+        synchronized(snapshot) {
+            snapshot.clear();
+            facetsByClass.put(facetType, facet);
+            facet.forEachAlias(aliasType->facetsByClass.put(aliasType, facet));
+        }
+    }
+    
+    private void remove(Facet facet) {
+        synchronized(snapshot) {
+            snapshot.clear();
+            facetsByClass.remove(facet.facetType());
+            // for all the registered aliases that point to the given facet, remove ...
+            facet.forEachAlias(aliasType->{
+                val aliasFor = facetsByClass.get(aliasType);
+                if(facet == aliasFor) {
+                    facetsByClass.remove(aliasType);
+                }
+            });
+        }
     }
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetUtil.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetUtil.java
index 971aab4..e4d4edb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetUtil.java
@@ -20,34 +20,24 @@
 package org.apache.isis.metamodel.facetapi;
 
 import java.util.List;
-import java.util.Map;
-import java.util.Optional;
 import java.util.function.BiConsumer;
 
 import org.apache.isis.metamodel.util.snapshot.XmlSchema.ExtensionData;
 
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 import lombok.val;
 
-
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class FacetUtil {
 
-    private FacetUtil() {
-    }
 
     public static void addOrReplaceFacet(final Facet facet) {
         if (facet == null) {
             return;
         }
         val facetHolder = facet.getFacetHolder();
-
-        Optional.ofNullable(facetHolder.getFacet(facet.facetType()))
-        .filter(each -> facet.getClass() == each.getClass())
-        .ifPresent(existingFacet -> {
-            val underlyingFacet = existingFacet.getUnderlyingFacet();
-            facetHolder.removeFacet(existingFacet);
-            facet.setUnderlyingFacet(underlyingFacet);
-        } );
-        facetHolder.addFacet(facet);
+        facetHolder.addOrReplaceFacet(facet);
     }
 
     /**
@@ -65,14 +55,6 @@ public final class FacetUtil {
         return true;
     }
 
-    public static boolean addMultiTypedFacet(final MultiTypedFacet facet) {
-        if (facet == null) {
-            return false;
-        }
-        facet.getFacetHolder().addMultiTypedFacet(facet);
-        return true;
-    }
-
     /**
      * Attaches each {@link Facet} to its {@link Facet#getFacetHolder() facet
      * holder}.
@@ -81,29 +63,12 @@ public final class FacetUtil {
      */
     public static boolean addFacets(final List<Facet> facetList) {
         boolean addedFacets = false;
-        for (final Facet facet : facetList) {
+        for (val facet : facetList) {
             addedFacets = addFacet(facet) | addedFacets;
         }
         return addedFacets;
     }
 
-    public static void removeFacet(final Map<Class<? extends Facet>, Facet> facetsByClass, final Facet facet) {
-        removeFacet(facetsByClass, facet.facetType());
-    }
-
-    public static void removeFacet(final Map<Class<? extends Facet>, Facet> facetsByClass, final Class<? extends Facet> facetType) {
-        final Facet facet = facetsByClass.get(facetType);
-        if (facet == null) {
-            return;
-        }
-        facetsByClass.remove(facetType);
-        facet.setFacetHolder(null);
-    }
-
-    public static void addFacet(final Map<Class<? extends Facet>, Facet> facetsByClass, final Facet facet) {
-        facetsByClass.put(facet.facetType(), facet);
-    }
-
     public static <T extends Facet> ExtensionData<T> getFacetsByType(final FacetHolder facetHolder) {
 
         return new ExtensionData<T>() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/MultiTypedFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/MultiTypedFacet.java
deleted file mode 100644
index 639d8a4..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/MultiTypedFacet.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facetapi;
-
-import java.util.stream.Stream;
-
-/**
- * A Class that provides multiple facet implementations, either directly or
- * through a delegate.
- *
- * <p>
- * The client of this interface should use {@link #getFacet(Class)} to obtain
- * the facet implementation for each of the {@link #facetTypes() facets types}.
- */
-public interface MultiTypedFacet extends Facet {
-
-    /**
-     * All of the facet types either implemented or available by this facet
-     * implementation.
-     *
-     */
-    public Stream<Class<? extends Facet>> facetTypes();
-
-    public <T extends Facet> T getFacet(Class<T> facet);
-
-    boolean containsFacetTypeOf(Class<? extends Facet> facetType);
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactoryAbstract.java
index 69c0dbf..f93aa6f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactoryAbstract.java
@@ -27,7 +27,6 @@ import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
-import org.apache.isis.metamodel.facetapi.MultiTypedFacet;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -67,11 +66,6 @@ implements FacetFactory, MetaModelContextAware, MetaModelContext.Delegating {
         FacetUtil.addFacet(facet);
     }
     
-    public void addFacet(final MultiTypedFacet facet) {
-        FacetUtil.addMultiTypedFacet(facet);
-    }
-    
-    
     // -- METHOD UTILITITES
     
     protected static final Class<?>[] NO_PARAMETERS_TYPES = new Class<?>[0];
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MarkerFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MarkerFacet.java
deleted file mode 100644
index b37e2dc..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MarkerFacet.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facets;
-
-import org.apache.isis.metamodel.facetapi.Facet;
-
-public interface MarkerFacet extends Facet {
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MarkerFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MarkerFacetAbstract.java
deleted file mode 100644
index c817779..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MarkerFacetAbstract.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facets;
-
-import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.metamodel.facetapi.FacetHolder;
-
-public abstract class MarkerFacetAbstract extends FacetAbstract implements MarkerFacet {
-
-    public MarkerFacetAbstract(final Class<? extends Facet> facetType, final FacetHolder holder) {
-        super(facetType, holder, Derivation.NOT_DERIVED);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MultipleValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MultipleValueFacetAbstract.java
deleted file mode 100644
index 82b3850..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MultipleValueFacetAbstract.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facets;
-
-import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.metamodel.facetapi.FacetHolder;
-
-public abstract class MultipleValueFacetAbstract extends FacetAbstract implements MultipleValueFacet {
-
-    public MultipleValueFacetAbstract(final Class<? extends Facet> facetType, final FacetHolder holder) {
-        super(facetType, holder, Derivation.NOT_DERIVED);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/command/CommandFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/command/CommandFacetAbstract.java
index 84dcf44..86adae9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/command/CommandFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/command/CommandFacetAbstract.java
@@ -26,10 +26,10 @@ import org.apache.isis.applib.annotation.CommandPersistence;
 import org.apache.isis.applib.services.command.CommandDtoProcessor;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public abstract class CommandFacetAbstract extends MarkerFacetAbstract implements CommandFacet {
+public abstract class CommandFacetAbstract extends FacetAbstract implements CommandFacet {
 
     public static Class<? extends Facet> type() {
         return CommandFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/homepage/HomePageFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/homepage/HomePageFacet.java
index 2086b24..bc09fc5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/homepage/HomePageFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/homepage/HomePageFacet.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.metamodel.facets.actions.homepage;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 /**
  * Indicates that the (no-arg) action (on a domain service) to be invoked automatically
@@ -29,6 +29,6 @@ import org.apache.isis.metamodel.facets.MarkerFacet;
  * In the standard Apache Isis Programming Model, typically corresponds to
  * applying the <tt>@HomePage</tt> annotation at the class level.
  */
-public interface HomePageFacet extends MarkerFacet {
+public interface HomePageFacet extends Facet {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/homepage/HomePageFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/homepage/HomePageFacetAbstract.java
index 27c8f7c..bc1261d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/homepage/HomePageFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/homepage/HomePageFacetAbstract.java
@@ -20,10 +20,10 @@
 package org.apache.isis.metamodel.facets.actions.homepage;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public abstract class HomePageFacetAbstract extends MarkerFacetAbstract implements HomePageFacet {
+public abstract class HomePageFacetAbstract extends FacetAbstract implements HomePageFacet {
 
     public static Class<? extends Facet> type() {
         return HomePageFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java
index 01ec38e..73dd3c6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java
@@ -24,11 +24,11 @@ import java.util.Map;
 import org.apache.isis.applib.services.wrapper.events.VisibilityEvent;
 import org.apache.isis.commons.internal.environment.DeploymentType;
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 import org.apache.isis.metamodel.interactions.VisibilityContext;
 
-public abstract class PrototypeFacetAbstract extends MarkerFacetAbstract implements PrototypeFacet {
+public abstract class PrototypeFacetAbstract extends FacetAbstract implements PrototypeFacet {
 
     private final DeploymentType deploymentType;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/publish/PublishedActionFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/publish/PublishedActionFacet.java
index dc59caa..08daf32 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/publish/PublishedActionFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/publish/PublishedActionFacet.java
@@ -19,12 +19,12 @@
 
 package org.apache.isis.metamodel.facets.actions.publish;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 /**
  * Indicates that the invocation of action should be published, specifying the means by which a
  * canonical event representing this invocation should be created.
  */
-public interface PublishedActionFacet extends MarkerFacet {
+public interface PublishedActionFacet extends Facet {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/publish/PublishedActionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/publish/PublishedActionFacetAbstract.java
index a63ac28..ddb3092 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/publish/PublishedActionFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/publish/PublishedActionFacetAbstract.java
@@ -20,10 +20,10 @@
 package org.apache.isis.metamodel.facets.actions.publish;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public abstract class PublishedActionFacetAbstract extends MarkerFacetAbstract implements PublishedActionFacet {
+public abstract class PublishedActionFacetAbstract extends FacetAbstract implements PublishedActionFacet {
 
     public static Class<? extends Facet> type() {
         return PublishedActionFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/deficiencies/DeficiencyFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/deficiencies/DeficiencyFacet.java
index 5cd3d07..8c2e506 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/deficiencies/DeficiencyFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/deficiencies/DeficiencyFacet.java
@@ -22,6 +22,7 @@ package org.apache.isis.metamodel.facets.all.deficiencies;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Consumer;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -114,5 +115,20 @@ public final class DeficiencyFacet implements Facet {
         throw _Exceptions.unsupportedOperation();
     }
 
+    @Override
+    public void addAlias(Class<? extends Facet> alias) {
+        throw _Exceptions.unsupportedOperation();
+    }
+
+    @Override
+    public void forEachAlias(Consumer<Class<? extends Facet>> onAlias) {
+        throw _Exceptions.unsupportedOperation();
+    }
+
+    @Override
+    public boolean hasAlias(Class<? extends Facet> alias) {
+        return false;
+    }
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/hide/HiddenFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/hide/HiddenFacet.java
index 7ed577a..09ff099 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/hide/HiddenFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/hide/HiddenFacet.java
@@ -19,14 +19,13 @@
 
 package org.apache.isis.metamodel.facets.all.hide;
 
-import org.apache.isis.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.metamodel.facets.WhereValueFacet;
 import org.apache.isis.metamodel.interactions.HidingInteractionAdvisor;
 
 /**
  * Hide a property, collection or action.
  */
-public interface HiddenFacet extends WhereValueFacet, HidingInteractionAdvisor, MultiTypedFacet {
+public interface HiddenFacet extends WhereValueFacet, HidingInteractionAdvisor {
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/named/NamedFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/named/NamedFacet.java
index 576faa5..96a498b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/named/NamedFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/named/NamedFacet.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.metamodel.facets.all.named;
 
-import org.apache.isis.metamodel.facets.MultipleValueFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 /**
  * The name of a class, a property, collection, an action or a parameter.
@@ -28,7 +28,7 @@ import org.apache.isis.metamodel.facets.MultipleValueFacet;
  * In the standard Apache Isis Programming Model, corresponds to annotating the
  * member with <tt>@Named</tt>.
  */
-public interface NamedFacet extends MultipleValueFacet {
+public interface NamedFacet extends Facet {
 
     /**
      * @return The name to use as a label for a collection, a property or a parameter
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/named/NamedFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/named/NamedFacetAbstract.java
index 1dbe43d..c2219d8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/named/NamedFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/named/NamedFacetAbstract.java
@@ -22,10 +22,10 @@ package org.apache.isis.metamodel.facets.all.named;
 import java.util.Map;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MultipleValueFacetAbstract;
 
-public abstract class NamedFacetAbstract extends MultipleValueFacetAbstract implements NamedFacet {
+public abstract class NamedFacetAbstract extends FacetAbstract implements NamedFacet {
 
     private final String value;
     private final boolean escaped;
@@ -34,8 +34,8 @@ public abstract class NamedFacetAbstract extends MultipleValueFacetAbstract impl
         return NamedFacet.class;
     }
 
-    public NamedFacetAbstract(final String value, final boolean escaped, final FacetHolder holder) {
-        super(type(), holder);
+    public NamedFacetAbstract(String value, boolean escaped, FacetHolder holder) {
+        super(type(), holder, Derivation.NOT_DERIVED);
 
         this.value = value;
         this.escaped = escaped;
@@ -51,7 +51,7 @@ public abstract class NamedFacetAbstract extends MultipleValueFacetAbstract impl
         return escaped;
     }
 
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+    @Override public void appendAttributesTo(Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         attributeMap.put("value", value);
         attributeMap.put("escaped", escaped);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/parented/ParentedCollectionFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/parented/ParentedCollectionFacetDefault.java
index b724b7f..02f8e62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/parented/ParentedCollectionFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/parented/ParentedCollectionFacetDefault.java
@@ -20,11 +20,11 @@
 package org.apache.isis.metamodel.facets.collections.parented;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 import org.apache.isis.metamodel.facets.object.parented.ParentedCollectionFacet;
 
-public class ParentedCollectionFacetDefault extends MarkerFacetAbstract implements ParentedCollectionFacet {
+public class ParentedCollectionFacetDefault extends FacetAbstract implements ParentedCollectionFacet {
 
     public static Class<? extends Facet> type() {
         return ParentedCollectionFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/hidden/HiddenFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/hidden/HiddenFacetAbstract.java
index 87c1a4b..f49a45f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/hidden/HiddenFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/hidden/HiddenFacetAbstract.java
@@ -20,7 +20,6 @@
 package org.apache.isis.metamodel.facets.members.hidden;
 
 import java.util.function.Predicate;
-import java.util.stream.Stream;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.VisibilityEvent;
@@ -31,8 +30,6 @@ import org.apache.isis.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.metamodel.interactions.VisibilityContext;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-
 /**
  * This implements {@link org.apache.isis.metamodel.facetapi.MultiTypedFacet} so that each concrete implementation
  * is added to the eventual {@link org.apache.isis.metamodel.facetapi.FacetHolder} twice: once under
@@ -57,6 +54,7 @@ public abstract class HiddenFacetAbstract extends WhereValueFacetAbstract implem
             Where where,
             final FacetHolder holder) {
         super(facetType, holder, where);
+        super.addAlias(HiddenFacet.class);
     }
 
     /**
@@ -64,6 +62,7 @@ public abstract class HiddenFacetAbstract extends WhereValueFacetAbstract implem
      */
     public HiddenFacetAbstract(Where where, final FacetHolder holder) {
         super(HiddenFacetAbstract.class, holder, where);
+        super.addAlias(HiddenFacet.class);
     }
 
     @Override
@@ -77,21 +76,5 @@ public abstract class HiddenFacetAbstract extends WhereValueFacetAbstract implem
      */
     protected abstract String hiddenReason(ManagedObject target, Where whereContext);
 
-    @Override
-    public Stream<Class<? extends Facet>> facetTypes() {
-        return Stream.of(facetType(), HiddenFacet.class);
-    }
-
-    @Override
-    public <T extends Facet> T getFacet(final Class<T> facet) {
-        return uncheckedCast(this);
-    }
-
-    @Override
-    public boolean containsFacetTypeOf(final Class<? extends Facet> requiredFacetType) {
-        return facetTypes()
-                .anyMatch(facetType->facetType == requiredFacetType);
-    }
-
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/order/MemberOrderFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/order/MemberOrderFacetAbstract.java
index 633cba9..241b9e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/order/MemberOrderFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/order/MemberOrderFacetAbstract.java
@@ -24,11 +24,11 @@ import java.util.Map;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.metamodel.facets.MultipleValueFacetAbstract;
 
-public abstract class MemberOrderFacetAbstract extends MultipleValueFacetAbstract implements MemberOrderFacet {
+public abstract class MemberOrderFacetAbstract extends FacetAbstract implements MemberOrderFacet {
 
 
     public static Class<? extends Facet> type() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacet.java
deleted file mode 100644
index e0c14e5..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacet.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facets.object.cached;
-
-import org.apache.isis.metamodel.facets.MarkerFacet;
-
-/**
- * Whether the instances of this class are cached.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to annotating the
- * member with <tt>@Cached</tt>.
- *
- * <p>
- * Cached does not necessarily imply immutable. The idea though is that the
- * developer is indicating that the performance cost of obtaining all instances
- * of an instance is low; viewer implementations might be able to exploit this
- * information.
- *
- * <p>
- * Not yet implemented by any viewer.
- */
-public interface CachedFacet extends MarkerFacet {
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacetAbstract.java
deleted file mode 100644
index 869cb6f..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacetAbstract.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facets.object.cached;
-
-import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
-
-public abstract class CachedFacetAbstract extends MarkerFacetAbstract implements CachedFacet {
-
-    public static Class<? extends Facet> type() {
-        return CachedFacet.class;
-    }
-
-    public CachedFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacetUtils.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacetUtils.java
deleted file mode 100644
index 0066dfe..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cached/CachedFacetUtils.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facets.object.cached;
-
-import org.apache.isis.metamodel.spec.ObjectSpecification;
-
-public class CachedFacetUtils {
-
-    private CachedFacetUtils() {
-    }
-
-    public static boolean isCached(final ObjectSpecification specification) {
-        return specification.getFacet(CachedFacet.class) != null;
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultedFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultedFacet.java
index 6b77ea6..b92c0df 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultedFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultedFacet.java
@@ -20,7 +20,7 @@
 package org.apache.isis.metamodel.facets.object.defaults;
 
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facets.actions.defaults.ActionDefaultsFacet;
 import org.apache.isis.metamodel.facets.properties.defaults.PropertyDefaultFacet;
 
@@ -36,7 +36,7 @@ import org.apache.isis.metamodel.facets.properties.defaults.PropertyDefaultFacet
  * {@link PropertyDefaultFacet} and {@link ActionDefaultsFacet} from the
  * method's return type / parameter types, and copy over.
  */
-public interface DefaultedFacet extends MarkerFacet {
+public interface DefaultedFacet extends Facet {
 
     /**
      * The default (as a pojo, not a {@link ObjectAdapter}).
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java
index 2336d2d..830e945 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java
@@ -19,13 +19,13 @@
 
 package org.apache.isis.metamodel.facets.object.entity;
 
-import org.apache.isis.metamodel.facetapi.MultiTypedFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 /**
  * Indicates that this class is managed by a persistence context.
  * @since 2.0
  */
-public interface EntityFacet extends MultiTypedFacet {
+public interface EntityFacet extends Facet {
 
     String identifierFor(Object pojo);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImpl.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImpl.java
index be11b45..e06740f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImpl.java
@@ -53,7 +53,7 @@ public class ObjectValidPropertiesFacetImpl extends ObjectValidPropertiesFacetAb
         .filter(property->property.isUsable(adapter, context.getInitiatedBy(), where).isVetoed())  // ignore disabled properties
         .forEach(property->{
             final OneToOneAssociation otoa = (OneToOneAssociation) property;
-            final ManagedObject value = otoa.get2(adapter, context.getInitiatedBy());
+            final ManagedObject value = otoa.get(adapter, context.getInitiatedBy());
             if (otoa.isAssociationValid(adapter, value, context.getInitiatedBy()).isVetoed()) {
                 if (buf.length() > 0) {
                     buf.append(", ");
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/parented/ParentedCollectionFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/parented/ParentedCollectionFacet.java
index e80fb50..8aa602d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/parented/ParentedCollectionFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/parented/ParentedCollectionFacet.java
@@ -22,7 +22,7 @@ package org.apache.isis.metamodel.facets.object.parented;
 import java.util.List;
 import java.util.Set;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 /**
  * Indicates that this class is parented, that is, wholly contained within a
@@ -35,6 +35,6 @@ import org.apache.isis.metamodel.facets.MarkerFacet;
  * Internal collections are the {@link List}s, {@link Set}s etc that hold references to
  * other root entities.
  */
-public interface ParentedCollectionFacet extends MarkerFacet {
+public interface ParentedCollectionFacet extends Facet {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/parented/ParentedCollectionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/parented/ParentedCollectionFacetAbstract.java
index 47fb792..37bb554 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/parented/ParentedCollectionFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/parented/ParentedCollectionFacetAbstract.java
@@ -20,10 +20,10 @@
 package org.apache.isis.metamodel.facets.object.parented;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public abstract class ParentedCollectionFacetAbstract extends MarkerFacetAbstract implements ParentedCollectionFacet {
+public abstract class ParentedCollectionFacetAbstract extends FacetAbstract implements ParentedCollectionFacet {
 
     public static Class<? extends Facet> type() {
         return ParentedCollectionFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/publishedobject/PublishedObjectFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/publishedobject/PublishedObjectFacet.java
index 774f9ee..c79680d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/publishedobject/PublishedObjectFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/publishedobject/PublishedObjectFacet.java
@@ -19,12 +19,12 @@
 
 package org.apache.isis.metamodel.facets.object.publishedobject;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 /**
  * Indicates that changes to an object's properties are to be published has, specifying the means by which
  * a canonical event representing these changes should be created.
  */
-public interface PublishedObjectFacet extends MarkerFacet {
+public interface PublishedObjectFacet extends Facet {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/publishedobject/PublishedObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/publishedobject/PublishedObjectFacetAbstract.java
index cd08b33..4a07715 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/publishedobject/PublishedObjectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/publishedobject/PublishedObjectFacetAbstract.java
@@ -20,10 +20,10 @@
 package org.apache.isis.metamodel.facets.object.publishedobject;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public abstract class PublishedObjectFacetAbstract extends MarkerFacetAbstract implements PublishedObjectFacet {
+public abstract class PublishedObjectFacetAbstract extends FacetAbstract implements PublishedObjectFacet {
 
     public static Class<? extends Facet> type() {
         return PublishedObjectFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
index e519131..c31d7da 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
@@ -25,13 +25,13 @@ import java.util.Map;
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.metamodel.commons.MethodExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 import org.apache.isis.metamodel.facets.PostConstructMethodCache;
 import org.apache.isis.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
 
-public abstract class RecreatableObjectFacetAbstract extends MarkerFacetAbstract implements ViewModelFacet {
+public abstract class RecreatableObjectFacetAbstract extends FacetAbstract implements ViewModelFacet {
 
     private final PostConstructMethodCache postConstructMethodCache;
     private final ViewModelFacet.RecreationMechanism recreationMechanism;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
index 3d40258..adbf342 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
@@ -109,7 +109,7 @@ extends RecreatableObjectFacetAbstract {
         .filter(property->!property.isNotPersisted())
         .forEach(property->{
             final ManagedObject propertyValue = 
-                    property.get2(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
+                    property.get(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
             if(propertyValue != null) {
                 memento.put(property.getId(), propertyValue.getPojo());
             }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/EqualByContentFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/EqualByContentFacet.java
index 9cc30ad..2966387 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/EqualByContentFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/EqualByContentFacet.java
@@ -19,19 +19,15 @@
 
 package org.apache.isis.metamodel.facets.object.value;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facets.object.immutable.ImmutableFacet;
 
 /**
  * Indicates that the instances of this class are equal-by-content.
  *
- * <p>
- * In the standard Apache Isis Programming Model, typically corresponds to
- * applying the <tt>@EqualByContent</tt> annotation at the class level.
- *
  * @see ImmutableFacet
  * @see ValueFacet
  */
-public interface EqualByContentFacet extends MarkerFacet {
+public interface EqualByContentFacet extends Facet {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/EqualByContentFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/EqualByContentFacetAbstract.java
index dc93487..48d1e2b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/EqualByContentFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/EqualByContentFacetAbstract.java
@@ -20,10 +20,10 @@
 package org.apache.isis.metamodel.facets.object.value;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public abstract class EqualByContentFacetAbstract extends MarkerFacetAbstract implements EqualByContentFacet {
+public abstract class EqualByContentFacetAbstract extends FacetAbstract implements EqualByContentFacet {
 
     public static Class<? extends Facet> type() {
         return EqualByContentFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacet.java
index 25424f6..9c34a62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacet.java
@@ -19,8 +19,7 @@
 
 package org.apache.isis.metamodel.facets.object.value;
 
-import org.apache.isis.metamodel.facetapi.MultiTypedFacet;
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 /**
  * Indicates that this class has value semantics.
@@ -31,6 +30,6 @@ import org.apache.isis.metamodel.facets.MarkerFacet;
  * convenient term for a number of mostly optional semantics all of which are
  * defined elsewhere.
  */
-public interface ValueFacet extends MarkerFacet, MultiTypedFacet {
+public interface ValueFacet extends Facet {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacetAbstract.java
index a820955..88907a5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -19,23 +19,22 @@
 
 package org.apache.isis.metamodel.facets.object.value;
 
-import java.util.stream.Stream;
-
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.metamodel.commons.ClassExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
-import org.apache.isis.metamodel.facets.MultipleValueFacetAbstract;
 import org.apache.isis.metamodel.facets.object.defaults.DefaultedFacetUsingDefaultsProvider;
 import org.apache.isis.metamodel.facets.object.encodeable.encoder.EncodableFacetUsingEncoderDecoder;
 import org.apache.isis.metamodel.facets.object.parseable.parser.ParseableFacetUsingParser;
 import org.apache.isis.metamodel.facets.object.title.parser.TitleFacetUsingParser;
 
-public abstract class ValueFacetAbstract extends MultipleValueFacetAbstract implements ValueFacet {
+import lombok.val;
+
+public abstract class ValueFacetAbstract extends FacetAbstract implements ValueFacet {
 
     public static Class<? extends Facet> type() {
         return ValueFacet.class;
@@ -51,9 +50,6 @@ public abstract class ValueFacetAbstract extends MultipleValueFacetAbstract impl
                 new Class<?>[] { FacetHolder.class/*, ServiceInjector.class*/ }, new Object[] { holder });
     }
 
-    // to look after the facets (since MultiTyped)
-    private final FacetHolder facetHolder = new FacetHolderImpl();
-
     private final ValueSemanticsProvider<?> semanticsProvider;
 
     public enum AddFacetsIfInvalidStrategy {
@@ -82,7 +78,7 @@ public abstract class ValueFacetAbstract extends MultipleValueFacetAbstract impl
             final AddFacetsIfInvalidStrategy addFacetsIfInvalid, 
             final FacetHolder holder) {
 
-        super(type(), holder);
+        super(type(), holder, Derivation.NOT_DERIVED);
 
         this.semanticsProvider = semanticsProvider;
 
@@ -102,6 +98,8 @@ public abstract class ValueFacetAbstract extends MultipleValueFacetAbstract impl
         // but have the
         // facets themselves reference this value's holder.
 
+        val facetHolder = super.getFacetHolder();
+        
         facetHolder.addFacet((Facet) this); // add just ValueFacet.class
         // initially.
 
@@ -153,24 +151,4 @@ public abstract class ValueFacetAbstract extends MultipleValueFacetAbstract impl
         return this.semanticsProvider != null;
     }
 
-    // /////////////////////////////
-    // MultiTypedFacet impl
-    // /////////////////////////////
-
-    @Override
-    public Stream<Class<? extends Facet>> facetTypes() {
-        return facetHolder.streamFacets()
-                .map(Facet::facetType);
-    }
-
-    @Override
-    public <T extends Facet> T getFacet(final Class<T> facetType) {
-        return facetHolder.getFacet(facetType);
-    }
-
-    @Override
-    public boolean containsFacetTypeOf(final Class<? extends Facet> requiredFacetType) {
-        return facetHolder.containsFacet(requiredFacetType);
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacetSimple.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacetSimple.java
index 502f069..48280ae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacetSimple.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/ValueFacetSimple.java
@@ -19,9 +19,6 @@
 
 package org.apache.isis.metamodel.facets.object.value;
 
-import java.util.Arrays;
-import java.util.stream.Stream;
-
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -32,22 +29,8 @@ public class ValueFacetSimple extends FacetAbstract implements ValueFacet {
         return ValueFacet.class;
     }
 
-    public ValueFacetSimple(final FacetHolder holder) {
+    public ValueFacetSimple(FacetHolder holder) {
         super(type(), holder, Derivation.NOT_DERIVED);
     }
 
-    @Override
-    public Stream<Class<? extends Facet>> facetTypes() {
-        return Arrays.stream(new Class[]{ValueFacet.class});
-    }
-
-    @Override
-    public <T extends Facet> T getFacet(final Class<T> facet) {
-        return (T)this;
-    }
-
-    @Override
-    public boolean containsFacetTypeOf(final Class<? extends Facet> facetType) {
-        return facetType == ValueFacet.class;
-    }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotation.java
index b11f480..8710c70 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotation.java
@@ -28,7 +28,40 @@ import org.apache.isis.metamodel.facets.object.value.vsp.ValueSemanticsProviderU
 
 public class ValueFacetAnnotation extends ValueFacetAbstract {
 
-    private static String semanticsProviderName(final IsisConfiguration config, final Class<?> annotatedClass) {
+    public ValueFacetAnnotation(
+            IsisConfiguration config,
+            Class<?> annotatedClass, 
+            FacetHolder holder) {
+
+        this(
+                semanticsProviderName(config, annotatedClass), 
+                semanticsProviderClass(annotatedClass),
+                holder);
+    }
+
+    /**
+     * Always valid, even if the specified semanticsProviderName might have been
+     * wrong.
+     */
+    @Override
+    public boolean isValid() {
+        return true;
+    }
+    
+    // -- HELPER
+    
+    private ValueFacetAnnotation(
+            String candidateSemanticsProviderName, 
+            Class<?> candidateSemanticsProviderClass, 
+            FacetHolder holder) {
+
+        super(ValueSemanticsProviderUtil
+                .valueSemanticsProviderOrNull(candidateSemanticsProviderClass, candidateSemanticsProviderName), 
+                AddFacetsIfInvalidStrategy.DO_ADD, 
+                holder);
+    }
+    
+    private static String semanticsProviderName(IsisConfiguration config, Class<?> annotatedClass) {
         
         final Value annotation = annotatedClass.getAnnotation(Value.class);
         final String semanticsProviderName = annotation.semanticsProviderName();
@@ -44,32 +77,5 @@ public class ValueFacetAnnotation extends ValueFacetAbstract {
         return annotation.semanticsProviderClass();
     }
 
-    public ValueFacetAnnotation(
-            final IsisConfiguration config,
-            final Class<?> annotatedClass, 
-            final FacetHolder holder) {
-
-        this(semanticsProviderName(config, annotatedClass), 
-                semanticsProviderClass(annotatedClass), holder);
-    }
-
-    private ValueFacetAnnotation(
-            final String candidateSemanticsProviderName, 
-            final Class<?> candidateSemanticsProviderClass, 
-            final FacetHolder holder) {
-
-        super(ValueSemanticsProviderUtil
-                .valueSemanticsProviderOrNull(candidateSemanticsProviderClass, candidateSemanticsProviderName), 
-                AddFacetsIfInvalidStrategy.DO_ADD, holder);
-    }
-
-    /**
-     * Always valid, even if the specified semanticsProviderName might have been
-     * wrong.
-     */
-    @Override
-    public boolean isValid() {
-        return true;
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
index 30fcd9f..5073cd1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
@@ -75,7 +75,7 @@ public class ValueFacetAnnotationOrConfigurationFactory extends FacetFactoryAbst
     @Override
     public void process(final ProcessClassContext processClassContext) {
         
-        FacetUtil.addMultiTypedFacet(create(processClassContext.getCls(), processClassContext.getFacetHolder()));
+        FacetUtil.addFacet(create(processClassContext.getCls(), processClassContext.getFacetHolder()));
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetFromConfiguration.java
index d3a61d5..383d24a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetFromConfiguration.java
@@ -26,8 +26,8 @@ import org.apache.isis.metamodel.facets.object.value.vsp.ValueSemanticsProviderU
 public class ValueFacetFromConfiguration extends ValueFacetAbstract {
 
     public ValueFacetFromConfiguration(
-            final String candidateSemanticsProviderName, 
-            final FacetHolder holder) {
+            String candidateSemanticsProviderName, 
+            FacetHolder holder) {
 
         super(
                 ValueSemanticsProviderUtil.valueSemanticsProviderOrNull(null, candidateSemanticsProviderName), 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProvider.java
index f8f2372..070aa99 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProvider.java
@@ -27,8 +27,8 @@ import org.apache.isis.metamodel.facets.object.value.ValueFacetAbstract;
 public class ValueFacetUsingSemanticsProvider extends ValueFacetAbstract {
 
     public ValueFacetUsingSemanticsProvider(
-            final ValueSemanticsProvider<?> adapter, 
-            final Facet underlyingValueTypeFacet) {
+            ValueSemanticsProvider<?> adapter, 
+            Facet underlyingValueTypeFacet) {
 
         super(adapter, AddFacetsIfInvalidStrategy.DO_ADD, underlyingValueTypeFacet.getFacetHolder());
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java
index 1354d23..d495640 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java
@@ -34,7 +34,7 @@ public abstract class ValueFacetUsingSemanticsProviderFactory<T> extends FacetFa
     protected void addFacets(final ValueSemanticsProviderAndFacetAbstract<T> adapter) {
         final ValueFacetUsingSemanticsProvider facet = 
                 new ValueFacetUsingSemanticsProvider(adapter, adapter);
-        FacetUtil.addMultiTypedFacet(facet);
+        FacetUtil.addFacet(facet);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/wizard/WizardFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/wizard/WizardFacetAbstract.java
index f2be2c2..fd82195 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/wizard/WizardFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/wizard/WizardFacetAbstract.java
@@ -20,10 +20,10 @@
 package org.apache.isis.metamodel.facets.object.wizard;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public abstract class WizardFacetAbstract extends MarkerFacetAbstract implements WizardFacet {
+public abstract class WizardFacetAbstract extends FacetAbstract implements WizardFacet {
 
     public static Class<? extends Facet> type() {
         return WizardFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/labelat/LabelAtFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/labelat/LabelAtFacetAbstract.java
index 0eac4eb..2c50737 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/labelat/LabelAtFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/labelat/LabelAtFacetAbstract.java
@@ -23,10 +23,10 @@ import java.util.Map;
 
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MultipleValueFacetAbstract;
 
-public abstract class LabelAtFacetAbstract extends MultipleValueFacetAbstract implements LabelAtFacet {
+public abstract class LabelAtFacetAbstract extends FacetAbstract implements LabelAtFacet {
 
     public static Class<? extends Facet> type() {
         return LabelAtFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacet.java
index c77aa91..95f3f42 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacet.java
@@ -21,7 +21,6 @@ package org.apache.isis.metamodel.facets.objectvalue.mandatory;
 
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacet;
 import org.apache.isis.metamodel.interactions.ValidatingInteractionAdvisor;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
@@ -37,7 +36,7 @@ import org.apache.isis.metamodel.spec.ManagedObject;
  * In the standard Apache Isis Programming Model, specify mandatory by
  * <i>omitting</i> the <tt>@Optional</tt> annotation.
  */
-public interface MandatoryFacet extends MarkerFacet, ValidatingInteractionAdvisor {
+public interface MandatoryFacet extends Facet, ValidatingInteractionAdvisor {
 
     /**
      * Whether this value is required but has not been provided (and is
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
index 6323a02..91ccd3a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
@@ -23,10 +23,9 @@ import java.util.Map;
 
 import org.apache.isis.applib.services.wrapper.events.ValidityEvent;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 import org.apache.isis.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.metamodel.interactions.PropertyModifyContext;
@@ -36,7 +35,7 @@ import org.apache.isis.metamodel.spec.ManagedObject;
 
 import lombok.val;
 
-public abstract class MandatoryFacetAbstract extends MarkerFacetAbstract implements MandatoryFacet {
+public abstract class MandatoryFacetAbstract extends FacetAbstract implements MandatoryFacet {
 
     public static Class<? extends Facet> type() {
         return MandatoryFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/multiline/MultiLineFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/multiline/MultiLineFacetAbstract.java
index 2dbf9b4..b363613 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/multiline/MultiLineFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/multiline/MultiLineFacetAbstract.java
@@ -22,10 +22,10 @@ package org.apache.isis.metamodel.facets.objectvalue.multiline;
 import java.util.Map;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MultipleValueFacetAbstract;
 
-public abstract class MultiLineFacetAbstract extends MultipleValueFacetAbstract implements MultiLineFacet {
+public abstract class MultiLineFacetAbstract extends FacetAbstract implements MultiLineFacet {
 
     public static Class<? extends Facet> type() {
         return MultiLineFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/regex/RegExFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/regex/RegExFacetAbstract.java
index 64aeeb9..76574aa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/regex/RegExFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/regex/RegExFacetAbstract.java
@@ -23,13 +23,13 @@ import javax.validation.constraints.Pattern;
 
 import org.apache.isis.applib.services.wrapper.events.ValidityEvent;
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MultipleValueFacetAbstract;
 import org.apache.isis.metamodel.interactions.ProposedHolder;
 import org.apache.isis.metamodel.interactions.ValidityContext;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
-public abstract class RegExFacetAbstract extends MultipleValueFacetAbstract implements RegExFacet {
+public abstract class RegExFacetAbstract extends FacetAbstract implements RegExFacet {
 
     public static Class<? extends Facet> type() {
         return RegExFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/propcoll/notpersisted/NotPersistedFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/propcoll/notpersisted/NotPersistedFacet.java
index 7e35c75..4f9c636 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/propcoll/notpersisted/NotPersistedFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/propcoll/notpersisted/NotPersistedFacet.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.metamodel.facets.propcoll.notpersisted;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 /**
  * Indicates that a property or a collection shouldn't be persisted.
@@ -33,6 +33,6 @@ import org.apache.isis.metamodel.facets.MarkerFacet;
  *
  * @see http://mail-archives.apache.org/mod_mbox/incubator-isis-dev/201010.mbox/%3C4CB2FA43.7030206@nakedobjects.org%3E
  */
-public interface NotPersistedFacet extends MarkerFacet {
+public interface NotPersistedFacet extends Facet {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/propcoll/notpersisted/NotPersistedFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/propcoll/notpersisted/NotPersistedFacetAbstract.java
index d911497..380ddaf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/propcoll/notpersisted/NotPersistedFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/propcoll/notpersisted/NotPersistedFacetAbstract.java
@@ -20,10 +20,10 @@
 package org.apache.isis.metamodel.facets.propcoll.notpersisted;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public abstract class NotPersistedFacetAbstract extends MarkerFacetAbstract implements NotPersistedFacet {
+public abstract class NotPersistedFacetAbstract extends FacetAbstract implements NotPersistedFacet {
 
     public static Class<? extends Facet> type() {
         return NotPersistedFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/publish/PublishedPropertyFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/publish/PublishedPropertyFacet.java
index 6a37384..1b5261f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/publish/PublishedPropertyFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/publish/PublishedPropertyFacet.java
@@ -19,11 +19,11 @@
 
 package org.apache.isis.metamodel.facets.properties.publish;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 /**
  * Indicates that the editing of the property should be published.
  */
-public interface PublishedPropertyFacet extends MarkerFacet {
+public interface PublishedPropertyFacet extends Facet {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/publish/PublishedPropertyFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/publish/PublishedPropertyFacetAbstract.java
index 8fc14a4..4ba6fb0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/publish/PublishedPropertyFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/publish/PublishedPropertyFacetAbstract.java
@@ -20,10 +20,11 @@
 package org.apache.isis.metamodel.facets.properties.publish;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public abstract class PublishedPropertyFacetAbstract extends MarkerFacetAbstract
+public abstract class PublishedPropertyFacetAbstract 
+extends FacetAbstract
 implements PublishedPropertyFacet {
 
     public static Class<? extends Facet> type() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/searchable/SearchableFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/searchable/SearchableFacetAbstract.java
index 27ff64b..61ae5b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/searchable/SearchableFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/searchable/SearchableFacetAbstract.java
@@ -20,10 +20,10 @@
 package org.apache.isis.metamodel.facets.properties.searchable;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MultipleValueFacetAbstract;
 
-public abstract class SearchableFacetAbstract extends MultipleValueFacetAbstract implements SearchableFacet {
+public abstract class SearchableFacetAbstract extends FacetAbstract implements SearchableFacet {
 
     public static Class<? extends Facet> type() {
         return SearchableFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/OneToOneAssociation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/OneToOneAssociation.java
index e33e7b2..61d14b9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/OneToOneAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/OneToOneAssociation.java
@@ -50,9 +50,4 @@ public interface OneToOneAssociation extends ObjectAssociation, OneToOneFeature,
             final InteractionInitiatedBy interactionInitiatedBy);
 
 
-    //FIXME[ISIS-1976] only temporary for refactoring - remove
-    @Deprecated
-    ManagedObject get2(ManagedObject adapter, InteractionInitiatedBy initiatedBy);
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionContributee.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionContributee.java
index 97385ce..972cfcb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionContributee.java
@@ -20,19 +20,16 @@ package org.apache.isis.metamodel.specloader.specimpl;
 
 import java.util.Arrays;
 import java.util.List;
-import java.util.stream.Stream;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
-import org.apache.isis.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.metamodel.facets.FacetedMethodParameter;
 import org.apache.isis.metamodel.interactions.InteractionUtils;
 import org.apache.isis.metamodel.interactions.UsabilityContext;
@@ -227,51 +224,10 @@ public class ObjectActionContributee extends ObjectActionDefault implements Cont
     // //////////////////////////////////////
 
     @Override
-    public int getFacetCount() {
-        return facetHolder.getFacetCount();
+    public FacetHolder getFacetHolder() {
+        return facetHolder;
     }
 
-    @Override
-    public <T extends Facet> T getFacet(Class<T> cls) {
-        return facetHolder.getFacet(cls);
-    }
-
-    @Override
-    public boolean containsFacet(Class<? extends Facet> facetType) {
-        return facetHolder.containsFacet(facetType);
-    }
-
-    @Override
-    public boolean containsDoOpFacet(java.lang.Class<? extends Facet> facetType) {
-        return facetHolder.containsDoOpFacet(facetType);
-    }
-
-    @Override
-    public Stream<Facet> streamFacets() {
-        return facetHolder.streamFacets();
-    }
-
-    @Override
-    public void addFacet(Facet facet) {
-        facetHolder.addFacet(facet);
-    }
-
-    @Override
-    public void addMultiTypedFacet(MultiTypedFacet facet) {
-        facetHolder.addMultiTypedFacet(facet);
-    }
-
-    @Override
-    public void removeFacet(Facet facet) {
-        facetHolder.removeFacet(facet);
-    }
-
-    @Override
-    public void removeFacet(Class<? extends Facet> facetType) {
-        facetHolder.removeFacet(facetType);
-    }
-
-
     // //////////////////////////////////////
 
     /* (non-Javadoc)
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
index d3f7d93..1320f78 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -83,8 +83,6 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
      */
     List<ObjectActionParameter> parameters;
 
-
-
     // -- constructors
 
     public ObjectActionDefault(
@@ -92,8 +90,6 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
         super(facetedMethod, FeatureType.ACTION);
     }
 
-
-
     // -- ReturnType, OnType, Actions (set)
     /**
      * Always returns <tt>null</tt>.
@@ -695,4 +691,10 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
         return sb.toString();
     }
 
+
+    @Override
+    public FacetHolder getFacetHolder() {
+        return super.getFacetedMethod();
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index d6117e5..b22a1a0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -43,6 +43,8 @@ import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.metamodel.spec.feature.ObjectActionParameter;
 
+import lombok.Getter;
+
 public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInMember {
 
     /**
@@ -63,6 +65,7 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
     /**
      * Hold facets rather than delegate to the mixin action
      */
+    @Getter(onMethod = @__(@Override))
     private final FacetHolder facetHolder = new FacetHolderImpl();
 
     /**
@@ -92,7 +95,7 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
 
         if(_Strings.isNullOrEmpty(name) || name.equalsIgnoreCase(mixinMethodName)) {
             String memberName = determineNameFrom(mixinAction);
-            super.addFacet(new NamedFacetInferred(memberName, facetHolder));
+            this.addFacet(new NamedFacetInferred(memberName, facetHolder));
         }
 
         // calculate the identifier
@@ -237,13 +240,6 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
                 interactionInitiatedBy);
     }
 
-    // -- facetHolder
-    @Override
-    protected FacetHolder getFacetHolder() {
-        return facetHolder;
-    }
-
-
     /* (non-Javadoc)
      * @see org.apache.isis.metamodel.specloader.specimpl.ObjectMemberAbstract#getIdentifier()
      */
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 271e70d..093a395 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -22,7 +22,6 @@ package org.apache.isis.metamodel.specloader.specimpl;
 import java.util.Arrays;
 import java.util.List;
 import java.util.function.Predicate;
-import java.util.stream.Stream;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -38,10 +37,8 @@ import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.consent.InteractionResult;
 import org.apache.isis.metamodel.consent.InteractionResultSet;
-import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FeatureType;
-import org.apache.isis.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.metamodel.facets.TypedHolder;
 import org.apache.isis.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.metamodel.facets.all.named.NamedFacet;
@@ -65,7 +62,10 @@ import org.apache.isis.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 
-public abstract class ObjectActionParameterAbstract implements ObjectActionParameter {
+import static org.apache.isis.commons.internal.base._With.requires;
+
+public abstract class ObjectActionParameterAbstract 
+implements ObjectActionParameter, FacetHolder.Delegating {
 
     private final FeatureType featureType;
     private final int number;
@@ -77,10 +77,11 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
             final int number,
             final ObjectActionDefault objectAction,
             final TypedHolder peer) {
+        
         this.featureType = featureType;
         this.number = number;
         this.parentAction = objectAction;
-        this.peer = peer;
+        this.peer = requires(peer, "peer");
     }
     
     @Override
@@ -215,81 +216,11 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
 
     // -- FacetHolder
 
-    protected FacetHolder getFacetHolder() {
-        return peer;
-    }
-
-    @Override
-    public boolean containsFacet(final Class<? extends Facet> facetType) {
-        final FacetHolder facetHolder = getFacetHolder();
-        return facetHolder != null && facetHolder.containsFacet(facetType);
-    }
-
-    @Override
-    public boolean containsDoOpFacet(final Class<? extends Facet> facetType) {
-        final FacetHolder facetHolder = getFacetHolder();
-        return facetHolder != null && facetHolder.containsDoOpFacet(facetType);
-    }
-
-    @Override
-    public boolean containsDoOpNotDerivedFacet(final Class<? extends Facet> facetType) {
-        final FacetHolder facetHolder = getFacetHolder();
-        return facetHolder != null && facetHolder.containsDoOpNotDerivedFacet(facetType);
-    }
-
-
-    @Override
-    public <T extends Facet> T getFacet(final Class<T> cls) {
-        final FacetHolder facetHolder = getFacetHolder();
-        return facetHolder != null ? facetHolder.getFacet(cls) : null;
-    }
-
-    @Override
-    public int getFacetCount() {
-        final FacetHolder facetHolder = getFacetHolder();
-        return facetHolder != null ? facetHolder.getFacetCount() : 0;
-    }
-
-    @Override
-    public Stream<Facet> streamFacets() {
-        final FacetHolder facetHolder = getFacetHolder();
-        return facetHolder != null ? facetHolder.streamFacets() : Stream.of();
-    }
-
-    @Override
-    public void addFacet(final Facet facet) {
-        final FacetHolder facetHolder = getFacetHolder();
-        if (facetHolder != null) {
-            facetHolder.addFacet(facet);
-        }
-    }
-
-    @Override
-    public void addMultiTypedFacet(final MultiTypedFacet facet) {
-        final FacetHolder facetHolder = getFacetHolder();
-        if (facetHolder != null) {
-            facetHolder.addMultiTypedFacet(facet);
-        }
-    }
-
-    @Override
-    public void removeFacet(final Facet facet) {
-        final FacetHolder facetHolder = getFacetHolder();
-        if (facetHolder != null) {
-            facetHolder.removeFacet(facet);
-        }
-    }
-
     @Override
-    public void removeFacet(final Class<? extends Facet> facetType) {
-        final FacetHolder facetHolder = getFacetHolder();
-        if (facetHolder != null) {
-            facetHolder.removeFacet(facetType);
-        }
+    public FacetHolder getFacetHolder() {
+        return peer;
     }
 
-
-
     // -- AutoComplete
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectAssociationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
index d64e11d..62533e5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
@@ -20,6 +20,7 @@
 package org.apache.isis.metamodel.specloader.specimpl;
 
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetedMethod;
 import org.apache.isis.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
@@ -45,6 +46,11 @@ public abstract class ObjectAssociationAbstract extends ObjectMemberAbstract imp
         }
         this.specification = specification;
     }
+    
+    @Override
+    public FacetHolder getFacetHolder() {
+        return getFacetedMethod();
+    }
 
     @Override
     public ObjectSpecification getOnType() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index e9b19b2..406d689 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -20,7 +20,6 @@
 package org.apache.isis.metamodel.specloader.specimpl;
 
 import java.util.Objects;
-import java.util.stream.Stream;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
@@ -28,6 +27,7 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
@@ -35,7 +35,6 @@ import org.apache.isis.metamodel.consent.InteractionResult;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FeatureType;
-import org.apache.isis.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.metamodel.facets.FacetedMethod;
 import org.apache.isis.metamodel.facets.actions.action.invocation.CommandUtil;
 import org.apache.isis.metamodel.facets.actions.command.CommandFacet;
@@ -61,7 +60,8 @@ import org.apache.isis.schema.utils.CommandDtoUtils;
 
 import lombok.val;
 
-public abstract class ObjectMemberAbstract implements ObjectMember, MetaModelContext.Delegating {
+public abstract class ObjectMemberAbstract 
+implements ObjectMember, MetaModelContext.Delegating, FacetHolder.Delegating {
 
     protected ObjectSpecification specificationOf(final Class<?> type) {
         return type != null 
@@ -104,8 +104,6 @@ public abstract class ObjectMemberAbstract implements ObjectMember, MetaModelCon
         return featureType;
     }
 
-
-
     // -- Facets
 
     /**
@@ -115,62 +113,6 @@ public abstract class ObjectMemberAbstract implements ObjectMember, MetaModelCon
         return facetedMethod;
     }
 
-    protected FacetHolder getFacetHolder() {
-        return getFacetedMethod();
-    }
-
-    @Override
-    public boolean containsFacet(final Class<? extends Facet> facetType) {
-        return getFacetHolder().containsFacet(facetType);
-    }
-
-    @Override
-    public boolean containsDoOpFacet(final Class<? extends Facet> facetType) {
-        return getFacetHolder().containsDoOpFacet(facetType);
-    }
-
-    @Override
-    public boolean containsDoOpNotDerivedFacet(final Class<? extends Facet> facetType) {
-        return getFacetHolder().containsDoOpNotDerivedFacet(facetType);
-    }
-
-    @Override
-    public <T extends Facet> T getFacet(final Class<T> cls) {
-        return getFacetHolder().getFacet(cls);
-    }
-
-    @Override
-    public int getFacetCount() {
-        return getFacetHolder().getFacetCount();
-    }
-
-    @Override
-    public Stream<Facet> streamFacets() {
-        return getFacetHolder().streamFacets();
-    }
-
-    @Override
-    public void addFacet(final Facet facet) {
-        getFacetHolder().addFacet(facet);
-    }
-
-    @Override
-    public void addMultiTypedFacet(final MultiTypedFacet facet) {
-        getFacetHolder().addMultiTypedFacet(facet);
-    }
-
-    @Override
-    public void removeFacet(final Facet facet) {
-        getFacetHolder().removeFacet(facet);
-    }
-
-    @Override
-    public void removeFacet(final Class<? extends Facet> facetType) {
-        getFacetHolder().removeFacet(facetType);
-    }
-
-
-
     // -- Name, Description, Help (convenience for facets)
     /**
      * Return the default label for this member. This is based on the name of
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
index 92c2fe1..c107f6e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
@@ -41,6 +41,7 @@ import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
 
+import lombok.Getter;
 import lombok.val;
 
 public class OneToManyAssociationContributee 
@@ -54,6 +55,7 @@ extends OneToManyAssociationDefault implements ContributeeMember {
      * Hold facets rather than delegate to the contributed action (different types might
      * use layout metadata to position the contributee in different ways)
      */
+    @Getter(onMethod = @__(@Override))
     private final FacetHolder facetHolder = new FacetHolderImpl();
 
     private final Identifier identifier;
@@ -170,11 +172,6 @@ extends OneToManyAssociationDefault implements ContributeeMember {
 
     // -- FacetHolder
 
-    @Override
-    protected FacetHolder getFacetHolder() {
-        return facetHolder;
-    }
-
     private ManagedObject getServiceAdapter() {
         return getObjectAdapterProvider().adapterForBean(serviceBean);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
index 100429d..e30f36a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -42,6 +42,7 @@ import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
+import lombok.Getter;
 import lombok.val;
 
 public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault implements MixedInMember {
@@ -66,6 +67,7 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
      * Hold facets rather than delegate to the mixin action (different types might use layout metadata to position
      * the mixin in different ways)
      */
+    @Getter(onMethod = @__(@Override))
     private final FacetHolder facetHolder = new FacetHolderImpl();
 
     private final Identifier identifier;
@@ -198,13 +200,6 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 
-    // -- FacetHolder
-
-    @Override
-    protected FacetHolder getFacetHolder() {
-        return facetHolder;
-    }
-
     @Override
     public ObjectSpecification getOnType() {
         return mixedInType;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
index 2f1c3af..73dba87 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
@@ -41,6 +41,8 @@ import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
 
+import lombok.Getter;
+
 public class OneToOneAssociationContributee extends OneToOneAssociationDefault implements ContributeeMember {
 
     private final ManagedBeanAdapter serviceBean;
@@ -50,6 +52,7 @@ public class OneToOneAssociationContributee extends OneToOneAssociationDefault i
      * Hold facets rather than delegate to the contributed action (different types might
      * use layout metadata to position the contributee in different ways)
      */
+    @Getter(onMethod = @__(@Override))
     private final FacetHolder facetHolder = new FacetHolderImpl();
 
     private final Identifier identifier;
@@ -152,11 +155,6 @@ public class OneToOneAssociationContributee extends OneToOneAssociationDefault i
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 
-    @Override
-    protected FacetHolder getFacetHolder() {
-        return facetHolder;
-    }
-
     private ObjectAdapter getServiceAdapter() {
         return getObjectAdapterProvider().adapterForBean(serviceBean);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
index 61406c1..df16063 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -31,6 +31,7 @@ import org.apache.isis.metamodel.commons.ToString;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.consent.InteractionResult;
+import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetedMethod;
 import org.apache.isis.metamodel.facets.actions.action.invocation.CommandUtil;
@@ -153,23 +154,6 @@ public class OneToOneAssociationDefault extends ObjectAssociationAbstract implem
         return getObjectAdapterProvider().adapterFor(referencedPojo);
     }
 
-
-    @Override
-    public ManagedObject get2(
-            ManagedObject ownerAdapter, 
-            InteractionInitiatedBy interactionInitiatedBy) {
-
-        final PropertyOrCollectionAccessorFacet facet = getFacet(PropertyOrCollectionAccessorFacet.class);
-        final Object referencedPojo =
-                facet.getProperty(ownerAdapter, interactionInitiatedBy);
-
-        if (referencedPojo == null) {
-            return null;
-        }
-
-        return getObjectAdapterProvider().adapterFor(referencedPojo);
-    }
-
     @Override
     public boolean isEmpty(final ManagedObject ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
         return get(ownerAdapter, interactionInitiatedBy) == null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
index 59657f1..38b9b56 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
@@ -40,6 +40,7 @@ import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
+import lombok.Getter;
 import lombok.val;
 
 public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault implements MixedInMember {
@@ -64,6 +65,7 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
      * Hold facets rather than delegate to the contributed action (different types might
      * use layout metadata to position the contributee in different ways)
      */
+    @Getter(onMethod = @__(@Override))
     private final FacetHolder facetHolder = new FacetHolderImpl();
 
     private final Identifier identifier;
@@ -185,11 +187,6 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
     }
 
     @Override
-    protected FacetHolder getFacetHolder() {
-        return facetHolder;
-    }
-
-    @Override
     public ObjectSpecification getOnType() {
         return mixedInType;
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
index c9fa27d..841f9f6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
@@ -231,6 +231,6 @@ public class ObjectAssociationAbstractTest_alwaysHidden {
                 return noop;
             }
         };
-        FacetUtil.addMultiTypedFacet(facet);
+        FacetUtil.addFacet(facet);
     }
 }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java
index 20ed75d..039f470 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java
@@ -66,7 +66,7 @@ implements ObjectSpecIdFacetFactory {
 
         final IdentityType annotationIdentityType = annotation.identityType();
 
-        FacetUtil.addMultiTypedFacet(new JdoPersistenceCapableFacetAnnotation(
+        FacetUtil.addFacet(new JdoPersistenceCapableFacetAnnotation(
                 annotationSchemaAttribute,
                 annotationTableAttribute, annotationIdentityType, processClassContext.getFacetHolder()));
         return;
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAbstract.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAbstract.java
index cac0712..72dcd6a 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAbstract.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAbstract.java
@@ -18,14 +18,10 @@
  */
 package org.apache.isis.jdo.metamodel.facets.object.persistencecapable;
 
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Stream;
 
 import javax.jdo.annotations.IdentityType;
 
-import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -53,6 +49,7 @@ implements JdoPersistenceCapableFacet {
         this.schema = schemaName;
         this.table = tableOrTypeName;
         this.identityType = identityType;
+        super.addAlias(EntityFacet.class);
     }
 
     @Override
@@ -76,25 +73,4 @@ implements JdoPersistenceCapableFacet {
         attributeMap.put("identityType", identityType);
     }
     
-    private final static List<Class<? extends Facet>> types =
-        _Lists.of(JdoPersistenceCapableFacetAbstract.type(), EntityFacet.class);
-    
-    
-    @Override
-    public Stream<Class<? extends Facet>> facetTypes() {
-        return types.stream();
-    }
-
-    @Override
-    public <T extends Facet> T getFacet(Class<T> facetType) {
-        return containsFacetTypeOf(facetType)
-                ? _Casts.uncheckedCast(this)
-                        : null;
-    }
-
-    @Override
-    public boolean containsFacetTypeOf(Class<? extends Facet> facetType) {
-        return types.contains(facetType);
-    }
-    
 }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionFacet.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionFacet.java
index db1d634..73afd6b 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionFacet.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionFacet.java
@@ -18,8 +18,8 @@
  */
 package org.apache.isis.jdo.metamodel.facets.object.version;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.facetapi.Facet;
 
-public interface JdoVersionFacet extends MarkerFacet {
+public interface JdoVersionFacet extends Facet {
 
 }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionFacetFromAnnotation.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionFacetFromAnnotation.java
index 699778c..d079cf3 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionFacetFromAnnotation.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionFacetFromAnnotation.java
@@ -18,10 +18,10 @@
  */
 package org.apache.isis.jdo.metamodel.facets.object.version;
 
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
-public class JdoVersionFacetFromAnnotation extends MarkerFacetAbstract implements JdoVersionFacet {
+public class JdoVersionFacetFromAnnotation extends FacetAbstract implements JdoVersionFacet {
 
     public JdoVersionFacetFromAnnotation(FacetHolder holder) {
         super(JdoVersionFacet.class, holder);
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacet.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacet.java
index 4726044..0b354ee 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacet.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacet.java
@@ -20,7 +20,8 @@ package org.apache.isis.jdo.metamodel.facets.prop.notpersistent;
 
 import javax.jdo.annotations.PrimaryKey;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.adapter.oid.Oid;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 
 /**
@@ -29,6 +30,6 @@ import org.apache.isis.metamodel.facets.MarkerFacet;
  * The JDO {@link PrimaryKey} annotation is used internally the JDO object store to
  * create the {@link Oid}.
  */
-public interface JdoNotPersistentFacet extends MarkerFacet {
+public interface JdoNotPersistentFacet extends Facet {
 
 }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetAbstract.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetAbstract.java
index f754a78..6f71207 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetAbstract.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetAbstract.java
@@ -19,12 +19,13 @@
 package org.apache.isis.jdo.metamodel.facets.prop.notpersistent;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
 
-public abstract class JdoNotPersistentFacetAbstract extends MarkerFacetAbstract implements
-JdoNotPersistentFacet {
+public abstract class JdoNotPersistentFacetAbstract 
+extends FacetAbstract 
+implements JdoNotPersistentFacet {
 
     public static Class<? extends Facet> type() {
         return JdoNotPersistentFacet.class;
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyFacet.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyFacet.java
index c429e3d..9ca84e0 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyFacet.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyFacet.java
@@ -20,7 +20,8 @@ package org.apache.isis.jdo.metamodel.facets.prop.primarykey;
 
 import javax.jdo.annotations.PrimaryKey;
 
-import org.apache.isis.metamodel.facets.MarkerFacet;
+import org.apache.isis.metamodel.adapter.oid.Oid;
+import org.apache.isis.metamodel.facetapi.Facet;
 
 
 /**
@@ -29,6 +30,6 @@ import org.apache.isis.metamodel.facets.MarkerFacet;
  * The JDO {@link PrimaryKey} annotation is used internally the JDO object store to
  * create the {@link Oid}.
  */
-public interface JdoPrimaryKeyFacet extends MarkerFacet {
+public interface JdoPrimaryKeyFacet extends Facet {
 
 }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyFacetAbstract.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyFacetAbstract.java
index 913d96b..85e9e1d 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyFacetAbstract.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyFacetAbstract.java
@@ -19,12 +19,13 @@
 package org.apache.isis.jdo.metamodel.facets.prop.primarykey;
 
 import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
 
 
-public abstract class JdoPrimaryKeyFacetAbstract extends MarkerFacetAbstract implements
-JdoPrimaryKeyFacet {
+public abstract class JdoPrimaryKeyFacetAbstract 
+extends FacetAbstract 
+implements JdoPrimaryKeyFacet {
 
     public static Class<? extends Facet> type() {
         return JdoPrimaryKeyFacet.class;
diff --git a/core/plugins/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/system/ObjectMemberAbstractTest.java b/core/plugins/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/system/ObjectMemberAbstractTest.java
index ad0ec81..00f16bc 100644
--- a/core/plugins/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/system/ObjectMemberAbstractTest.java
+++ b/core/plugins/jdo/datanucleus-5/src/test/java/org/apache/isis/runtime/system/ObjectMemberAbstractTest.java
@@ -33,6 +33,7 @@ import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid.Factory;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetedMethod;
 import org.apache.isis.metamodel.facets.all.describedas.DescribedAsFacetAbstract;
@@ -158,7 +159,7 @@ public class ObjectMemberAbstractTest {
     @Test
     public void testVisibleWhenHiddenFacetSetToAlways() {
         testMember.addFacet(new HideForContextFacetNone(testMember));
-        testMember.addMultiTypedFacet(new HiddenFacetAbstract(Where.ANYWHERE, testMember) {
+        testMember.addFacet(new HiddenFacetAbstract(Where.ANYWHERE, testMember) {
             @Override
             public String hiddenReason(final ManagedObject target, final Where whereContext) {
                 return null;
@@ -171,7 +172,7 @@ public class ObjectMemberAbstractTest {
     @Test
     public void testVisibleWhenHiddenFacetSet() {
         testMember.addFacet(new HideForContextFacetNone(testMember));
-        testMember.addMultiTypedFacet(new HiddenFacetAbstractImpl(Where.ANYWHERE, testMember){});
+        testMember.addFacet(new HiddenFacetAbstractImpl(Where.ANYWHERE, testMember){});
 
         final Consent visible = testMember.isVisible(transientAdapter, InteractionInitiatedBy.USER, Where.ANYWHERE);
         assertFalse(visible.isAllowed());
@@ -179,7 +180,7 @@ public class ObjectMemberAbstractTest {
 
     @Test
     public void testVisibleDeclaratively() {
-        testMember.addMultiTypedFacet(new HiddenFacetAbstractAlwaysEverywhere(testMember) {});
+        testMember.addFacet(new HiddenFacetAbstractAlwaysEverywhere(testMember) {});
         assertFalse(testMember.isVisible(persistentAdapter, InteractionInitiatedBy.USER, Where.ANYWHERE).isAllowed());
     }
 
@@ -237,6 +238,11 @@ class ObjectMemberAbstractImpl extends ObjectMemberAbstract {
             return firstName;
         }
     }
+    
+    @Override
+    public FacetHolder getFacetHolder() {
+        return getFacetedMethod();
+    }
 
     protected ObjectMemberAbstractImpl(MetaModelContext mmc, final String id) {
         super(FacetedMethod.createForProperty(Customer.class, "firstName"), FeatureType.PROPERTY);
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
index f7731a3..afaa4c4 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
@@ -459,6 +459,9 @@ public class ObjectAdapterMementoDefault implements Serializable {
         this.cardinality = Cardinality.SCALAR;
 
         this.persistentOidStr = rootOid.enString();
+        
+        requires(persistentOidStr, "persistentOidStr");
+        
         this.bookmark = rootOid.asBookmark();
         this.objectSpecId = rootOid.getObjectSpecId();
         this.recreateStrategy = RecreateStrategy.LOOKUP;
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication_newPageFactory.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication_newPageFactory.java
index a3023d7..37c1759 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication_newPageFactory.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication_newPageFactory.java
@@ -30,7 +30,11 @@ import lombok.RequiredArgsConstructor;
 
 /**
  * 
- * Initializes new pages with the common-context. 
+ * Uses Wicket's default page factory, except for {@link EntityPage}s which require special instantiation:
+ * <p> 
+ * Constructor
+ * {@link EntityPage#EntityPage(org.apache.isis.webapp.context.IsisWebAppCommonContext, PageParameters)}
+ * needs the common-context as argument. 
  * 
  * @since 2.0
  *