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:51 UTC

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

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
  *