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 2021/06/08 13:59:55 UTC

[isis] branch 2723_facet.preced created (now b03331e)

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

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


      at b03331e  ISIS-2723: simplify facet precedence logic by removing ..

This branch includes the following new commits:

     new b03331e  ISIS-2723: simplify facet precedence logic by removing ..

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


[isis] 01/01: ISIS-2723: simplify facet precedence logic by removing ..

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

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

commit b03331ea6091905c446eb9775d26730278c15962
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Jun 8 15:58:47 2021 +0200

    ISIS-2723: simplify facet precedence logic by removing ..
    
    - Facet#isDerived()
    - Facet#isFallback()
    - Facet#isAlwaysReplace()
---
 .../core/metamodel/consent/InteractionAdvisor.java | 20 ++---
 .../apache/isis/core/metamodel/facetapi/Facet.java | 75 +++++++++++++-----
 .../core/metamodel/facetapi/FacetAbstract.java     | 89 ++++------------------
 .../isis/core/metamodel/facetapi/FacetHolder.java  | 20 ++---
 .../core/metamodel/facetapi/FacetHolderImpl.java   | 53 ++++++++-----
 .../facets/SingleClassValueFacetAbstract.java      |  2 +-
 .../facets/SingleIntValueFacetAbstract.java        |  7 +-
 .../facets/SingleStringValueFacetAbstract.java     | 16 ++--
 .../metamodel/facets/SingleValueFacetAbstract.java |  2 +-
 .../metamodel/facets/WhereValueFacetAbstract.java  | 16 +++-
 .../explicit/ActionExplicitFacetAbstract.java      |  6 +-
 .../invocation/ActionInvocationFacetAbstract.java  |  2 +-
 .../contributing/ContributingFacetAbstract.java    |  9 +--
 ...tributingFacetDerivedFromMixinFacetFactory.java |  3 +-
 .../defaults/ActionDefaultsFacetAbstract.java      | 12 ++-
 .../method/ActionDefaultsFacetViaMethod.java       |  6 +-
 .../NotInServiceMenuFacetAbstract.java             |  6 +-
 ...viceMenuFacetDerivedFromDomainServiceFacet.java |  5 +-
 ...uFacetDerivedFromDomainServiceFacetFactory.java |  3 +-
 .../position/ActionPositionFacetAbstract.java      |  2 +-
 .../actions/redirect/RedirectFacetAbstract.java    |  7 +-
 .../ActionParameterValidationFacetAbstract.java    |  2 +-
 .../validate/ActionValidationFacetAbstract.java    |  2 +-
 .../all/describedas/DescribedAsFacetAbstract.java  |  8 +-
 .../facets/all/help/HelpFacetAbstract.java         |  4 +
 .../facets/all/named/NamedFacetAbstract.java       |  7 +-
 .../collections/CollectionFacetAbstract.java       |  2 +-
 .../facets/fallback/ActionChoicesFacetNone.java    |  7 +-
 .../facets/fallback/ActionDefaultsFacetNone.java   |  7 +-
 .../facets/fallback/DescribedAsFacetNone.java      |  6 +-
 .../metamodel/facets/fallback/HelpFacetNone.java   |  6 +-
 .../facets/fallback/MaxLengthFacetUnlimited.java   |  7 +-
 .../facets/fallback/MultiLineFacetNone.java        |  7 +-
 .../metamodel/facets/fallback/NamedFacetNone.java  |  7 +-
 .../metamodel/facets/fallback/TitleFacetNone.java  |  7 +-
 .../facets/jaxb/XmlTransientFacetAbstract.java     |  5 +-
 .../members/cssclass/CssClassFacetAbstract.java    |  9 ++-
 .../members/cssclass/CssClassFacetAbstract2.java   |  6 +-
 .../method/DisableForContextFacetAbstract.java     |  5 +-
 .../method/DisableForContextFacetNone.java         | 11 +--
 .../facets/members/hidden/HiddenFacetAbstract.java | 11 +++
 .../hidden/method/HideForContextFacetAbstract.java |  5 +-
 .../hidden/method/HideForContextFacetNone.java     | 10 +--
 .../layout/group/LayoutGroupFacetAbstract.java     |  9 +++
 .../LayoutGroupFacetFromActionAnnotation.java      |  6 +-
 .../autocomplete/AutoCompleteFacetAbstract.java    |  2 +-
 .../BookmarkPolicyFacetAbstract.java               |  2 +-
 .../BookmarkPolicyFacetFallbackFactory.java        |  9 ++-
 .../object/callbacks/CallbackFacetAbstract.java    |  6 +-
 .../choices/ChoicesFacetFromBoundedAbstract.java   |  2 +-
 .../cssclass/method/CssClassFacetMethod.java       |  6 +-
 .../object/defaults/DefaultedFacetAbstract.java    |  6 +-
 .../DefaultedFacetUsingDefaultsProvider.java       |  6 +-
 .../disabled/DisabledObjectFacetAbstract.java      |  6 +-
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |  2 +-
 .../domainservice/DomainServiceFacetAbstract.java  |  2 +-
 .../DomainServiceLayoutFacetAbstract.java          |  2 +-
 .../object/encodeable/EncodableFacetAbstract.java  |  2 +-
 .../encoder/EncodableFacetUsingEncoderDecoder.java |  2 +-
 .../facets/object/facets/FacetsFacetAbstract.java  |  2 +-
 .../facets/object/grid/GridFacetDefault.java       |  2 +-
 .../object/hidden/HiddenObjectFacetAbstract.java   |  2 +-
 .../HiddenTypeFacetDerivedFromAuthorization.java   |  2 +-
 .../facets/object/icon/IconFacetAbstract.java      |  2 +-
 .../object/immutable/ImmutableFacetAbstract.java   |  2 +-
 .../facets/object/layout/LayoutFacetAbstract.java  | 10 ++-
 .../facets/object/layout/LayoutFacetFallback.java  |  9 +--
 .../logicaltype/LogicalTypeFacetAbstract.java      |  9 ++-
 .../LogicalTypeFacetDerivedFromClassName.java      |  2 +-
 .../LogicalTypeFacetOnStandaloneList.java          |  2 +-
 .../navparent/NavigableParentFacetAbstract.java    |  2 +-
 .../ObjectValidPropertiesFacetAbstract.java        |  2 +-
 .../facets/object/paged/PagedFacetAbstract.java    |  2 +-
 .../object/parseable/ParseableFacetAbstract.java   |  2 +-
 .../parser/ParseableFacetUsingParser.java          |  2 +-
 .../facets/object/plural/PluralFacetAbstract.java  | 11 +--
 .../plural/inferred/PluralFacetInferred.java       |  2 +-
 .../object/projection/ProjectionFacetAbstract.java |  6 +-
 .../ProjectionFacetFromProjectingProperty.java     |  5 +-
 .../promptStyle/PromptStyleFacetAbstract.java      |  6 +-
 .../PromptStyleFacetFallBackToInline.java          |  5 +-
 .../EntityChangePublishingFacetAbstract.java       |  2 +-
 .../facets/object/title/TitleFacetAbstract.java    |  6 +-
 .../title/methods/TitleFacetViaMethodsFactory.java |  5 +-
 .../title/methods/TitleFacetViaToStringMethod.java |  8 +-
 .../object/title/parser/TitleFacetUsingParser.java |  2 +-
 .../ValidateObjectFacetAbstract.java               |  2 +-
 .../value/TypicalLengthFacetUsingParser.java       |  2 +-
 .../facets/object/value/ValueFacetAbstract.java    |  2 +-
 .../facets/object/value/ValueFacetSimple.java      |  2 +-
 .../ValueSemanticsProviderAndFacetAbstract.java    | 22 ++----
 .../objectvalue/choices/ChoicesFacetAbstract.java  |  2 +-
 .../objectvalue/mandatory/MandatoryFacet.java      | 33 ++++++--
 .../mandatory/MandatoryFacetAbstract.java          | 32 ++++----
 .../mandatory/MandatoryFacetDefault.java           | 13 ++--
 .../objectvalue/maxlen/MaxLengthFacetAbstract.java |  8 +-
 .../multiline/MultiLineFacetAbstract.java          |  5 ++
 .../MustSatisfySpecificationFacetAbstract.java     |  2 +-
 .../RenderedAdjustedFacetAbstract.java             |  2 +-
 .../typicallen/TypicalLengthFacetAbstract.java     | 12 ++-
 .../ActionParameterAutoCompleteFacetAbstract.java  |  2 +-
 ...rameterFromJavaxValidationDigitsAnnotation.java |  2 +-
 .../param/choices/ActionChoicesFacetAbstract.java  | 10 ++-
 .../ActionParameterChoicesFacetAbstract.java       |  6 +-
 .../choices/ActionParameterChoicesFacetNone.java   |  7 +-
 .../ActionParameterDefaultsFacetAbstract.java      |  2 +-
 ...ParameterDefaultFacetDerivedFromTypeFacets.java |  5 +-
 .../ActionParameterDisabledFacetAbstract.java      |  2 +-
 .../hide/ActionParameterHiddenFacetAbstract.java   |  2 +-
 ...calLengthFacetForParameterLayoutAnnotation.java |  2 +-
 .../MandatoryFacetOnParametersDefaultFactory.java  |  9 +--
 .../TypicalLengthFacetOnParameterAnnotation.java   |  2 +-
 ...picalLengthFacetOnParameterDerivedFromType.java |  2 +-
 .../ActionParameterValidationFacetAbstract.java    |  2 +-
 .../PropertyOrCollectionAccessorFacetAbstract.java |  2 +-
 .../PropertyAutoCompleteFacetAbstract.java         |  2 +-
 ...ropertyFromJavaxValidationDigitsAnnotation.java |  2 +-
 .../choices/PropertyChoicesFacetAbstract.java      |  2 +-
 .../defaults/PropertyDefaultFacetAbstract.java     |  6 +-
 .../defaults/PropertyDefaultFacetNone.java         | 10 +--
 ...pertyDefaultFacetDerivedFromDefaultedFacet.java |  2 +-
 ...PropertyDefaultFacetDerivedFromTypeFactory.java |  6 +-
 .../MandatoryFacetOnProperyDefaultFactory.java     |  8 +-
 .../projection/ProjectingFacetAbstract.java        |  9 +--
 ...icalLengthFacetForPropertyLayoutAnnotation.java |  3 +-
 .../TypicalLengthFacetForPropertyXml.java          |  3 +-
 .../TypicalLengthFacetOnPropertyAnnotation.java    |  2 +-
 ...ypicalLengthFacetOnPropertyDerivedFromType.java |  2 +-
 .../update/clear/PropertyClearFacetAbstract.java   |  2 +-
 .../init/PropertyInitializationFacetAbstract.java  |  2 +-
 .../update/modify/PropertySetterFacetAbstract.java |  2 +-
 .../validating/PropertyValidateFacetAbstract.java  |  6 +-
 .../validating/PropertyValidateFacetNone.java      | 10 +--
 .../dflt/PropertyValidateFacetDefault.java         |  2 +-
 .../bigdecimal/BigDecimalValueFacetAbstract.java   |  4 +-
 .../image/ImageValueSemanticsProviderAbstract.java | 10 ---
 .../JavaAwtImageValueSemanticsProvider.java        |  5 --
 .../core/metamodel/layout/LayoutFacetUtil.java     |  3 +-
 .../all/i18n/DescribedAsFacetTranslated.java       |  6 +-
 .../all/i18n/NamedFacetTranslated.java             |  2 +-
 .../all/i18n/PluralFacetTranslated.java            |  2 +-
 .../authorization/AuthorizationFacetAbstract.java  |  2 +-
 .../NavigationFacetDerivedFromHiddenType.java      |  6 +-
 .../DeriveProjectionFacetsPostProcessor.java       |  8 +-
 .../services/metamodel/DomainMemberDefault.java    |  3 +-
 .../services/metamodel/MetaModelExporter.java      |  2 +-
 .../specloader/specimpl/FacetedMethodsBuilder.java |  5 +-
 .../specloader/specimpl/ObjectActionDefault.java   |  6 +-
 .../specimpl/ObjectActionParameterAbstract.java    |  2 +-
 .../specimpl/ObjectSpecificationAbstract.java      |  2 +-
 .../specimpl/OneToOneAssociationDefault.java       |  5 +-
 ...etaModelValidatorForConflictingOptionality.java |  3 +-
 .../core/metamodel/facetapi/FacetAbstractTest.java |  2 +-
 .../title/TitleFacetViaMethodsFactoryTest.java     |  2 +-
 .../interactions/InteractionUtils_isA_Test.java    |  7 +-
 ...ObjectAssociationAbstractTest_alwaysHidden.java | 15 ++--
 .../facets/TenantedAuthorizationFacetDefault.java  |  2 +-
 .../metamodel/facets/entity/JdoEntityFacet.java    |  2 +-
 .../JdoDatastoreIdentityFacetAbstract.java         |  2 +-
 ...ypeFacetForJdoPersistenceCapableAnnotation.java |  2 +-
 .../JdoPersistenceCapableFacetAnnotation.java      |  2 +-
 .../facets/object/query/JdoQueryFacetAbstract.java |  2 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |  6 +-
 .../BigDecimalFacetDerivedFromJdoColumn.java       |  2 +-
 .../prop/column/BigDecimalFacetFallback.java       |  2 +-
 ...ndatoryFromJdoColumnAnnotationFacetFactory.java | 13 ++--
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |  2 +-
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java | 18 ++---
 .../metamodel/JpaEntityFacetFactory.java           |  7 +-
 .../LogicalTypeFacetForTableAnnotation.java        |  2 +-
 .../object/table/JpaTableFacetAnnotationImpl.java  |  2 +-
 .../ActionParameterDescriptionReprRenderer.java    |  7 +-
 .../PropertyDescriptionReprRenderer.java           |  7 +-
 .../scalars/string/StringPanelFactory.java         |  3 +-
 174 files changed, 589 insertions(+), 557 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionAdvisor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionAdvisor.java
index 7f49398..2d0264f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionAdvisor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionAdvisor.java
@@ -46,11 +46,6 @@ public interface InteractionAdvisor {
         }
 
         @Override
-        public boolean alwaysReplace() {
-            return false;
-        }
-
-        @Override
         public Class<? extends Facet> facetType() {
             return null;
         }
@@ -61,11 +56,6 @@ public interface InteractionAdvisor {
         }
 
         @Override
-        public boolean isFallback() {
-            return true;
-        }
-
-        @Override
         public void setFacetHolder(final FacetHolder facetHolder) {
         }
 
@@ -80,11 +70,6 @@ public interface InteractionAdvisor {
         }
 
         @Override
-        public boolean isDerived() {
-            return false;
-        }
-
-        @Override
         public void addContributedFacet(Facet contributedFacet) {
             throw _Exceptions.unsupportedOperation();
         }
@@ -99,6 +84,11 @@ public interface InteractionAdvisor {
             return null;
         }
 
+        @Override
+        public Precedence getPrecedence() {
+            return Facet.Precedence.FALLBACK;
+        }
+
     };
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/Facet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/Facet.java
index 077dca3..7361a6e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/Facet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/Facet.java
@@ -26,12 +26,58 @@ import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInv
 public interface Facet extends FacetWithAttributes {
 
     /**
+     * @implSpec Ordinal dictates precedence
+     * (corresponding to the ascending order of appearance).
+     */
+    public static enum Precedence {
+
+        /**
+         * Whether this facet implementation is a fallback. Meaning it is treated
+         * with lowest priority, always overruled by any other facet of same type.
+         */
+        FALLBACK,
+
+        /**
+         * Whether this facet implementation is derived (as opposed to explicit);
+         * <p>
+         * For example, we might derive the typical length of a property based on
+         * its type; but if the typical length has been explicitly specified using
+         * an annotation then that should take precedence.
+         */
+        DERIVED,
+
+        /**
+         * Lower priority than {@link #DEFAULT}.
+         */
+        LATE,
+
+        /**
+         * The default as used with {@link FacetAbstract}, if not specified otherwise.
+         */
+        DEFAULT,
+
+        /**
+         * Higher priority than {@link #DEFAULT}.
+         */
+        EARLY;
+
+        public boolean isFallback() {
+            return this == FALLBACK;
+        }
+
+        public boolean isDerived() {
+            return this == DERIVED;
+        }
+
+    }
+
+    /**
      * The {@link FacetHolder holder} of this facet.
      */
     FacetHolder getFacetHolder();
 
     /**
-     * Allows reparenting of Facet.
+     * Allows re-parenting of Facet.
      *
      * <p>
      * Used by Facet decorators.
@@ -42,7 +88,9 @@ public interface Facet extends FacetWithAttributes {
 
     /**
      * Underlying {@link Facet} of the same {@link #facetType() type}, if any.
+     * @deprecated
      */
+    @Deprecated
     public Facet getUnderlyingFacet();
 
     /**
@@ -50,7 +98,9 @@ public interface Facet extends FacetWithAttributes {
      *
      * <p>
      * Must be of the same {@link #facetType() type}.
+     * @deprecated
      */
+    @Deprecated
     public void setUnderlyingFacet(Facet underlyingFacet);
 
     /**
@@ -73,27 +123,10 @@ public interface Facet extends FacetWithAttributes {
     Class<? extends Facet> facetType();
 
     /**
-     * Whether this facet implementation is derived (as opposed to explicit);
-     * used to determine precedence.
-     *
-     * <p>
-     * For example, we might derive the typical length of a property based on
-     * its type; but if the typical length has been explicitly specified using
-     * an annotation then that should take precedence.
-     */
-    public boolean isDerived();
-
-    /**
-     * Whether this facet implementation is a fallback. Meaning it is treated
-     * with lowest priority, always overruled by any other facet of same type.
-     */
-    public boolean isFallback();
-
-    /**
-     * Whether this facet implementation should replace existing (none-fallback)
-     * implementations.
+     * Facets with higher precedence override facets with lower precedence.
+     * On same precedence, its unspecified, which one wins. (Warnings should be logged.)
      */
-    public boolean alwaysReplace();
+    public Precedence getPrecedence();
 
     // -- FACET ALIAS SUPPORT
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java
index 6032555..01fe7bd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java
@@ -31,24 +31,21 @@ import org.apache.isis.core.metamodel.context.MetaModelContext;
 
 import static org.apache.isis.commons.internal.base._With.requires;
 
+import lombok.Getter;
+import lombok.NonNull;
 import lombok.Setter;
 import lombok.val;
 
 
 public abstract class FacetAbstract implements Facet, HasMetaModelContext {
 
-    public enum Derivation {
-        DERIVED,
-        NOT_DERIVED
-    }
-
     private Facet underlyingFacet;
 
     private final Class<? extends Facet> facetType;
     @Setter private Class<? extends Facet> facetAliasType;
     private Set<Facet> contributedFacets; // lazy init
 
-    private final boolean derived;
+    @Getter(onMethod_ = {@Override}) private final @NonNull Facet.Precedence precedence;
     private FacetHolder holder;
 
     /**
@@ -63,18 +60,18 @@ public abstract class FacetAbstract implements Facet, HasMetaModelContext {
     public FacetAbstract(
             Class<? extends Facet> facetType,
             FacetHolder holder,
-            Derivation derivation) {
+            Facet.Precedence precedence) {
 
         this.facetType = requires(facetType, "facetType");
         setFacetHolder(holder);
-        this.derived = (derivation == Derivation.DERIVED);
+        this.precedence = precedence;
     }
 
     protected FacetAbstract(
             Class<? extends Facet> facetType,
             FacetHolder holder) {
 
-        this(facetType, holder, Derivation.NOT_DERIVED);
+        this(facetType, holder, Facet.Precedence.DEFAULT);
     }
 
     @Override
@@ -97,11 +94,6 @@ public abstract class FacetAbstract implements Facet, HasMetaModelContext {
         return holder.getMetaModelContext();
     }
 
-    @Override
-    public boolean isDerived() {
-        return derived;
-    }
-
     /**
      * Convenience method that returns {@link #getFacetHolder()} downcast to
      * {@link IdentifiedHolder} if the implementation does indeed inherit from
@@ -119,64 +111,18 @@ public abstract class FacetAbstract implements Facet, HasMetaModelContext {
     @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 {
-
-                val underlyingFacetType = underlyingFacet.facetType();
-                if(!Objects.equals(underlyingFacetType, facetType)) {
-                    val msg = String.format(
-                            "type-missmatch: underlying facet's type '%s' "
-                            + "must match this facet's type '%s'",
-                            underlyingFacetType, facetType);
-                    throw _Exceptions.unrecoverable(msg);
-                }
-
- //           }
+            val underlyingFacetType = underlyingFacet.facetType();
+            if(!Objects.equals(underlyingFacetType, facetType)) {
+                val msg = String.format(
+                        "type-missmatch: underlying facet's type '%s' "
+                        + "must match this facet's type '%s'",
+                        underlyingFacetType, facetType);
+                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);
-//    }
-
-    /**
-     * Assume implementation is <i>not</i> a no-op.
-     *
-     * <p>
-     * No-op implementations should override and return <tt>true</tt>.
-     */
-    @Override
-    public boolean isFallback() {
-        return false;
-    }
-
-    /**
-     * Default implementation of this method that returns <tt>true</tt>, ie
-     * should replace (none {@link #isFallback() no-op} implementations.
-     *
-     * <p>
-     * Implementations that don't wish to replace none no-op implementations
-     * should override and return <tt>false</tt>.
-     */
-    @Override
-    public boolean alwaysReplace() {
-        return true;
-    }
-
     @Override
     public void setFacetHolder(final FacetHolder facetHolder) {
         this.holder = facetHolder;
@@ -231,13 +177,8 @@ public abstract class FacetAbstract implements Facet, HasMetaModelContext {
 
     @Override
     public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        if(derived) {
-            attributeMap.put("derived", derived);
-        }
+        attributeMap.put("precedence", getPrecedence().name());
         attributeMap.put("underlyingFacet", underlyingFacet);
-        if(isFallback()) {
-            attributeMap.put("noop", isFallback());
-        }
         if(isHiding()) {
             attributeMap.put("hiding", isHiding());
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java
index c707b78..45bb025 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java
@@ -23,7 +23,6 @@ import java.util.Optional;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
-import org.apache.isis.commons.internal.functions._Predicates;
 import org.apache.isis.core.metamodel.context.HasMetaModelContext;
 
 import lombok.NonNull;
@@ -58,7 +57,7 @@ public interface FacetHolder extends HasMetaModelContext {
 
     default <T extends Facet> Optional<T> lookupNonFallbackFacet(
             @NonNull final Class<T> facetType) {
-        return lookupFacet(facetType, _Predicates.not(Facet::isFallback));
+        return lookupFacet(facetType, facet->!facet.getPrecedence().isFallback());
     }
 
     // -- CONTAINS
@@ -70,23 +69,26 @@ public interface FacetHolder extends HasMetaModelContext {
 
     /**
      * Whether there is a facet registered of the specified type that is not a
-     * {@link Facet#isFallback() fallback} .
+     * {@link Facet.Precedence#isFallback() fallback} .
      * <p>
      * Convenience; saves having to {@link #getFacet(Class)} and then check if
      * <tt>null</tt> and not a fallback.
      */
     default boolean containsNonFallbackFacet(Class<? extends Facet> facetType) {
         val facet = getFacet(facetType);
-        return facet != null && !facet.isFallback();
+        return facet != null
+                && !facet.getPrecedence().isFallback();
     }
 
     /**
      * As {@link #containsNonFallbackFacet(Class)}, with additional requirement, that the
-     * facet is <i>explicit</i>, not {@link Facet#isDerived() derived}.
+     * facet is <i>explicit</i>, not {@link Facet.Precedence#isDerived() derived}.
      */
     default boolean containsExplicitNonFallbackFacet(Class<? extends Facet> facetType) {
         val facet = getFacet(facetType);
-        return facet != null && !facet.isFallback() && !facet.isDerived();
+        return facet != null
+                && !facet.getPrecedence().isFallback()
+                && !facet.getPrecedence().isDerived();
     }
 
     Stream<Facet> streamFacets();
@@ -102,9 +104,7 @@ public interface FacetHolder extends HasMetaModelContext {
      *
      * <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#isFallback() no-op}.
+     * <i>provided</i> that given {@link Facet} has higher precedence.
      */
     void addFacet(Facet facet);
 
@@ -114,7 +114,9 @@ public interface FacetHolder extends HasMetaModelContext {
      *
      * @param facet
      * @since 2.0
+     * @deprecated underlying facets are deprecated
      */
+    @Deprecated
     void addOrReplaceFacet(Facet facet);
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java
index 52567ce..a168989 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java
@@ -33,12 +33,15 @@ import org.apache.isis.core.metamodel.context.MetaModelContextAware;
 import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
 
 import lombok.Getter;
+import lombok.NonNull;
 import lombok.Setter;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * For base subclasses or, more likely, to help write tests.
  */
+@Log4j2
 public class FacetHolderImpl implements FacetHolder, MetaModelContextAware {
 
     @Getter(onMethod = @__(@Override)) @Setter(onMethod = @__(@Override))
@@ -57,7 +60,7 @@ public class FacetHolderImpl implements FacetHolder, MetaModelContextAware {
     @Override
     public void addFacet(Facet facet) {
         synchronized($lock) {
-            val changed = addFacetOrKeepExisting(facetsByType, facet);
+            val changed = addFacetOrKeepExistingBasedOnPrecedence(facetsByType, facet);
             if(changed) {
                 snapshot.clear(); //invalidate
             }
@@ -123,22 +126,26 @@ public class FacetHolderImpl implements FacetHolder, MetaModelContextAware {
 
     private void collectChildren(AliasMap<Class<? extends Facet>, Facet> target, Facet parentFacet) {
         parentFacet.forEachContributedFacet(child->{
-            val added = addFacetOrKeepExisting(target, child);
+            val added = addFacetOrKeepExistingBasedOnPrecedence(target, child);
             if(added) {
                 collectChildren(target, child);
             }
         });
     }
 
-    private boolean addFacetOrKeepExisting(
-            Map<Class<? extends Facet>, Facet> facetsByType,
-            Facet facet) {
+    private boolean addFacetOrKeepExistingBasedOnPrecedence(
+            final @NonNull Map<Class<? extends Facet>, Facet> facetsByType,
+            final @NonNull Facet newFacet) {
 
-        val existingFacet = facetsByType.get(facet.facetType());
+        val existingFacet = facetsByType.get(newFacet.facetType());
+        if(existingFacet==null) {
+            facetsByType.put(newFacet.facetType(), newFacet);
+            return true;
+        }
 
-        val addOrKeep = whichPrecedesTheOther(existingFacet, facet);
-        if(addOrKeep==facet) {
-            facetsByType.put(facet.facetType(), facet);
+        val preferredFacet = getPreferredOf(existingFacet, newFacet);
+        if(newFacet==preferredFacet) {
+            facetsByType.put(preferredFacet.facetType(), preferredFacet);
             return true;
         }
         return false;
@@ -149,19 +156,25 @@ public class FacetHolderImpl implements FacetHolder, MetaModelContextAware {
         facetsByType.remove(topLevelFacet.facetType());
     }
 
-    // also has side-effects (not really suggested by the naming)
-    private Facet whichPrecedesTheOther(Facet existingFacet, Facet facet) {
-        if (existingFacet == null || existingFacet.isFallback()) {
-            return facet;
-        }
-        if (!facet.alwaysReplace()) {
-            return existingFacet; //eg. ValueSemanticsProviderAndFacetAbstract is alwaysReplace=false
+    // on equal precedence returns b
+    private Facet getPreferredOf(final @NonNull Facet a, final @NonNull Facet b) {
+
+        // guard against args being the same object
+        if(a==b) {
+            return a;
         }
-        if (facet.isDerived() && !existingFacet.isDerived()) {
-            return existingFacet;
+
+        if(a.getPrecedence() == b.getPrecedence()) {
+            log.warn("Facets {} and {} have same precedence. Undecidable, which to use. "
+                    + "Arbitrarily chosing the latter.",
+                    a.getClass().getName(),
+                    b.getClass().getName());
+            return b;
         }
-        facet.setUnderlyingFacet(existingFacet);
-        return facet;
+
+        return a.getPrecedence().ordinal() < b.getPrecedence().ordinal()
+                ? b
+                : a;
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleClassValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleClassValueFacetAbstract.java
index d2c8b90..9bc87e4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleClassValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleClassValueFacetAbstract.java
@@ -34,7 +34,7 @@ public abstract class SingleClassValueFacetAbstract extends FacetAbstract implem
             final Class<? extends Facet> facetType,
             final FacetHolder holder,
             final Class<?> value) {
-        super(facetType, holder, Derivation.NOT_DERIVED);
+        super(facetType, holder);
         this.value = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleIntValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleIntValueFacetAbstract.java
index 612405f..1fbae8f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleIntValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleIntValueFacetAbstract.java
@@ -30,7 +30,12 @@ public abstract class SingleIntValueFacetAbstract extends FacetAbstract implemen
     private final int value;
 
     public SingleIntValueFacetAbstract(final Class<? extends Facet> facetType, final FacetHolder holder, final int value) {
-        super(facetType, holder, Derivation.NOT_DERIVED);
+        super(facetType, holder);
+        this.value = value;
+    }
+
+    public SingleIntValueFacetAbstract(final Class<? extends Facet> facetType, final FacetHolder holder, final int value, final Facet.Precedence precedence) {
+        super(facetType, holder, precedence);
         this.value = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleStringValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleStringValueFacetAbstract.java
index d2dfa8c..2a694e6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleStringValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleStringValueFacetAbstract.java
@@ -25,15 +25,21 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public abstract class SingleStringValueFacetAbstract extends FacetAbstract implements SingleStringValueFacet {
+public abstract class SingleStringValueFacetAbstract
+extends FacetAbstract
+implements SingleStringValueFacet {
+
     private final String value;
 
-    public SingleStringValueFacetAbstract(final Class<? extends Facet> facetType, final FacetHolder holder, final String value) {
-        this(facetType, holder, value, Derivation.NOT_DERIVED);
+    public SingleStringValueFacetAbstract(
+            final Class<? extends Facet> type, final FacetHolder holder, final String value) {
+        super(type, holder);
+        this.value = value;
     }
 
-    public SingleStringValueFacetAbstract(final Class<? extends Facet> type, final FacetHolder holder, final String value, final Derivation derivation) {
-        super(type, holder, derivation);
+    public SingleStringValueFacetAbstract(
+            final Class<? extends Facet> type, final FacetHolder holder, final String value, final Facet.Precedence precedence) {
+        super(type, holder, precedence);
         this.value = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleValueFacetAbstract.java
index fa927c7..1b02368 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleValueFacetAbstract.java
@@ -30,7 +30,7 @@ public abstract class SingleValueFacetAbstract<T> extends FacetAbstract implemen
     private T value;
 
     public SingleValueFacetAbstract(final Class<? extends Facet> facetType, final T value, final FacetHolder holder) {
-        super(facetType, holder, Derivation.NOT_DERIVED);
+        super(facetType, holder);
         this.value = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/WhereValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/WhereValueFacetAbstract.java
index b508832..bba5467 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/WhereValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/WhereValueFacetAbstract.java
@@ -28,7 +28,9 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 import lombok.NonNull;
 
-public abstract class WhereValueFacetAbstract extends FacetAbstract implements WhereValueFacet {
+public abstract class WhereValueFacetAbstract
+extends FacetAbstract
+implements WhereValueFacet {
 
     private final @NonNull Where where;
 
@@ -37,7 +39,17 @@ public abstract class WhereValueFacetAbstract extends FacetAbstract implements W
             final @NonNull FacetHolder holder,
             final @NonNull Where where) {
 
-        super(facetType, holder, Derivation.NOT_DERIVED);
+        super(facetType, holder);
+        this.where = where;
+    }
+
+    public WhereValueFacetAbstract(
+            final @NonNull Class<? extends Facet> facetType,
+            final @NonNull FacetHolder holder,
+            final @NonNull Where where,
+            final @NonNull Facet.Precedence precedence) {
+
+        super(facetType, holder, precedence);
         this.where = where;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/explicit/ActionExplicitFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/explicit/ActionExplicitFacetAbstract.java
index 5c5b628..0bfef1e0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/explicit/ActionExplicitFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/explicit/ActionExplicitFacetAbstract.java
@@ -26,9 +26,7 @@ public abstract class ActionExplicitFacetAbstract
 extends FacetAbstract
 implements ActionExplicitFacet {
 
-    public ActionExplicitFacetAbstract(
-            final FacetHolder holder) {
-
-        super(ActionExplicitFacet.class, holder, Derivation.NOT_DERIVED);
+    public ActionExplicitFacetAbstract(final FacetHolder holder) {
+        super(ActionExplicitFacet.class, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java
index 514d348..eaafecd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java
@@ -32,7 +32,7 @@ implements ActionInvocationFacet {
     }
 
     public ActionInvocationFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/contributing/ContributingFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/contributing/ContributingFacetAbstract.java
index c413d98..c0639ae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/contributing/ContributingFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/contributing/ContributingFacetAbstract.java
@@ -38,14 +38,7 @@ implements ContributingFacet {
     public ContributingFacetAbstract(
             final Contributing contributing,
             final FacetHolder holder) {
-        this(contributing, holder, Derivation.NOT_DERIVED);
-    }
-
-    public ContributingFacetAbstract(
-            final Contributing contributing,
-            final FacetHolder holder,
-            final Derivation derivation) {
-        super(type(), holder, derivation);
+        super(type(), holder);
         this.contributing = contributing;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/contributing/derived/ContributingFacetDerivedFromMixinFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/contributing/derived/ContributingFacetDerivedFromMixinFacetFactory.java
index 42526fe..d6cd000 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/contributing/derived/ContributingFacetDerivedFromMixinFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/contributing/derived/ContributingFacetDerivedFromMixinFacetFactory.java
@@ -48,8 +48,7 @@ public class ContributingFacetDerivedFromMixinFacetFactory extends FacetFactoryA
         val declaringClass = method.getDeclaringClass();
         val spec = getSpecificationLoader().loadSpecification(declaringClass);
 
-        val mixinFacet = spec.getFacet(MixinFacet.class);
-        if(mixinFacet == null || mixinFacet.isFallback()) {
+        if(!spec.lookupNonFallbackFacet(MixinFacet.class).isPresent()) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/ActionDefaultsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/ActionDefaultsFacetAbstract.java
index dfa1214..b57b12c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/ActionDefaultsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/ActionDefaultsFacetAbstract.java
@@ -23,14 +23,20 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public abstract class ActionDefaultsFacetAbstract extends FacetAbstract implements ActionDefaultsFacet {
+public abstract class ActionDefaultsFacetAbstract
+extends FacetAbstract
+implements ActionDefaultsFacet {
 
     public static Class<? extends Facet> type() {
         return ActionDefaultsFacet.class;
     }
 
-    public ActionDefaultsFacetAbstract(final FacetHolder holder, final Derivation derivation) {
-        super(type(), holder, derivation);
+    public ActionDefaultsFacetAbstract(final FacetHolder holder) {
+        super(type(), holder);
+    }
+
+    public ActionDefaultsFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
index 7e4cc5e..51bdc08 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
@@ -33,7 +33,9 @@ import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFace
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 
-public class ActionDefaultsFacetViaMethod extends ActionDefaultsFacetAbstract implements ImperativeFacet {
+public class ActionDefaultsFacetViaMethod
+extends ActionDefaultsFacetAbstract
+implements ImperativeFacet {
 
     private final Method method;
 
@@ -41,7 +43,7 @@ public class ActionDefaultsFacetViaMethod extends ActionDefaultsFacetAbstract im
     private final Method actionMethod;
 
     public ActionDefaultsFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder, Derivation.NOT_DERIVED);
+        super(holder);
         this.method = method;
         this.actionMethod = determineActionMethod(holder);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/NotInServiceMenuFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/NotInServiceMenuFacetAbstract.java
index d3c8aea..c92f8c5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/NotInServiceMenuFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/NotInServiceMenuFacetAbstract.java
@@ -30,11 +30,11 @@ public abstract class NotInServiceMenuFacetAbstract extends FacetAbstract implem
     }
 
     public NotInServiceMenuFacetAbstract(final FacetHolder holder) {
-        this(holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
-    public NotInServiceMenuFacetAbstract(final FacetHolder holder, final Derivation derivation) {
-        super(type(), holder, derivation);
+    public NotInServiceMenuFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacet.java
index be09c80..12c0deb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacet.java
@@ -34,7 +34,7 @@ extends NotInServiceMenuFacetAbstract {
 
     public NotInServiceMenuFacetDerivedFromDomainServiceFacet(
             final NatureOfService natureOfService, final FacetHolder holder) {
-        super(holder, Derivation.DERIVED);
+        super(holder);
         this.natureOfService = natureOfService;
     }
 
@@ -47,7 +47,8 @@ extends NotInServiceMenuFacetAbstract {
         return natureOfService;
     }
 
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+    @Override
+    public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         attributeMap.put("natureOfService", natureOfService);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory.java
index 57f43b4..6242d3c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory.java
@@ -43,7 +43,8 @@ public class NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory extends F
         final ObjectSpecification spec = getSpecificationLoader().loadSpecification(declaringClass);
 
         final DomainServiceFacet domainServiceFacet = spec.getFacet(DomainServiceFacet.class);
-        if(domainServiceFacet == null || domainServiceFacet.isFallback()) {
+        if(domainServiceFacet == null
+                || domainServiceFacet.getPrecedence().isFallback()) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/position/ActionPositionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/position/ActionPositionFacetAbstract.java
index eea9751..9a8d891 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/position/ActionPositionFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/position/ActionPositionFacetAbstract.java
@@ -35,7 +35,7 @@ public abstract class ActionPositionFacetAbstract extends FacetAbstract implemen
     private final ActionLayout.Position position;
 
     public ActionPositionFacetAbstract(final ActionLayout.Position position, final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         this.position = position;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetAbstract.java
index 60805f4..80e3fca 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/redirect/RedirectFacetAbstract.java
@@ -37,14 +37,15 @@ public abstract class RedirectFacetAbstract extends FacetAbstract implements Red
     protected RedirectFacetAbstract(
             final Redirect redirect,
             final FacetHolder holder) {
-        this(redirect, holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
+        this.redirect = redirect;
     }
 
     protected RedirectFacetAbstract(
             final Redirect redirect,
             final FacetHolder holder,
-            final Derivation derivation) {
-        super(type(), holder, derivation);
+            final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
         this.redirect = redirect;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacetAbstract.java
index 276df4b..a873528 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacetAbstract.java
@@ -34,7 +34,7 @@ implements ActionParameterValidationFacet {
     }
 
     public ActionParameterValidationFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionValidationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionValidationFacetAbstract.java
index f9ca278..514c1f6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionValidationFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionValidationFacetAbstract.java
@@ -34,7 +34,7 @@ implements ActionValidationFacet {
     }
 
     public ActionValidationFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/describedas/DescribedAsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/describedas/DescribedAsFacetAbstract.java
index 4d3bcf2..da41c7a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/describedas/DescribedAsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/describedas/DescribedAsFacetAbstract.java
@@ -23,7 +23,9 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleStringValueFacetAbstract;
 
-public abstract class DescribedAsFacetAbstract extends SingleStringValueFacetAbstract implements DescribedAsFacet {
+public abstract class DescribedAsFacetAbstract
+extends SingleStringValueFacetAbstract
+implements DescribedAsFacet {
 
     public static Class<? extends Facet> type() {
         return DescribedAsFacet.class;
@@ -33,4 +35,8 @@ public abstract class DescribedAsFacetAbstract extends SingleStringValueFacetAbs
         super(type(), holder, value);
     }
 
+    public DescribedAsFacetAbstract(final String value, final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, value, precedence);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/help/HelpFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/help/HelpFacetAbstract.java
index 189017c..749b68b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/help/HelpFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/help/HelpFacetAbstract.java
@@ -33,4 +33,8 @@ public abstract class HelpFacetAbstract extends SingleStringValueFacetAbstract i
         super(type(), holder, value);
     }
 
+    public HelpFacetAbstract(final String value, final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, value, precedence);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetAbstract.java
index 426a1df..8fe7316 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetAbstract.java
@@ -35,8 +35,13 @@ public abstract class NamedFacetAbstract extends FacetAbstract implements NamedF
     }
 
     public NamedFacetAbstract(String value, boolean escaped, FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
+        this.value = value;
+        this.escaped = escaped;
+    }
 
+    public NamedFacetAbstract(String value, boolean escaped, FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
         this.value = value;
         this.escaped = escaped;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacetAbstract.java
index 534c58d..74c8148 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacetAbstract.java
@@ -28,7 +28,7 @@ extends FacetAbstract
 implements CollectionFacet {
 
     public CollectionFacetAbstract(final FacetHolder holder) {
-        super(CollectionFacet.class, holder, Derivation.NOT_DERIVED);
+        super(CollectionFacet.class, holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/ActionChoicesFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/ActionChoicesFacetNone.java
index 4fa3f81..bfe45bc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/ActionChoicesFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/ActionChoicesFacetNone.java
@@ -28,7 +28,7 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 public class ActionChoicesFacetNone extends ActionChoicesFacetAbstract {
 
     public ActionChoicesFacetNone(final FacetHolder holder) {
-        super(holder);
+        super(holder, Precedence.FALLBACK);
     }
 
     @Override
@@ -38,9 +38,4 @@ public class ActionChoicesFacetNone extends ActionChoicesFacetAbstract {
         return CanVector.empty();
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/ActionDefaultsFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/ActionDefaultsFacetNone.java
index df07a06..9a23fa7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/ActionDefaultsFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/ActionDefaultsFacetNone.java
@@ -26,7 +26,7 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 public class ActionDefaultsFacetNone extends ActionDefaultsFacetAbstract {
 
     public ActionDefaultsFacetNone(final FacetHolder holder) {
-        super(holder, Derivation.NOT_DERIVED);
+        super(holder, Precedence.FALLBACK);
     }
 
     @Override
@@ -34,9 +34,4 @@ public class ActionDefaultsFacetNone extends ActionDefaultsFacetAbstract {
         return null;
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/DescribedAsFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/DescribedAsFacetNone.java
index f9429ed..50016a9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/DescribedAsFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/DescribedAsFacetNone.java
@@ -28,12 +28,8 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbs
 public class DescribedAsFacetNone extends DescribedAsFacetAbstract {
 
     public DescribedAsFacetNone(final FacetHolder holder) {
-        super("", holder);
+        super("", holder, Precedence.FALLBACK);
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/HelpFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/HelpFacetNone.java
index baa3393..6ae0384 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/HelpFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/HelpFacetNone.java
@@ -28,7 +28,7 @@ import org.apache.isis.core.metamodel.facets.all.help.HelpFacetAbstract;
 public class HelpFacetNone extends HelpFacetAbstract {
 
     public HelpFacetNone(final FacetHolder holder) {
-        super(null, holder);
+        super(null, holder, Precedence.FALLBACK);
     }
 
     @Override
@@ -36,9 +36,5 @@ public class HelpFacetNone extends HelpFacetAbstract {
         return "No help available";
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/MaxLengthFacetUnlimited.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/MaxLengthFacetUnlimited.java
index 3818f4a..61d28eb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/MaxLengthFacetUnlimited.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/MaxLengthFacetUnlimited.java
@@ -26,7 +26,7 @@ import org.apache.isis.core.metamodel.interactions.ValidityContext;
 public class MaxLengthFacetUnlimited extends MaxLengthFacetAbstract {
 
     public MaxLengthFacetUnlimited(final FacetHolder holder) {
-        super(Integer.MAX_VALUE, holder);
+        super(Integer.MAX_VALUE, holder, Precedence.FALLBACK);
     }
 
     /**
@@ -37,9 +37,4 @@ public class MaxLengthFacetUnlimited extends MaxLengthFacetAbstract {
         return null;
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/MultiLineFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/MultiLineFacetNone.java
index b43dc4a..6bb8c5c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/MultiLineFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/MultiLineFacetNone.java
@@ -25,12 +25,7 @@ import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFace
 public class MultiLineFacetNone extends MultiLineFacetAbstract {
 
     public MultiLineFacetNone(final FacetHolder holder) {
-        super(1, holder);
-    }
-
-    @Override
-    public boolean isFallback() {
-        return true;
+        super(1, holder, Precedence.FALLBACK);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetNone.java
index 995b1b5..efca58e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetNone.java
@@ -33,12 +33,7 @@ public class NamedFacetNone extends NamedFacetAbstract {
     public static final boolean ESCAPED = true;
 
     public NamedFacetNone(final FacetHolder holder) {
-        super(null, ESCAPED, holder);
-    }
-
-    @Override
-    public boolean isFallback() {
-        return true;
+        super(null, ESCAPED, holder, Precedence.FALLBACK);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/TitleFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/TitleFacetNone.java
index e6e5e42..2e75716 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/TitleFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/TitleFacetNone.java
@@ -26,7 +26,7 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 public class TitleFacetNone extends TitleFacetAbstract {
 
     public TitleFacetNone(final FacetHolder holder) {
-        super(holder);
+        super(holder, Precedence.FALLBACK);
     }
 
     @Override
@@ -34,9 +34,4 @@ public class TitleFacetNone extends TitleFacetAbstract {
         return null;
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlTransientFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlTransientFacetAbstract.java
index 5dd1960..c32694a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlTransientFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlTransientFacetAbstract.java
@@ -23,7 +23,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 public abstract class XmlTransientFacetAbstract
-extends FacetAbstract implements XmlTransientFacet {
+extends FacetAbstract
+implements XmlTransientFacet {
 
     public static Class<XmlTransientFacet> type() {
         return XmlTransientFacet.class;
@@ -31,7 +32,7 @@ extends FacetAbstract implements XmlTransientFacet {
 
     public XmlTransientFacetAbstract(
             final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
index 2159fba..3e5b7dd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
@@ -26,7 +26,9 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public abstract class CssClassFacetAbstract extends FacetAbstract implements CssClassFacet {
+public abstract class CssClassFacetAbstract
+extends FacetAbstract
+implements CssClassFacet {
 
     public static Class<? extends Facet> type() {
         return CssClassFacet.class;
@@ -35,7 +37,7 @@ public abstract class CssClassFacetAbstract extends FacetAbstract implements Css
     private final String cssClass;
 
     public CssClassFacetAbstract(final String cssClass, final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         this.cssClass = cssClass;
     }
 
@@ -44,7 +46,8 @@ public abstract class CssClassFacetAbstract extends FacetAbstract implements Css
         return cssClass;
     }
 
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+    @Override
+    public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         attributeMap.put("cssClass", cssClass);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract2.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract2.java
index 94af7c8..71c3772 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract2.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract2.java
@@ -23,14 +23,16 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public abstract class CssClassFacetAbstract2 extends FacetAbstract implements CssClassFacet {
+public abstract class CssClassFacetAbstract2
+extends FacetAbstract
+implements CssClassFacet {
 
     public static Class<? extends Facet> type() {
         return CssClassFacet.class;
     }
 
     public CssClassFacetAbstract2(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetAbstract.java
index 3493ffe..d5db305 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetAbstract.java
@@ -30,8 +30,11 @@ public abstract class DisableForContextFacetAbstract extends FacetAbstract imple
     }
 
     public DisableForContextFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
+    public DisableForContextFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetNone.java
index 44d0a39..b974056 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetNone.java
@@ -22,10 +22,11 @@ package org.apache.isis.core.metamodel.facets.members.disabled.method;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 
-public class DisableForContextFacetNone extends DisableForContextFacetAbstract {
+public class DisableForContextFacetNone
+extends DisableForContextFacetAbstract {
 
     public DisableForContextFacetNone(final FacetHolder holder) {
-        super(holder);
+        super(holder, Precedence.FALLBACK);
     }
 
     /**
@@ -39,10 +40,4 @@ public class DisableForContextFacetNone extends DisableForContextFacetAbstract {
         return null;
     }
 
-
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/HiddenFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/HiddenFacetAbstract.java
index b359d08..28effbb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/HiddenFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/HiddenFacetAbstract.java
@@ -56,6 +56,17 @@ implements HiddenFacet {
         super.setFacetAliasType(HiddenFacet.class);
     }
 
+    public HiddenFacetAbstract(
+            Class<? extends Facet> facetType,
+            Where where,
+            FacetHolder holder,
+            final Facet.Precedence precedence) {
+
+        super(facetType, holder, where, precedence);
+        super.setFacetAliasType(HiddenFacet.class);
+    }
+
+
     // to instantiate contributed facets
     private HiddenFacetAbstract(HiddenFacetAbstract toplevelFacet) {
         super(HiddenFacet.class, toplevelFacet.getFacetHolder(), toplevelFacet.where());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetAbstract.java
index 9aedd8a..cf7c4a0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetAbstract.java
@@ -30,8 +30,11 @@ public abstract class HideForContextFacetAbstract extends FacetAbstract implemen
     }
 
     public HideForContextFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
+    public HideForContextFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetNone.java
index 7f9541c..ad86913 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetNone.java
@@ -22,10 +22,11 @@ package org.apache.isis.core.metamodel.facets.members.hidden.method;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 
-public class HideForContextFacetNone extends HideForContextFacetAbstract {
+public class HideForContextFacetNone
+extends HideForContextFacetAbstract {
 
     public HideForContextFacetNone(final FacetHolder holder) {
-        super(holder);
+        super(holder, Precedence.FALLBACK);
     }
 
     /**
@@ -36,9 +37,4 @@ public class HideForContextFacetNone extends HideForContextFacetAbstract {
         return null;
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetAbstract.java
index 0a52fed..5e97955 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetAbstract.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets.members.layout.group;
 
 import java.util.Map;
 
+import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -39,6 +40,14 @@ implements LayoutGroupFacet {
         this.groupIdAndName = groupIdAndName;
     }
 
+    protected LayoutGroupFacetAbstract(
+            final GroupIdAndName groupIdAndName,
+            final FacetHolder holder,
+            final Facet.Precedence precedence) {
+        super(LayoutGroupFacet.class, holder, precedence);
+        this.groupIdAndName = groupIdAndName;
+    }
+
     @Override
     public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetFromActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetFromActionAnnotation.java
index e778e36..33926a1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetFromActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetFromActionAnnotation.java
@@ -37,12 +37,8 @@ extends LayoutGroupFacetAbstract {
     }
 
     private LayoutGroupFacetFromActionAnnotation(GroupIdAndName groupIdAndName, FacetHolder holder) {
-        super(groupIdAndName, holder);
+        super(groupIdAndName, holder, Precedence.FALLBACK);
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
index 53c3cf0..34fdb0c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
@@ -59,7 +59,7 @@ implements AutoCompleteFacet {
             final Class<?> repositoryClass,
             final Method repositoryMethod) {
 
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
 
         this.repositoryClass = repositoryClass;
         this.repositoryMethod = repositoryMethod;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/BookmarkPolicyFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/BookmarkPolicyFacetAbstract.java
index 8cbe40f..967c8be 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/BookmarkPolicyFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/BookmarkPolicyFacetAbstract.java
@@ -36,7 +36,7 @@ implements BookmarkPolicyFacet {
     private final BookmarkPolicy bookmarkPolicy;
 
     public BookmarkPolicyFacetAbstract(BookmarkPolicy bookmarkPolicy, FacetHolder facetHolder) {
-        super(BookmarkPolicyFacetAbstract.type(), facetHolder, Derivation.NOT_DERIVED);
+        super(BookmarkPolicyFacetAbstract.type(), facetHolder);
         this.bookmarkPolicy = bookmarkPolicy;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
index 941cde7..57b10ab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
@@ -59,15 +59,18 @@ implements MetaModelRefiner {
             objectSpec.streamDeclaredActions(MixedIn.EXCLUDED)
             .filter(objectAction->{
                 final BookmarkPolicyFacet bookmarkFacet = objectAction.getFacet(BookmarkPolicyFacet.class);
-                if(bookmarkFacet == null || bookmarkFacet.isFallback() ||
-                        bookmarkFacet.value() == BookmarkPolicy.NEVER) {
+                if(bookmarkFacet == null
+                        || bookmarkFacet.getPrecedence().isFallback()
+                        || bookmarkFacet.value() == BookmarkPolicy.NEVER) {
                     return false;
                 }
                 return true;
             })
             .forEach(objectAction->{
                 final ActionSemanticsFacet semanticsFacet = objectAction.getFacet(ActionSemanticsFacet.class);
-                if(semanticsFacet == null || semanticsFacet.isFallback() || !semanticsFacet.value().isSafeInNature()) {
+                if(semanticsFacet == null
+                        || semanticsFacet.getPrecedence().isFallback()
+                        || !semanticsFacet.value().isSafeInNature()) {
                     ValidationFailure.raiseFormatted(
                             objectAction,
                             "%s: action is bookmarkable but action semantics are not explicitly indicated as being safe.  " +
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
index 7c43831..ce78407 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
@@ -26,10 +26,12 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 /**
  * Adapter superclass for {@link Facet}s for {@link CallbackFacet}.
  */
-public abstract class CallbackFacetAbstract extends FacetAbstract implements CallbackFacet {
+public abstract class CallbackFacetAbstract
+extends FacetAbstract
+implements CallbackFacet {
 
     public CallbackFacetAbstract(final Class<? extends Facet> facetType, final FacetHolder holder) {
-        super(facetType, holder, Derivation.NOT_DERIVED);
+        super(facetType, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
index f0524f5..4543f9d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
@@ -63,7 +63,7 @@ implements
 
     public ChoicesFacetFromBoundedAbstract(
             final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
index 5965c04..c543449 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
@@ -29,7 +29,9 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 
-public class CssClassFacetMethod extends FacetAbstract implements CssClassFacet {
+public class CssClassFacetMethod
+extends FacetAbstract
+implements CssClassFacet {
 
     public static Class<? extends Facet> type() {
         return CssClassFacet.class;
@@ -39,7 +41,7 @@ public class CssClassFacetMethod extends FacetAbstract implements CssClassFacet
 
 
     public CssClassFacetMethod(final Method method, final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         this.method = method;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetAbstract.java
index de0a265..3bbbafc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetAbstract.java
@@ -27,7 +27,9 @@ import org.apache.isis.core.metamodel.commons.ClassExtensions;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public abstract class DefaultedFacetAbstract extends FacetAbstract implements DefaultedFacet {
+public abstract class DefaultedFacetAbstract
+extends FacetAbstract
+implements DefaultedFacet {
 
     private final Class<?> defaultsProviderClass;
 
@@ -39,7 +41,7 @@ public abstract class DefaultedFacetAbstract extends FacetAbstract implements De
             final Class<?> candidateEncoderDecoderClass,
             final FacetHolder holder) {
 
-        super(DefaultedFacet.class, holder, Derivation.NOT_DERIVED);
+        super(DefaultedFacet.class, holder);
 
         this.defaultsProviderClass = DefaultsProviderUtil.defaultsProviderOrNull(candidateEncoderDecoderClass, candidateEncoderDecoderName);
         if (isValid()) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetUsingDefaultsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetUsingDefaultsProvider.java
index ef7c0f2..b723d19 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetUsingDefaultsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetUsingDefaultsProvider.java
@@ -23,12 +23,14 @@ import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class DefaultedFacetUsingDefaultsProvider extends FacetAbstract implements DefaultedFacet {
+public class DefaultedFacetUsingDefaultsProvider
+extends FacetAbstract
+implements DefaultedFacet {
 
     private final DefaultsProvider<?> defaultsProvider;
 
     public DefaultedFacetUsingDefaultsProvider(final DefaultsProvider<?> parser, final FacetHolder holder) {
-        super(DefaultedFacet.class, holder, Derivation.NOT_DERIVED);
+        super(DefaultedFacet.class, holder);
         this.defaultsProvider = parser;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/DisabledObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/DisabledObjectFacetAbstract.java
index 1348e71..7af5d05 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/DisabledObjectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/DisabledObjectFacetAbstract.java
@@ -26,14 +26,16 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public abstract class DisabledObjectFacetAbstract extends FacetAbstract implements DisabledObjectFacet {
+public abstract class DisabledObjectFacetAbstract
+extends FacetAbstract
+implements DisabledObjectFacet {
 
     public static Class<? extends Facet> type() {
         return DisabledObjectFacet.class;
     }
 
     public DisabledObjectFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
index 63fccaa..81e0438 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
@@ -69,7 +69,7 @@ implements CssClassFacet {
                     final MetamodelEventService metamodelEventService,
                     final FacetHolder holder) {
 
-        super(CssClassFacetAbstract.type(), holder, Derivation.NOT_DERIVED);
+        super(CssClassFacetAbstract.type(), holder);
         this.cssClassUiEventClass = cssClassUiEventClass;
         this.metamodelEventService = metamodelEventService;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
index 91f9a03..9e829d7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
@@ -40,7 +40,7 @@ implements DomainServiceFacet {
     public DomainServiceFacetAbstract(
             final FacetHolder facetHolder,
             final NatureOfService natureOfService) {
-        super(DomainServiceFacetAbstract.type(), facetHolder, Derivation.NOT_DERIVED);
+        super(DomainServiceFacetAbstract.type(), facetHolder);
         this.natureOfService = natureOfService;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetAbstract.java
index ba8c279..f156f89 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetAbstract.java
@@ -38,7 +38,7 @@ implements DomainServiceLayoutFacet {
     private final DomainServiceLayout.MenuBar menuBar;
 
     public DomainServiceLayoutFacetAbstract(final FacetHolder facetHolder, final DomainServiceLayout.MenuBar menuBar) {
-        super(DomainServiceLayoutFacetAbstract.type(), facetHolder, Derivation.NOT_DERIVED);
+        super(DomainServiceLayoutFacetAbstract.type(), facetHolder);
         this.menuBar = menuBar;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/EncodableFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/EncodableFacetAbstract.java
index 1d13e53..5addde6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/EncodableFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/EncodableFacetAbstract.java
@@ -38,7 +38,7 @@ public abstract class EncodableFacetAbstract extends FacetAbstract implements En
             final Class<?> candidateEncoderDecoderClass,
             final FacetHolder holder) {
 
-        super(EncodableFacet.class, holder, Derivation.NOT_DERIVED);
+        super(EncodableFacet.class, holder);
 
         this.encoderDecoderClass = EncoderDecoderUtil.encoderDecoderOrNull(candidateEncoderDecoderClass, candidateEncoderDecoderName);
         if (isValid()) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java
index 7a4508b..3caf6fa9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java
@@ -33,7 +33,7 @@ implements EncodableFacet {
     private final EncoderDecoder<?> encoderDecoder;
 
     public EncodableFacetUsingEncoderDecoder(final EncoderDecoder<?> encoderDecoder, final FacetHolder holder) {
-        super(EncodableFacet.class, holder, Derivation.NOT_DERIVED);
+        super(EncodableFacet.class, holder);
         this.encoderDecoder = encoderDecoder;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAbstract.java
index 6ebde09..76aa53c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAbstract.java
@@ -41,7 +41,7 @@ public abstract class FacetsFacetAbstract extends FacetAbstract implements Facet
     private final Class<? extends FacetFactory>[] facetFactories;
 
     public FacetsFacetAbstract(final String[] names, final Class<?>[] classes, final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         final List<Class<? extends FacetFactory>> facetFactories = new ArrayList<Class<? extends FacetFactory>>();
         for (final String name : names) {
             final Class<? extends FacetFactory> facetFactory = facetFactoryOrNull(name);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
index 6f29705..d7e30ac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
@@ -64,7 +64,7 @@ implements GridFacet {
     private GridFacetDefault(
             final FacetHolder facetHolder,
             final GridService gridService) {
-        super(GridFacetDefault.type(), facetHolder, Derivation.NOT_DERIVED);
+        super(GridFacetDefault.type(), facetHolder);
         this.gridService = gridService;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenObjectFacetAbstract.java
index a099978..4ecc685 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenObjectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenObjectFacetAbstract.java
@@ -32,7 +32,7 @@ public abstract class HiddenObjectFacetAbstract extends FacetAbstract implements
     }
 
     public HiddenObjectFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenTypeFacetDerivedFromAuthorization.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenTypeFacetDerivedFromAuthorization.java
index 3e6fa99..0a95140 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenTypeFacetDerivedFromAuthorization.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenTypeFacetDerivedFromAuthorization.java
@@ -36,7 +36,7 @@ public class HiddenTypeFacetDerivedFromAuthorization extends FacetAbstract imple
     }
 
     public HiddenTypeFacetDerivedFromAuthorization(final FacetHolder holder) {
-        super(type(), holder, Derivation.DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/IconFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/IconFacetAbstract.java
index ed65dfc..4b77050 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/IconFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/IconFacetAbstract.java
@@ -30,7 +30,7 @@ public abstract class IconFacetAbstract extends FacetAbstract implements IconFac
     }
 
     public IconFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/immutable/ImmutableFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/immutable/ImmutableFacetAbstract.java
index 60036b3..3f40bc2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/immutable/ImmutableFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/immutable/ImmutableFacetAbstract.java
@@ -32,7 +32,7 @@ public abstract class ImmutableFacetAbstract extends FacetAbstract implements Im
     }
 
     public ImmutableFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetAbstract.java
index 12e0bee..e80893c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetAbstract.java
@@ -23,19 +23,21 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public abstract class LayoutFacetAbstract extends FacetAbstract implements LayoutFacet {
+public abstract class LayoutFacetAbstract
+extends FacetAbstract implements LayoutFacet {
 
     public static Class<? extends Facet> type() {
         return LayoutFacet.class;
     }
 
     protected LayoutFacetAbstract(final FacetHolder holder) {
-        this(holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
+
     protected LayoutFacetAbstract(
             final FacetHolder holder,
-            final Derivation derivation) {
-        super(type(), holder, derivation);
+            final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
index 79148a5..9d56b60 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.object.layout;
 
 import java.util.Map;
 
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 public class LayoutFacetFallback extends LayoutFacetAbstract {
 
     public LayoutFacetFallback(final FacetHolder holder) {
-        super(holder, FacetAbstract.Derivation.DERIVED);
+        super(holder, Facet.Precedence.DERIVED);
     }
 
     @Override
@@ -41,9 +41,4 @@ public class LayoutFacetFallback extends LayoutFacetAbstract {
         super.appendAttributesTo(attributeMap);
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java
index 5872eea..31864e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java
@@ -40,17 +40,18 @@ implements LogicalTypeFacet {
     @Getter(onMethod_ = {@Override})
     private final @NonNull LogicalType logicalType;
 
-    public LogicalTypeFacetAbstract(
+    protected LogicalTypeFacetAbstract(
             final LogicalType logicalType,
             final FacetHolder holder) {
-        this(logicalType, holder, Derivation.NOT_DERIVED);
+        super(LogicalTypeFacetAbstract.type(), holder);
+        this.logicalType = logicalType;
     }
 
     protected LogicalTypeFacetAbstract(
             final LogicalType logicalType,
             final FacetHolder holder,
-            final Derivation derivation) {
-        super(LogicalTypeFacetAbstract.type(), holder, derivation);
+            final Facet.Precedence precedence) {
+        super(LogicalTypeFacetAbstract.type(), holder, precedence);
         this.logicalType = logicalType;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetDerivedFromClassName.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetDerivedFromClassName.java
index 65275cc..5afa11d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetDerivedFromClassName.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetDerivedFromClassName.java
@@ -32,7 +32,7 @@ extends LogicalTypeFacetAbstract {
     }
 
     public LogicalTypeFacetDerivedFromClassName(final LogicalType logicalType, final FacetHolder holder) {
-        super(logicalType, holder, Derivation.DERIVED);
+        super(logicalType, holder, Precedence.DERIVED);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java
index e4d94c1..8048a3a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java
@@ -26,6 +26,6 @@ import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet
 public class LogicalTypeFacetOnStandaloneList extends LogicalTypeFacetAbstract {
 
     public LogicalTypeFacetOnStandaloneList(final LogicalType logicalType, final FacetHolder holder) {
-        super(logicalType, holder, Derivation.NOT_DERIVED);
+        super(logicalType, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/NavigableParentFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/NavigableParentFacetAbstract.java
index b3468ac..c55a1d0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/NavigableParentFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/NavigableParentFacetAbstract.java
@@ -30,7 +30,7 @@ public abstract class NavigableParentFacetAbstract extends FacetAbstract impleme
     }
 
     public NavigableParentFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacetAbstract.java
index e91b186..54cef0a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectvalidprops/ObjectValidPropertiesFacetAbstract.java
@@ -32,7 +32,7 @@ public abstract class ObjectValidPropertiesFacetAbstract extends FacetAbstract i
     }
 
     public ObjectValidPropertiesFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/PagedFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/PagedFacetAbstract.java
index f01c17f..70e40a2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/PagedFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/PagedFacetAbstract.java
@@ -34,7 +34,7 @@ public abstract class PagedFacetAbstract extends FacetAbstract implements PagedF
     private final int value;
 
     public PagedFacetAbstract(int value, final FacetHolder holder) {
-        super(type(), holder, Derivation.DERIVED);
+        super(type(), holder, Precedence.DERIVED);
         this.value = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetAbstract.java
index 66894ea..1e23a99 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetAbstract.java
@@ -41,7 +41,7 @@ implements ParseableFacet {
             final Class<?> candidateParserClass,
             final FacetHolder holder) {
 
-        super(ParseableFacet.class, holder, Derivation.NOT_DERIVED);
+        super(ParseableFacet.class, holder);
 
         this.parserClass = ParserUtil.parserOrNull(candidateParserClass, candidateParserName);
         this.parseableFacetUsingParser = isValid()?
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
index 7d0cd67..04709c3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
@@ -52,7 +52,7 @@ implements ParseableFacet {
             final Parser<?> parser,
             final FacetHolder holder) {
 
-        super(ParseableFacet.class, holder, Derivation.NOT_DERIVED);
+        super(ParseableFacet.class, holder);
         this.parser = parser;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/PluralFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/PluralFacetAbstract.java
index 5b639b4..04729de 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/PluralFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/PluralFacetAbstract.java
@@ -20,22 +20,23 @@
 package org.apache.isis.core.metamodel.facets.object.plural;
 
 import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleStringValueFacetAbstract;
 
-public abstract class PluralFacetAbstract extends SingleStringValueFacetAbstract implements PluralFacet {
+public abstract class PluralFacetAbstract
+extends SingleStringValueFacetAbstract
+implements PluralFacet {
 
     public static Class<? extends Facet> type() {
         return PluralFacet.class;
     }
 
     public PluralFacetAbstract(final String value, final FacetHolder holder) {
-        this(value, holder, FacetAbstract.Derivation.NOT_DERIVED);
+        super(type(), holder, value);
     }
 
-    public PluralFacetAbstract(final String value, final FacetHolder holder, final FacetAbstract.Derivation derivation) {
-        super(type(), holder, value, derivation);
+    public PluralFacetAbstract(final String value, final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, value, precedence);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/inferred/PluralFacetInferred.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/inferred/PluralFacetInferred.java
index 572c3d3..2773fc0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/inferred/PluralFacetInferred.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/inferred/PluralFacetInferred.java
@@ -25,7 +25,7 @@ import org.apache.isis.core.metamodel.facets.object.plural.PluralFacetAbstract;
 public class PluralFacetInferred extends PluralFacetAbstract {
 
     public PluralFacetInferred(final String value, final FacetHolder holder) {
-        super(value, holder, Derivation.DERIVED);
+        super(value, holder, Precedence.DERIVED);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/projection/ProjectionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/projection/ProjectionFacetAbstract.java
index 8ff861f..370ffaf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/projection/ProjectionFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/projection/ProjectionFacetAbstract.java
@@ -32,11 +32,7 @@ implements ProjectionFacet {
     }
 
     protected ProjectionFacetAbstract(final FacetHolder holder) {
-        this( holder, Derivation.NOT_DERIVED);
-    }
-
-    protected ProjectionFacetAbstract(final FacetHolder holder, final Derivation derivation) {
-        super( type(), holder, derivation);
+        super( type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/projection/ProjectionFacetFromProjectingProperty.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/projection/ProjectionFacetFromProjectingProperty.java
index 1cd7a6b..cd9ed1a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/projection/ProjectionFacetFromProjectingProperty.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/projection/ProjectionFacetFromProjectingProperty.java
@@ -49,8 +49,9 @@ public class ProjectionFacetFromProjectingProperty extends ProjectionFacetAbstra
     public static ProjectionFacet create(final ObjectSpecification objectSpecification) {
         return objectSpecification.streamProperties(MixedIn.EXCLUDED)
         .filter(propertySpec -> {
-            val projectingFacet = propertySpec.getFacet(ProjectingFacet.class);
-            return projectingFacet != null && !projectingFacet.isFallback()
+            val projectingFacet = propertySpec.lookupNonFallbackFacet(ProjectingFacet.class)
+                    .orElse(null);
+            return projectingFacet != null
                     && projectingFacet.value() == Projecting.PROJECTED;
         })
         .findFirst()
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/promptStyle/PromptStyleFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/promptStyle/PromptStyleFacetAbstract.java
index 93db934..8b9b227 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/promptStyle/PromptStyleFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/promptStyle/PromptStyleFacetAbstract.java
@@ -32,11 +32,11 @@ implements PromptStyleFacet {
     }
 
     protected PromptStyleFacetAbstract(final FacetHolder holder) {
-        this( holder, Derivation.NOT_DERIVED);
+        super( type(), holder);
     }
 
-    protected PromptStyleFacetAbstract(final FacetHolder holder, final Derivation derivation) {
-        super( type(), holder, derivation);
+    protected PromptStyleFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super( type(), holder, precedence);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/promptStyle/PromptStyleFacetFallBackToInline.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/promptStyle/PromptStyleFacetFallBackToInline.java
index 12161ef..671a3c1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/promptStyle/PromptStyleFacetFallBackToInline.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/promptStyle/PromptStyleFacetFallBackToInline.java
@@ -22,10 +22,11 @@ package org.apache.isis.core.metamodel.facets.object.promptStyle;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class PromptStyleFacetFallBackToInline extends PromptStyleFacetAbstract {
+public class PromptStyleFacetFallBackToInline
+extends PromptStyleFacetAbstract {
 
     public PromptStyleFacetFallBackToInline(final FacetHolder holder) {
-        super(holder, Derivation.DERIVED);
+        super(holder, Precedence.DERIVED);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacetAbstract.java
index eb68e30..6fc11c0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacetAbstract.java
@@ -31,7 +31,7 @@ implements EntityChangePublishingFacet {
     }
 
     public EntityChangePublishingFacetAbstract(final FacetHolder facetHolder) {
-        super(EntityChangePublishingFacetAbstract.type(), facetHolder, Derivation.NOT_DERIVED);
+        super(EntityChangePublishingFacetAbstract.type(), facetHolder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/TitleFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/TitleFacetAbstract.java
index 65d4c06..1524918 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/TitleFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/TitleFacetAbstract.java
@@ -30,7 +30,11 @@ public abstract class TitleFacetAbstract extends FacetAbstract implements TitleF
     }
 
     public TitleFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
+    }
+
+    public TitleFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java
index 4582249..5c531ff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java
@@ -73,8 +73,9 @@ public class TitleFacetViaMethodsFactory extends MethodPrefixBasedFacetFactoryAb
         }
 
         // may have a facet by virtue of @Title, say.
-        final TitleFacet existingTitleFacet = facetHolder.getFacet(TitleFacet.class);
-        if(existingTitleFacet != null && !existingTitleFacet.isFallback()) {
+        final TitleFacet existingTitleFacet = facetHolder.lookupNonFallbackFacet(TitleFacet.class)
+                .orElse(null);
+        if(existingTitleFacet != null) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaToStringMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaToStringMethod.java
index 1435393..9de4e94 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaToStringMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaToStringMethod.java
@@ -34,7 +34,7 @@ public class TitleFacetViaToStringMethod extends TitleFacetAbstract implements I
     private final Method method;
 
     public TitleFacetViaToStringMethod(final Method method, final FacetHolder holder) {
-        super(holder);
+        super(holder, Precedence.FALLBACK);
         this.method = method;
     }
 
@@ -58,11 +58,7 @@ public class TitleFacetViaToStringMethod extends TitleFacetAbstract implements I
     }
 
     @Override
-    public boolean isFallback() {
-        return true;
-    }
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+    public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingParser.java
index 438de34..502f3e0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingParser.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingParser.java
@@ -31,7 +31,7 @@ public class TitleFacetUsingParser extends FacetAbstract implements TitleFacet {
     private final Parser<?> parser;
 
     public TitleFacetUsingParser(final Parser<?> parser, final FacetHolder holder) {
-        super(TitleFacet.class, holder, Derivation.NOT_DERIVED);
+        super(TitleFacet.class, holder);
         this.parser = parser;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacetAbstract.java
index 3dfb377..aaa147d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacetAbstract.java
@@ -33,7 +33,7 @@ public abstract class ValidateObjectFacetAbstract extends FacetAbstract implemen
     }
 
     public ValidateObjectFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/TypicalLengthFacetUsingParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/TypicalLengthFacetUsingParser.java
index 2ac8c25..aa21553 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/TypicalLengthFacetUsingParser.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/TypicalLengthFacetUsingParser.java
@@ -29,7 +29,7 @@ public class TypicalLengthFacetUsingParser extends FacetAbstract implements Typi
     private final Parser<?> parser;
 
     public TypicalLengthFacetUsingParser(final Parser<?> parser, final FacetHolder holder) {
-        super(TypicalLengthFacet.class, holder, Derivation.NOT_DERIVED);
+        super(TypicalLengthFacet.class, holder);
         this.parser = parser;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
index 1d6703b..5f801db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -80,7 +80,7 @@ implements ValueFacet {
             final AddFacetsIfInvalidStrategy addFacetsIfInvalid,
             final FacetHolder holder) {
 
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         super.setFacetAliasType(ValueFacet.class);
 
         this.semanticsProvider = semanticsProvider;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetSimple.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetSimple.java
index b88e0d1..5f6e234 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetSimple.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetSimple.java
@@ -30,7 +30,7 @@ public class ValueFacetSimple extends FacetAbstract implements ValueFacet {
     }
 
     public ValueFacetSimple(FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         super.setFacetAliasType(ValueFacet.class);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java
index 1741aee..12259d7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java
@@ -32,7 +32,6 @@ import org.apache.isis.applib.exceptions.unrecoverable.UnknownTypeException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.properties.defaults.PropertyDefaultFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
@@ -80,7 +79,14 @@ implements ValueSemanticsProvider<T>, EncoderDecoder<T>, Parser<T>, DefaultsProv
             final EqualByContent equalByContent,
             final T defaultValue) {
 
-        super(adapterFacetType, holder, Derivation.NOT_DERIVED);
+        /*
+         * precedence = LATE
+         * We don't replace any (none no-op) facets.
+         *
+         * For example, if there is already a {@link PropertyDefaultFacet} then we
+         * shouldn't replace it.
+         */
+        super(adapterFacetType, holder, Facet.Precedence.LATE);
         this.adaptedClass = adaptedClass;
         this.typicalLength = typicalLength;
         this.maxLength = maxLength;
@@ -108,18 +114,6 @@ implements ValueSemanticsProvider<T>, EncoderDecoder<T>, Parser<T>, DefaultsProv
         return adaptedClass;
     }
 
-    /**
-     * We don't replace any (none no-op) facets.
-     *
-     * <p>
-     * For example, if there is already a {@link PropertyDefaultFacet} then we
-     * shouldn't replace it.
-     */
-    @Override
-    public boolean alwaysReplace() {
-        return false;
-    }
-
     // ///////////////////////////////////////////////////////////////////////////
     // ValueSemanticsProvider implementation
     // ///////////////////////////////////////////////////////////////////////////
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/choices/ChoicesFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/choices/ChoicesFacetAbstract.java
index 5f085a2..9b6588d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/choices/ChoicesFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/choices/ChoicesFacetAbstract.java
@@ -32,7 +32,7 @@ implements ChoicesFacet {
     }
 
     public ChoicesFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacet.java
index 67871f4..7803aa4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacet.java
@@ -35,11 +35,26 @@ import lombok.val;
  * value being provided. For a mandatory parameter, the action cannot be invoked
  * without the value being provided.
  *
- * <p>
- * In the standard Apache Isis Programming Model, specify mandatory by
- * <i>omitting</i> the <tt>@Optional</tt> annotation.
  */
-public interface MandatoryFacet extends Facet, ValidatingInteractionAdvisor {
+public interface MandatoryFacet
+extends Facet, ValidatingInteractionAdvisor {
+
+    public enum Semantics {
+        REQUIRED,
+        OPTIONAL;
+
+        public static Semantics of(boolean required) {
+            return required ? REQUIRED: OPTIONAL;
+        }
+
+        public boolean isRequired() {
+            return this == REQUIRED;
+        }
+
+        public boolean isOptional() {
+            return this == OPTIONAL;
+        }
+    }
 
     /**
      * Whether this value is required but has not been provided (and is
@@ -56,13 +71,15 @@ public interface MandatoryFacet extends Facet, ValidatingInteractionAdvisor {
      * other words that the {@link FacetHolder} to which this {@link Facet} is
      * attached is <i>not</i> mandatory.
      */
-    public boolean isInvertedSemantics();
+    public Semantics getSemantics();
 
-    static boolean isMandatory(@NonNull FacetHolder facetHolder) {
+    static boolean isMandatory(final @NonNull FacetHolder facetHolder) {
         val mandatoryFacet = facetHolder.getFacet(MandatoryFacet.class);
-        if(mandatoryFacet == null || mandatoryFacet.isFallback() || mandatoryFacet.isInvertedSemantics()) {
+        if(mandatoryFacet == null) {
+            // absence of the mandatory facet indicates OPTIONAL
             return false;
         }
-        return true;
+        return mandatoryFacet.getSemantics()==null
+                || mandatoryFacet.getSemantics().isRequired();
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
index 80e3677..07d6582 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
@@ -33,23 +33,18 @@ import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
+import lombok.Getter;
 import lombok.val;
 
-public abstract class MandatoryFacetAbstract extends FacetAbstract implements MandatoryFacet {
+public abstract class MandatoryFacetAbstract
+extends FacetAbstract
+implements MandatoryFacet {
 
     public static Class<? extends Facet> type() {
         return MandatoryFacet.class;
     }
 
-    public enum Semantics {
-        REQUIRED,
-        OPTIONAL;
-
-        public static Semantics of(boolean required) {
-            return required ? REQUIRED: OPTIONAL;
-        }
-    }
-
+    @Getter(onMethod_ = {@Override})
     private Semantics semantics;
 
     public MandatoryFacetAbstract(final FacetHolder holder, final Semantics semantics) {
@@ -57,12 +52,18 @@ public abstract class MandatoryFacetAbstract extends FacetAbstract implements Ma
         this.semantics = semantics;
     }
 
+    public MandatoryFacetAbstract(
+            final FacetHolder holder, final Semantics semantics, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
+        this.semantics = semantics;
+    }
+
     /**
      * If not specified or, if a string, then zero length.
      */
     @Override
     public final boolean isRequiredButNull(final ManagedObject adapter) {
-        if(!isInvertedSemantics()) {
+        if(getSemantics().isRequired()) {
             val pojo = UnwrapUtil.single(adapter);
 
             // special case string handling.
@@ -77,11 +78,6 @@ public abstract class MandatoryFacetAbstract extends FacetAbstract implements Ma
     }
 
     @Override
-    public boolean isInvertedSemantics() {
-        return this.semantics == Semantics.OPTIONAL;
-    }
-
-    @Override
     public String invalidates(final ValidityContext context) {
         if (!(context instanceof PropertyModifyContext) && !(context instanceof ActionArgValidityContext)) {
             return null;
@@ -102,9 +98,9 @@ public abstract class MandatoryFacetAbstract extends FacetAbstract implements Ma
         return name != null? "'" + name + "' is mandatory":"Mandatory";
     }
 
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+    @Override
+    public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         attributeMap.put("semantics", semantics);
-        attributeMap.put("inverted", isInvertedSemantics());
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetDefault.java
index 819807d..ee5a59d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetDefault.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.objectvalue.mandatory;
 
+import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 /**
@@ -28,16 +29,16 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
  * For a mandatory property, the object cannot be saved/updated without the
  * value being provided. For a mandatory parameter, the action cannot be invoked
  * without the value being provided.
- *
- * <p>
- * In the standard Apache Isis Programming Model, specify mandatory by
- * <i>omitting</i> the <tt>@Optional</tt> annotation.
  */
 public class MandatoryFacetDefault extends MandatoryFacetAbstract {
 
-    public MandatoryFacetDefault(final FacetHolder holder) {
-        super(holder, Semantics.REQUIRED);
+    public static MandatoryFacetDefault required(final FacetHolder holder) {
+        return new MandatoryFacetDefault(holder, Semantics.REQUIRED);
     }
 
+    private MandatoryFacetDefault(final FacetHolder holder, final Semantics semantics) {
+        // unconditionally created, hence acting as a fallback
+        super(holder, semantics, Facet.Precedence.FALLBACK);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java
index beda1c3..e455936 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java
@@ -29,7 +29,9 @@ import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 import lombok.val;
 
-public abstract class MaxLengthFacetAbstract extends SingleIntValueFacetAbstract implements MaxLengthFacet {
+public abstract class MaxLengthFacetAbstract
+extends SingleIntValueFacetAbstract
+implements MaxLengthFacet {
 
     public static Class<? extends Facet> type() {
         return MaxLengthFacet.class;
@@ -39,6 +41,10 @@ public abstract class MaxLengthFacetAbstract extends SingleIntValueFacetAbstract
         super(type(), holder, value);
     }
 
+    public MaxLengthFacetAbstract(final int value, final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, value, precedence);
+    }
+
     /**
      * Whether the provided argument exceeds the {@link #value() maximum length}
      * .
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/multiline/MultiLineFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/multiline/MultiLineFacetAbstract.java
index 89c46ac..ed2813c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/multiline/MultiLineFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/multiline/MultiLineFacetAbstract.java
@@ -40,6 +40,11 @@ implements MultiLineFacet {
         this.numberOfLines = numberOfLines;
     }
 
+    public MultiLineFacetAbstract(final int numberOfLines, final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
+        this.numberOfLines = numberOfLines;
+    }
+
     @Override
     public int numberOfLines() {
         return numberOfLines;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mustsatisfyspec/MustSatisfySpecificationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mustsatisfyspec/MustSatisfySpecificationFacetAbstract.java
index 7b07e8f..c4cfeb0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mustsatisfyspec/MustSatisfySpecificationFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mustsatisfyspec/MustSatisfySpecificationFacetAbstract.java
@@ -58,7 +58,7 @@ public abstract class MustSatisfySpecificationFacetAbstract extends FacetAbstrac
     public MustSatisfySpecificationFacetAbstract(
             final List<Specification> specifications,
             final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
 
         this.specifications = specifications;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/renderedadjusted/RenderedAdjustedFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/renderedadjusted/RenderedAdjustedFacetAbstract.java
index 54e7e9f..830584d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/renderedadjusted/RenderedAdjustedFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/renderedadjusted/RenderedAdjustedFacetAbstract.java
@@ -34,7 +34,7 @@ public abstract class RenderedAdjustedFacetAbstract extends FacetAbstract implem
     private final int adjustBy;
 
     public RenderedAdjustedFacetAbstract(int adjustBy, final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         this.adjustBy = adjustBy;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/typicallen/TypicalLengthFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/typicallen/TypicalLengthFacetAbstract.java
index b2acdf1..dde485b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/typicallen/TypicalLengthFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/typicallen/TypicalLengthFacetAbstract.java
@@ -23,14 +23,20 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public abstract class TypicalLengthFacetAbstract extends FacetAbstract implements TypicalLengthFacet {
+public abstract class TypicalLengthFacetAbstract
+extends FacetAbstract
+implements TypicalLengthFacet {
 
     public static Class<? extends Facet> type() {
         return TypicalLengthFacet.class;
     }
 
-    public TypicalLengthFacetAbstract(final FacetHolder holder, final Derivation derivation) {
-        super(type(), holder, derivation);
+    public TypicalLengthFacetAbstract(final FacetHolder holder) {
+        super(type(), holder);
+    }
+
+    public TypicalLengthFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacetAbstract.java
index b2a8c69..ca20102 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacetAbstract.java
@@ -32,7 +32,7 @@ implements ActionParameterAutoCompleteFacet {
     }
 
     public ActionParameterAutoCompleteFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java
index 832c357..c8e0d96 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java
@@ -35,7 +35,7 @@ public class BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation exten
     }
 
     public BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation(final FacetHolder holder, final Integer precision, final Integer scale) {
-        super(BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.type(), holder, Derivation.NOT_DERIVED);
+        super(BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.type(), holder);
         this.precision = precision;
         this.scale = scale;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionChoicesFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionChoicesFacetAbstract.java
index e517292..7ce7fab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionChoicesFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionChoicesFacetAbstract.java
@@ -23,14 +23,20 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public abstract class ActionChoicesFacetAbstract extends FacetAbstract implements ActionChoicesFacet {
+public abstract class ActionChoicesFacetAbstract
+extends FacetAbstract
+implements ActionChoicesFacet {
 
     public static Class<? extends Facet> type() {
         return ActionChoicesFacet.class;
     }
 
     public ActionChoicesFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
+    }
+
+    public ActionChoicesFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
index d24c036..1659e63 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
@@ -32,7 +32,11 @@ implements ActionParameterChoicesFacet {
     }
 
     public ActionParameterChoicesFacetAbstract(FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
+    }
+
+    public ActionParameterChoicesFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java
index 45dd9ba..5728361 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 public class ActionParameterChoicesFacetNone extends ActionParameterChoicesFacetAbstract {
 
     public ActionParameterChoicesFacetNone(final FacetHolder holder) {
-        super(holder);
+        super(holder, Precedence.FALLBACK);
     }
 
     @Override
@@ -42,9 +42,4 @@ public class ActionParameterChoicesFacetNone extends ActionParameterChoicesFacet
         return Can.empty();
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/ActionParameterDefaultsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/ActionParameterDefaultsFacetAbstract.java
index 21e247b..c26f771 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/ActionParameterDefaultsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/ActionParameterDefaultsFacetAbstract.java
@@ -32,7 +32,7 @@ implements ActionParameterDefaultsFacet {
     }
 
     public ActionParameterDefaultsFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/fromtype/ActionParameterDefaultFacetDerivedFromTypeFacets.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/fromtype/ActionParameterDefaultFacetDerivedFromTypeFacets.java
index cbed839..e9fc190 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/fromtype/ActionParameterDefaultFacetDerivedFromTypeFacets.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/fromtype/ActionParameterDefaultFacetDerivedFromTypeFacets.java
@@ -26,12 +26,13 @@ import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFace
 import org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public class ActionParameterDefaultFacetDerivedFromTypeFacets extends ActionDefaultsFacetAbstract {
+public class ActionParameterDefaultFacetDerivedFromTypeFacets
+extends ActionDefaultsFacetAbstract {
 
     private final DefaultedFacet[] defaultedFacets;
 
     public ActionParameterDefaultFacetDerivedFromTypeFacets(final DefaultedFacet[] defaultedFacets, final FacetHolder holder) {
-        super(holder, Derivation.DERIVED);
+        super(holder, Precedence.DERIVED);
         this.defaultedFacets = defaultedFacets;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/ActionParameterDisabledFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/ActionParameterDisabledFacetAbstract.java
index 5ed711e..b0d1023 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/ActionParameterDisabledFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/ActionParameterDisabledFacetAbstract.java
@@ -34,7 +34,7 @@ implements ActionParameterDisabledFacet {
     }
 
     public ActionParameterDisabledFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java
index 65159a6..d826644 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java
@@ -36,7 +36,7 @@ implements ActionParameterHiddenFacet {
     }
 
     public ActionParameterHiddenFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/TypicalLengthFacetForParameterLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/TypicalLengthFacetForParameterLayoutAnnotation.java
index b7d8ab8..8cf1d7b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/TypicalLengthFacetForParameterLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/TypicalLengthFacetForParameterLayoutAnnotation.java
@@ -43,7 +43,7 @@ public class TypicalLengthFacetForParameterLayoutAnnotation extends TypicalLengt
     private final int value;
 
     public TypicalLengthFacetForParameterLayoutAnnotation(int typicalLength, FacetHolder holder) {
-        super(holder, Derivation.NOT_DERIVED);
+        super(holder);
         this.value = typicalLength;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
index a283387..d26ed6f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.param.mandatory.dflt;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
@@ -46,11 +46,10 @@ public class MandatoryFacetOnParametersDefaultFactory extends FacetFactoryAbstra
 
     @Override
     public void processParams(final ProcessParameterContext processParameterContext) {
-        super.addFacet(create(processParameterContext.getFacetHolder()));
+        FacetUtil.addFacet(
+                MandatoryFacetDefault
+                .required(processParameterContext.getFacetHolder()));
     }
 
-    private MandatoryFacet create(final FacetHolder holder) {
-        return new MandatoryFacetDefault(holder);
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/annotation/TypicalLengthFacetOnParameterAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/annotation/TypicalLengthFacetOnParameterAnnotation.java
index a67831b..3184dc5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/annotation/TypicalLengthFacetOnParameterAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/annotation/TypicalLengthFacetOnParameterAnnotation.java
@@ -33,7 +33,7 @@ public class TypicalLengthFacetOnParameterAnnotation extends TypicalLengthFacetA
     private final int value;
 
     public TypicalLengthFacetOnParameterAnnotation(final int value, final FacetHolder holder) {
-        super(holder, Derivation.NOT_DERIVED);
+        super(holder);
         this.value = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/fromtype/TypicalLengthFacetOnParameterDerivedFromType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/fromtype/TypicalLengthFacetOnParameterDerivedFromType.java
index 365d1a2..e063886 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/fromtype/TypicalLengthFacetOnParameterDerivedFromType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/fromtype/TypicalLengthFacetOnParameterDerivedFromType.java
@@ -31,7 +31,7 @@ public class TypicalLengthFacetOnParameterDerivedFromType extends TypicalLengthF
     private final TypicalLengthFacet typicalLengthFacet;
 
     public TypicalLengthFacetOnParameterDerivedFromType(final TypicalLengthFacet typicalLengthFacet, final FacetHolder holder) {
-        super(holder, Derivation.DERIVED);
+        super(holder, Precedence.DERIVED);
         this.typicalLengthFacet = typicalLengthFacet;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacetAbstract.java
index c8e5610..7aaf33d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacetAbstract.java
@@ -36,7 +36,7 @@ implements ActionParameterValidationFacet {
     }
 
     public ActionParameterValidationFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacetAbstract.java
index 5a5e2a6..b9d1fcb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacetAbstract.java
@@ -39,7 +39,7 @@ implements PropertyOrCollectionAccessorFacet {
     public PropertyOrCollectionAccessorFacetAbstract(
             final ObjectSpecification onType,
             final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         this.onType = onType;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/PropertyAutoCompleteFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/PropertyAutoCompleteFacetAbstract.java
index 262887c..76299c6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/PropertyAutoCompleteFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/PropertyAutoCompleteFacetAbstract.java
@@ -30,7 +30,7 @@ public abstract class PropertyAutoCompleteFacetAbstract extends FacetAbstract im
     }
 
     public PropertyAutoCompleteFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
index b5a54c5..01d8ce8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
@@ -36,7 +36,7 @@ public class BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation extend
     }
 
     public BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation(final FacetHolder holder, final Integer precision, final Integer scale) {
-        super(BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation.type(), holder, Derivation.NOT_DERIVED);
+        super(BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation.type(), holder);
         this.precision = precision;
         this.scale = scale;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/PropertyChoicesFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/PropertyChoicesFacetAbstract.java
index a2acb8f..d7cc9a0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/PropertyChoicesFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/PropertyChoicesFacetAbstract.java
@@ -30,7 +30,7 @@ public abstract class PropertyChoicesFacetAbstract extends FacetAbstract impleme
     }
 
     public PropertyChoicesFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/PropertyDefaultFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/PropertyDefaultFacetAbstract.java
index 92be45e..d18c8dd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/PropertyDefaultFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/PropertyDefaultFacetAbstract.java
@@ -30,7 +30,11 @@ public abstract class PropertyDefaultFacetAbstract extends FacetAbstract impleme
     }
 
     public PropertyDefaultFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
+    }
+
+    public PropertyDefaultFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/PropertyDefaultFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/PropertyDefaultFacetNone.java
index 26eb8aa..03f10fa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/PropertyDefaultFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/PropertyDefaultFacetNone.java
@@ -22,10 +22,11 @@ package org.apache.isis.core.metamodel.facets.properties.defaults;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public class PropertyDefaultFacetNone extends PropertyDefaultFacetAbstract {
+public class PropertyDefaultFacetNone
+extends PropertyDefaultFacetAbstract {
 
     public PropertyDefaultFacetNone(final FacetHolder holder) {
-        super(holder);
+        super(holder, Precedence.FALLBACK);
     }
 
     /**
@@ -36,9 +37,4 @@ public class PropertyDefaultFacetNone extends PropertyDefaultFacetAbstract {
         return null;
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromDefaultedFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromDefaultedFacet.java
index 3299986..99e6459 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromDefaultedFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromDefaultedFacet.java
@@ -34,7 +34,7 @@ public class PropertyDefaultFacetDerivedFromDefaultedFacet extends FacetAbstract
     public PropertyDefaultFacetDerivedFromDefaultedFacet(
             final DefaultedFacet typeFacet, final FacetHolder holder) {
 
-        super(PropertyDefaultFacet.class, holder, Derivation.NOT_DERIVED);
+        super(PropertyDefaultFacet.class, holder);
         this.typeFacet = typeFacet;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromTypeFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromTypeFactory.java
index acdb4df..a7d2889 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromTypeFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/fromtype/PropertyDefaultFacetDerivedFromTypeFactory.java
@@ -41,8 +41,10 @@ public class PropertyDefaultFacetDerivedFromTypeFactory extends FacetFactoryAbst
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
         // don't overwrite any defaults that might already picked up
-        final PropertyDefaultFacet existingDefaultFacet = processMethodContext.getFacetHolder().getFacet(PropertyDefaultFacet.class);
-        if (existingDefaultFacet != null && !existingDefaultFacet.isFallback()) {
+        final PropertyDefaultFacet existingDefaultFacet = processMethodContext.getFacetHolder()
+                .lookupNonFallbackFacet(PropertyDefaultFacet.class)
+                .orElse(null);
+        if (existingDefaultFacet != null) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/mandatory/dflt/MandatoryFacetOnProperyDefaultFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/mandatory/dflt/MandatoryFacetOnProperyDefaultFactory.java
index 1978634..596b425 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/mandatory/dflt/MandatoryFacetOnProperyDefaultFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/mandatory/dflt/MandatoryFacetOnProperyDefaultFactory.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.metamodel.facets.properties.mandatory.dflt;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
@@ -47,11 +46,10 @@ public class MandatoryFacetOnProperyDefaultFactory extends FacetFactoryAbstract
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        FacetUtil.addFacet(create(processMethodContext.getFacetHolder()));
+        FacetUtil.addFacet(
+                MandatoryFacetDefault
+                .required(processMethodContext.getFacetHolder()));
     }
 
-    private MandatoryFacet create(final FacetHolder holder) {
-        return new MandatoryFacetDefault(holder);
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/projection/ProjectingFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/projection/ProjectingFacetAbstract.java
index c0ce345..5f5a6d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/projection/ProjectingFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/projection/ProjectingFacetAbstract.java
@@ -23,7 +23,8 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public abstract class ProjectingFacetAbstract extends FacetAbstract
+public abstract class ProjectingFacetAbstract
+extends FacetAbstract
 implements ProjectingFacet {
 
     public static Class<? extends Facet> type() {
@@ -31,11 +32,7 @@ implements ProjectingFacet {
     }
 
     protected ProjectingFacetAbstract(final FacetHolder holder) {
-        this( holder, Derivation.NOT_DERIVED);
-    }
-
-    protected ProjectingFacetAbstract(final FacetHolder holder, final Derivation derivation) {
-        super( type(), holder, derivation);
+        super( type(), holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyLayoutAnnotation.java
index af97c83..e666ead 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyLayoutAnnotation.java
@@ -23,7 +23,6 @@ import java.util.Map;
 import java.util.Optional;
 
 import org.apache.isis.applib.annotation.PropertyLayout;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacetAbstract;
@@ -44,7 +43,7 @@ public class TypicalLengthFacetForPropertyLayoutAnnotation extends TypicalLength
     private final int value;
 
     private TypicalLengthFacetForPropertyLayoutAnnotation(int value, FacetHolder holder) {
-        super(holder, FacetAbstract.Derivation.NOT_DERIVED);
+        super(holder);
         this.value = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
index 9cb8fc3..ae7c961 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
@@ -22,7 +22,6 @@ package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 import java.util.Map;
 
 import org.apache.isis.applib.layout.component.PropertyLayoutData;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacetAbstract;
@@ -40,7 +39,7 @@ public class TypicalLengthFacetForPropertyXml extends TypicalLengthFacetAbstract
     private final int value;
 
     private TypicalLengthFacetForPropertyXml(int value, FacetHolder holder) {
-        super(holder, FacetAbstract.Derivation.NOT_DERIVED);
+        super(holder);
         this.value = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/typicallen/annotation/TypicalLengthFacetOnPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/typicallen/annotation/TypicalLengthFacetOnPropertyAnnotation.java
index c496473..22dac06 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/typicallen/annotation/TypicalLengthFacetOnPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/typicallen/annotation/TypicalLengthFacetOnPropertyAnnotation.java
@@ -33,7 +33,7 @@ public class TypicalLengthFacetOnPropertyAnnotation extends TypicalLengthFacetAb
     private final int value;
 
     public TypicalLengthFacetOnPropertyAnnotation(final int value, final FacetHolder holder) {
-        super(holder, Derivation.NOT_DERIVED);
+        super(holder);
         this.value = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/typicallen/fromtype/TypicalLengthFacetOnPropertyDerivedFromType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/typicallen/fromtype/TypicalLengthFacetOnPropertyDerivedFromType.java
index f6ea2de..ce6c7d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/typicallen/fromtype/TypicalLengthFacetOnPropertyDerivedFromType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/typicallen/fromtype/TypicalLengthFacetOnPropertyDerivedFromType.java
@@ -31,7 +31,7 @@ public class TypicalLengthFacetOnPropertyDerivedFromType extends TypicalLengthFa
     private final TypicalLengthFacet typicalLengthFacet;
 
     public TypicalLengthFacetOnPropertyDerivedFromType(final TypicalLengthFacet typicalLengthFacet, final FacetHolder holder) {
-        super(holder, Derivation.DERIVED);
+        super(holder, Precedence.DERIVED);
         this.typicalLengthFacet = typicalLengthFacet;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetAbstract.java
index 13e25af..1327145 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetAbstract.java
@@ -30,6 +30,6 @@ public abstract class PropertyClearFacetAbstract extends FacetAbstract implement
     }
 
     public PropertyClearFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetAbstract.java
index 1c061bf..ca73e10 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetAbstract.java
@@ -30,6 +30,6 @@ public abstract class PropertyInitializationFacetAbstract extends FacetAbstract
     }
 
     public PropertyInitializationFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetAbstract.java
index ea42897..b80c2d1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetAbstract.java
@@ -30,6 +30,6 @@ public abstract class PropertySetterFacetAbstract extends FacetAbstract implemen
     }
 
     public PropertySetterFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/PropertyValidateFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/PropertyValidateFacetAbstract.java
index a00e277..612157d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/PropertyValidateFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/PropertyValidateFacetAbstract.java
@@ -34,7 +34,11 @@ public abstract class PropertyValidateFacetAbstract extends FacetAbstract implem
     }
 
     public PropertyValidateFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
+    }
+
+    public PropertyValidateFacetAbstract(final FacetHolder holder, final Facet.Precedence precedence) {
+        super(type(), holder, precedence);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/PropertyValidateFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/PropertyValidateFacetNone.java
index 363b51d..b73b6f7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/PropertyValidateFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/PropertyValidateFacetNone.java
@@ -22,10 +22,11 @@ package org.apache.isis.core.metamodel.facets.properties.validating;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public class PropertyValidateFacetNone extends PropertyValidateFacetAbstract {
+public class PropertyValidateFacetNone
+extends PropertyValidateFacetAbstract {
 
     public PropertyValidateFacetNone(final FacetHolder holder) {
-        super(holder);
+        super(holder, Precedence.FALLBACK);
     }
 
     /**
@@ -39,9 +40,4 @@ public class PropertyValidateFacetNone extends PropertyValidateFacetAbstract {
         return null;
     }
 
-    @Override
-    public boolean isFallback() {
-        return true;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefault.java
index 968363c..3c95c5a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefault.java
@@ -37,7 +37,7 @@ public class PropertyValidateFacetDefault extends FacetAbstract implements Prope
     }
 
     public PropertyValidateFacetDefault(final FacetHolder holder) {
-        super(PropertyValidateFacet.class, holder, Derivation.NOT_DERIVED);
+        super(PropertyValidateFacet.class, holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java
index 2183842..c5e50c4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java
@@ -25,8 +25,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 public abstract class BigDecimalValueFacetAbstract extends FacetAbstract implements BigDecimalValueFacet {
 
-    public BigDecimalValueFacetAbstract(Class<? extends Facet> facetType, FacetHolder holder, Derivation derivation) {
-        super(facetType, holder, derivation);
+    public BigDecimalValueFacetAbstract(Class<? extends Facet> facetType, FacetHolder holder) {
+        super(facetType, holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java
index 639be8b..2885544 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java
@@ -53,11 +53,6 @@ implements ImageValueFacet {
     }
 
     @Override
-    public boolean alwaysReplace() {
-        return false;
-    }
-
-    @Override
     public Facet getUnderlyingFacet() {
         return null;
     }
@@ -71,11 +66,6 @@ implements ImageValueFacet {
     }
 
     @Override
-    public boolean isDerived() {
-        return false;
-    }
-
-    @Override
     public String titleString(final Object value) {
         return "image";
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueSemanticsProvider.java
index 2b54745..fac6753 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueSemanticsProvider.java
@@ -72,11 +72,6 @@ extends ImageValueSemanticsProviderAbstract<BufferedImage> {
     }
 
     @Override
-    public boolean isFallback() {
-        return false;
-    }
-
-    @Override
     public String toString() {
         return "JavaAwtImageValueSemanticsProvider: ";
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java
index 8cd79de..d3fa4e0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java
@@ -374,7 +374,8 @@ public class LayoutFacetUtil {
     // -- HELPER
 
     private static boolean isDoOp(final Facet facet) {
-        return facet != null && !facet.isFallback();
+        return facet != null
+                && !facet.getPrecedence().isFallback();
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/DescribedAsFacetTranslated.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/DescribedAsFacetTranslated.java
index abce92d..757c5a8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/DescribedAsFacetTranslated.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/DescribedAsFacetTranslated.java
@@ -27,7 +27,9 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 
-public class DescribedAsFacetTranslated extends FacetAbstract implements DescribedAsFacet {
+public class DescribedAsFacetTranslated
+extends FacetAbstract
+implements DescribedAsFacet {
 
     private final TranslationContext context;
     private final String originalText;
@@ -37,7 +39,7 @@ public class DescribedAsFacetTranslated extends FacetAbstract implements Describ
             final TranslationContext context, final String originalText,
             final TranslationService translationService,
             final IdentifiedHolder holder) {
-        super(DescribedAsFacet.class, holder, Derivation.NOT_DERIVED);
+        super(DescribedAsFacet.class, holder);
         this.context = context;
         this.originalText = originalText;
         this.translationService = translationService;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/NamedFacetTranslated.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/NamedFacetTranslated.java
index ea439cd..2682e32 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/NamedFacetTranslated.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/NamedFacetTranslated.java
@@ -37,7 +37,7 @@ public class NamedFacetTranslated extends FacetAbstract implements NamedFacet {
             final TranslationContext context, final String originalText,
             final TranslationService translationService,
             final IdentifiedHolder facetHolder) {
-        super(NamedFacet.class, facetHolder, Derivation.NOT_DERIVED);
+        super(NamedFacet.class, facetHolder);
         this.context = context;
         this.originalText = originalText;
         this.translationService = translationService;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/PluralFacetTranslated.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/PluralFacetTranslated.java
index d1fdca4..9be7de3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/PluralFacetTranslated.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/PluralFacetTranslated.java
@@ -35,7 +35,7 @@ public class PluralFacetTranslated extends FacetAbstract implements PluralFacet
     private String originalText;
 
     public PluralFacetTranslated(final NamedFacetTranslated facet, final FacetHolder facetHolder) {
-        super(PluralFacet.class, facetHolder, Derivation.DERIVED);
+        super(PluralFacet.class, facetHolder, Precedence.DERIVED);
         this.translationService = facet.translationService;
         this.context = facet.context;
         this.originalText = facet.originalText;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java
index d1b52c0..d3a3529 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java
@@ -42,7 +42,7 @@ public abstract class AuthorizationFacetAbstract extends FacetAbstract implement
 
     public AuthorizationFacetAbstract(
             final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         this.authorizationManager = getAuthorizationManager();
         this.authenticationContext = getAuthenticationContext();
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/navigation/NavigationFacetDerivedFromHiddenType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/navigation/NavigationFacetDerivedFromHiddenType.java
index 61ecf7f..ed8e7ea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/navigation/NavigationFacetDerivedFromHiddenType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/navigation/NavigationFacetDerivedFromHiddenType.java
@@ -20,18 +20,14 @@
 package org.apache.isis.core.metamodel.postprocessors.members.navigation;
 
 import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.navigation.NavigationFacet;
 import org.apache.isis.core.metamodel.facets.object.hidden.HiddenTypeFacet;
-import org.apache.isis.core.metamodel.interactions.HidingInteractionAdvisor;
 import org.apache.isis.core.metamodel.interactions.ObjectVisibilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.postprocessors.allbutparam.authorization.AuthorizationFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 
 import lombok.val;
 
@@ -44,7 +40,7 @@ public class NavigationFacetDerivedFromHiddenType extends FacetAbstract implemen
     }
 
     public NavigationFacetDerivedFromHiddenType(final FacetHolder holder, final ObjectSpecification navigatedType) {
-        super(type(), holder, Derivation.DERIVED);
+        super(type(), holder);
         this.navigatedType = navigatedType;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/object/DeriveProjectionFacetsPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/object/DeriveProjectionFacetsPostProcessor.java
index e354ccc..21e0760 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/object/DeriveProjectionFacetsPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/object/DeriveProjectionFacetsPostProcessor.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.postprocessors.object;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
@@ -77,8 +79,10 @@ extends ObjectSpecificationPostProcessorAbstract {
     protected void doPostProcess(ObjectSpecification objectSpecification, OneToManyAssociation coll) {
     }
 
-    private static boolean canOverwrite(final Facet facet) {
-        return facet == null || facet.isFallback() || facet.isDerived();
+    private static boolean canOverwrite(final @Nullable Facet existingFacet) {
+        return existingFacet == null
+                || existingFacet.getPrecedence().isFallback()
+                || existingFacet.getPrecedence().isDerived();
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java
index aa07dea..25fad50 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java
@@ -268,7 +268,8 @@ public class DomainMemberDefault implements DomainMember {
     }
 
     private static String interpretFacet(final Facet facet) {
-        if (facet == null || facet.isFallback()) {
+        if (facet == null
+                || facet.getPrecedence().isFallback()) {
             return "";
         }
         if (facet instanceof ImperativeFacet) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
index b10e475..8a1a1f5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
@@ -366,7 +366,7 @@ class MetaModelExporter {
 
         final List<org.apache.isis.schema.metamodel.v2.Facet> facetList = facets.getFacet();
         facetHolder.streamFacets()
-        .filter(facet -> !facet.isFallback() || !config.isIgnoreNoop())
+        .filter(facet -> !facet.getPrecedence().isFallback() || !config.isIgnoreNoop())
         .map(facet -> asXsdType(facet, config))
         .forEach(facetList::add);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index e9640f5..8376cac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -554,8 +554,9 @@ public class FacetedMethodsBuilder {
      * @param method
      */
     private boolean isMixinMain(Method method) {
-        val mixinFacet = inspectedTypeSpec.getFacet(MixinFacet.class);
-        if(mixinFacet==null || mixinFacet.isFallback()) {
+        val mixinFacet = inspectedTypeSpec.lookupNonFallbackFacet(MixinFacet.class)
+                .orElse(null);
+        if(mixinFacet==null) {
             return false;
         }
         if(inspectedTypeSpec.isLessThan(IntrospectionState.FULLY_INTROSPECTED)) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index e02718a..90a9cde 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -424,7 +424,7 @@ implements ObjectAction {
     public Can<ManagedObject> getDefaults(final ManagedObject target) {
 
         val actionDefaultsFacet = getFacet(ActionDefaultsFacet.class);
-        if (!actionDefaultsFacet.isFallback()) {
+        if (!actionDefaultsFacet.getPrecedence().isFallback()) {
 
             // use the old defaultXxx approach
 
@@ -478,7 +478,7 @@ implements ObjectAction {
         final ActionChoicesFacet facet = getFacet(ActionChoicesFacet.class);
         val parameters = getParameters();
 
-        if (!facet.isFallback()) {
+        if (!facet.getPrecedence().isFallback()) {
             // using the old choicesXxx() approach
             paramChoicesVector = facet.getChoices(target,
                     interactionInitiatedBy);
@@ -502,7 +502,7 @@ implements ObjectAction {
                 val paramSpec = param.getSpecification();
                 val paramFacet = param.getFacet(ActionParameterChoicesFacet.class);
 
-                if (paramFacet != null && !paramFacet.isFallback()) {
+                if (paramFacet != null && !paramFacet.getPrecedence().isFallback()) {
 
                     val visibleChoices = paramFacet.getChoices(
                             paramSpec,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index c3ebae6..6cb7503 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -241,7 +241,7 @@ implements ObjectActionParameter, HasFacetHolder {
 
         val paramSpec = getSpecification();
         val defaultsFacet = getFacet(ActionParameterDefaultsFacet.class);
-        if (defaultsFacet != null && !defaultsFacet.isFallback()) {
+        if (defaultsFacet != null && !defaultsFacet.getPrecedence().isFallback()) {
             final Object paramValuePojo = defaultsFacet.getDefault(pendingArgs);
             return ManagedObjects.emptyToDefault(
                     !isOptional(),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 5e8d161..e58a6ee 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -572,7 +572,7 @@ implements ObjectSpecification {
             if(facet==null) {
                 return false;
             }
-            if(!facet.isFallback()) {
+            if(!facet.getPrecedence().isFallback()) {
                 return true;
             }
             if(noopFacet == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
index 9d0ca21..ff4801a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -219,11 +219,12 @@ implements OneToOneAssociation {
     // -- defaults
     @Override
     public ManagedObject getDefault(final ManagedObject ownerAdapter) {
-        PropertyDefaultFacet propertyDefaultFacet = getFacet(PropertyDefaultFacet.class);
+        PropertyDefaultFacet propertyDefaultFacet = lookupNonFallbackFacet(PropertyDefaultFacet.class)
+                .orElse(null);
         // if no default on the association, attempt to find a default on the
         // specification (eg an int should
         // default to 0).
-        if (propertyDefaultFacet == null || propertyDefaultFacet.isFallback()) {
+        if (propertyDefaultFacet == null) {
             propertyDefaultFacet = this.getSpecification().getFacet(PropertyDefaultFacet.class);
         }
         if (propertyDefaultFacet == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForConflictingOptionality.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForConflictingOptionality.java
index 8360a6f..dcfb841 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForConflictingOptionality.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForConflictingOptionality.java
@@ -57,7 +57,8 @@ public class MetaModelValidatorForConflictingOptionality {
             return false;
         }
         final boolean conflicting =
-                underlyingFacet != null && facet.isInvertedSemantics() != underlyingFacet.isInvertedSemantics();
+                underlyingFacet != null
+                && facet.getSemantics() != underlyingFacet.getSemantics();
         return conflicting;
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FacetAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FacetAbstractTest.java
index f59a49f..633fcc0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FacetAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FacetAbstractTest.java
@@ -31,7 +31,7 @@ public class FacetAbstractTest extends TestCase {
 
     public static class ConcreteFacet extends FacetAbstract {
         public ConcreteFacet(final Class<? extends Facet> facetType, final FacetHolder holder) {
-            super(facetType, holder, Derivation.NOT_DERIVED);
+            super(facetType, holder);
         }
 
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java
index 9e9c1d9..36e2bf4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java
@@ -95,7 +95,7 @@ public class TitleFacetViaMethodsFactoryTest extends AbstractFacetFactoryTest {
      * a none no-op implementation.
      */
     public void testTitleFacetMethodUsingToStringIsClassifiedAsANoop() {
-        assertTrue(new TitleFacetViaToStringMethod(null, facetedMethod).isFallback());
+        assertTrue(new TitleFacetViaToStringMethod(null, facetedMethod).getPrecedence().isFallback());
     }
 
     public void testNoExplicitTitleOrToStringMethod() {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/interactions/InteractionUtils_isA_Test.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/interactions/InteractionUtils_isA_Test.java
index 1e45b4b..d30ceaf 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/interactions/InteractionUtils_isA_Test.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/interactions/InteractionUtils_isA_Test.java
@@ -25,14 +25,15 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 
-import junit.framework.TestCase;
 import lombok.val;
 
+import junit.framework.TestCase;
+
 public class InteractionUtils_isA_Test extends TestCase {
 
     public class FooSuperFacet extends FacetAbstract {
         public FooSuperFacet(final Class<? extends Facet> facetType, final FacetHolder holder) {
-            super(facetType, holder, Derivation.NOT_DERIVED);
+            super(facetType, holder);
         }
     }
 
@@ -50,7 +51,7 @@ public class InteractionUtils_isA_Test extends TestCase {
 
     public class BarFacet extends FacetAbstract {
         public BarFacet(final FacetHolder holder) {
-            super(BarFacet.class, holder, Derivation.NOT_DERIVED);
+            super(BarFacet.class, holder);
         }
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
index f116e5d..3f92176 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
@@ -48,6 +48,8 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
+import lombok.val;
+
 public class ObjectAssociationAbstractTest_alwaysHidden {
 
     @Rule
@@ -213,16 +215,17 @@ public class ObjectAssociationAbstractTest_alwaysHidden {
             final Where where,
             final FacetedMethod holder,
             final boolean noop) {
-        HiddenFacet facet = new HiddenFacetAbstract(HiddenFacet.class, where, holder) {
+
+        val precedence = noop
+                ? Facet.Precedence.FALLBACK
+                : Facet.Precedence.DEFAULT;
+
+        HiddenFacet facet = new HiddenFacetAbstract(HiddenFacet.class, where, holder, precedence) {
+
             @Override
             protected String hiddenReason(final ManagedObject target, final Where whereContext) {
                 return null;
             }
-
-            @Override
-            public boolean isFallback() {
-                return noop;
-            }
         };
         FacetUtil.addFacet(facet);
     }
diff --git a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/facets/TenantedAuthorizationFacetDefault.java b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/facets/TenantedAuthorizationFacetDefault.java
index 977f159..f8d962f 100644
--- a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/facets/TenantedAuthorizationFacetDefault.java
+++ b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/facets/TenantedAuthorizationFacetDefault.java
@@ -51,7 +51,7 @@ public class TenantedAuthorizationFacetDefault extends FacetAbstract implements
             final Provider<QueryResultsCache> queryResultsCacheProvider,
             final UserService userService,
             final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
+        super(type(), holder);
         this.evaluators = evaluators;
         this.applicationUserRepository = applicationUserRepository;
         this.queryResultsCacheProvider = queryResultsCacheProvider;
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
index 9b0472b..187866f 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
@@ -74,7 +74,7 @@ implements EntityFacet {
 
     public JdoEntityFacet(
             final FacetHolder holder) {
-        super(EntityFacet.class, holder, Derivation.NOT_DERIVED);
+        super(EntityFacet.class, holder);
         super.setFacetAliasType(EntityFacet.class);
     }
 
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityFacetAbstract.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityFacetAbstract.java
index 4a309bb..006175b 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityFacetAbstract.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityFacetAbstract.java
@@ -39,7 +39,7 @@ JdoDatastoreIdentityFacet {
     private final IdGeneratorStrategy strategy;
 
     public JdoDatastoreIdentityFacetAbstract(IdGeneratorStrategy strategy, FacetHolder facetHolder) {
-        super(JdoDatastoreIdentityFacetAbstract.type(), facetHolder, Derivation.NOT_DERIVED);
+        super(JdoDatastoreIdentityFacetAbstract.type(), facetHolder);
         this.strategy = strategy;
     }
 
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetForJdoPersistenceCapableAnnotation.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetForJdoPersistenceCapableAnnotation.java
index ebb5e53..4cff330 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetForJdoPersistenceCapableAnnotation.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetForJdoPersistenceCapableAnnotation.java
@@ -36,7 +36,7 @@ extends LogicalTypeFacetAbstract {
             final Class<?> correspondingClass,
             final FacetHolder holder) {
 
-        if(persistenceCapableFacet.isFallback()) {
+        if(persistenceCapableFacet.getPrecedence().isFallback()) {
             return null;
         }
         final String schema = persistenceCapableFacet.getSchema();
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAnnotation.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAnnotation.java
index 22435f6..ed0584a 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAnnotation.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAnnotation.java
@@ -41,7 +41,7 @@ implements JdoPersistenceCapableFacet {
             final IdentityType identityType,
             final FacetHolder holder) {
 
-        super(JdoPersistenceCapableFacet.class, holder, Derivation.NOT_DERIVED);
+        super(JdoPersistenceCapableFacet.class, holder);
         super.setFacetAliasType(EntityFacet.class);
         this.schema = schemaName;
         this.table = tableOrTypeName;
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/JdoQueryFacetAbstract.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/JdoQueryFacetAbstract.java
index d3f2c3d..0bfaab9 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/JdoQueryFacetAbstract.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/JdoQueryFacetAbstract.java
@@ -49,7 +49,7 @@ implements JdoQueryFacet {
             final @NonNull FacetHolder holder,
             final @NonNull Can<Query> jdoNamedQueries) {
 
-        super(JdoQueryFacetAbstract.type(), holder, Derivation.NOT_DERIVED);
+        super(JdoQueryFacetAbstract.type(), holder);
 
         val objSpec = (ObjectSpecification) getFacetHolder();
         this.namedQueries = jdoNamedQueries.map(jdoNamedQuery->new JdoNamedQuery(jdoNamedQuery, objSpec));
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
index d13ebbe..4c3ed57 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -65,7 +65,8 @@ implements MetaModelRefiner {
                 .orElse(null);
 
         if (jdoColumnAnnotation == null) {
-            if(existingFacet != null && !existingFacet.isFallback()) {
+            if(existingFacet != null
+                    && !existingFacet.getPrecedence().isFallback()) {
                 // do nothing
             } else {
                 final BigDecimalValueFacet facet = new BigDecimalFacetFallback(holder);
@@ -78,7 +79,8 @@ implements MetaModelRefiner {
             // if there was an *explicit* value defined on the @Column annotation that is incompatible with existing.
             Integer existingLength = null;
             Integer existingScale = null;
-            if(existingFacet != null && !existingFacet.isFallback()) {
+            if(existingFacet != null
+                    && !existingFacet.getPrecedence().isFallback()) {
                 existingLength = existingFacet.getPrecision();
                 existingScale = existingFacet.getScale();
             }
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetDerivedFromJdoColumn.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetDerivedFromJdoColumn.java
index 2c2599c..632d84a 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetDerivedFromJdoColumn.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetDerivedFromJdoColumn.java
@@ -36,7 +36,7 @@ public class BigDecimalFacetDerivedFromJdoColumn extends BigDecimalValueFacetAbs
     }
 
     public BigDecimalFacetDerivedFromJdoColumn(final FacetHolder holder, final Integer precision, final Integer scale) {
-        super(BigDecimalFacetDerivedFromJdoColumn.type(), holder, Derivation.NOT_DERIVED);
+        super(BigDecimalFacetDerivedFromJdoColumn.type(), holder);
         this.precision = precision;
         this.scale = scale;
     }
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java
index 3c0f363..02f9c07 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java
@@ -32,7 +32,7 @@ public class BigDecimalFacetFallback extends BigDecimalValueFacetAbstract {
     }
 
     public BigDecimalFacetFallback(final FacetHolder holder) {
-        super(BigDecimalFacetFallback.type(), holder, Derivation.NOT_DERIVED);
+        super(BigDecimalFacetFallback.type(), holder);
     }
 
     @Override
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
index 7ba7c32..348a975 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
@@ -97,7 +97,8 @@ implements MetaModelRefiner {
         // however, if a @Column was explicitly provided, and the underlying facet
         // was the simple MandatoryFacetDefault (from an absence of @Optional or @Mandatory),
         // then don't chain, simply replace.
-        if(facet instanceof MandatoryFacetDerivedFromJdoColumn && facet.getUnderlyingFacet() instanceof MandatoryFacetDefault) {
+        if(facet instanceof MandatoryFacetDerivedFromJdoColumn
+                && facet.getUnderlyingFacet() instanceof MandatoryFacetDefault) {
             facet.setUnderlyingFacet(null);
         }
     }
@@ -148,14 +149,15 @@ implements MetaModelRefiner {
 
         if(facet instanceof MandatoryFacetDerivedFromJdoColumn) {
 
-            if(underlying.isInvertedSemantics() == facet.isInvertedSemantics()) {
+            if(underlying.getSemantics() == facet.getSemantics()) {
                 return;
             }
 
-            if(underlying.isInvertedSemantics()) {
+            if(underlying.getSemantics().isOptional()) {
                 // ie @Optional
                 ValidationFailure.raiseFormatted(
                         association,
+                        //TODO @Optional is history
                         "%s: incompatible usage of Isis' @Optional annotation and @javax.jdo.annotations.Column; use just @javax.jdo.annotations.Column(allowsNull=\"...\")",
                         association.getIdentifier().getFullIdentityString());
             } else {
@@ -168,13 +170,14 @@ implements MetaModelRefiner {
 
         if(facet instanceof MandatoryFacetInferredFromAbsenceOfJdoColumn) {
 
-            if(underlying.isInvertedSemantics() == facet.isInvertedSemantics()) {
+            if(underlying.getSemantics() == facet.getSemantics()) {
                 return;
             }
-            if(underlying.isInvertedSemantics()) {
+            if(underlying.getSemantics().isOptional()) {
                 // ie @Optional
                 ValidationFailure.raiseFormatted(
                         association,
+                        //TODO @Optional is history
                         "%s: incompatible usage of Isis' @Optional annotation and @javax.jdo.annotations.Column; use just @javax.jdo.annotations.Column(allowsNull=\"...\")",
                         association.getIdentifier().getFullIdentityString());
             } else {
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
index d6f86d5..22ea8a5 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -81,7 +81,7 @@ implements MetaModelRefiner {
 
         final MaxLengthFacet facet = new MaxLengthFacetDerivedFromJdoColumn(jdoColumnAnnotation.length(), holder);
 
-        if(!existingFacet.isFallback()) {
+        if(!existingFacet.getPrecedence().isFallback()) {
             // will raise violation later
             facet.setUnderlyingFacet(existingFacet);
         }
diff --git a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
index 0159d50..dfd4a04 100644
--- a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
+++ b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
@@ -30,7 +30,7 @@ import org.apache.isis.persistence.jdo.metamodel.testing.AbstractFacetFactoryTes
 
 import lombok.val;
 
-public class MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest 
+public class MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest
 extends AbstractFacetFactoryTest {
 
     private MandatoryFromJdoColumnAnnotationFacetFactory facetFactory;
@@ -67,7 +67,7 @@ extends AbstractFacetFactoryTest {
         final MandatoryFacet facet = facetedMethod.getFacet(MandatoryFacet.class);
         assertNotNull(facet);
         assertTrue(facet instanceof MandatoryFacetInferredFromAbsenceOfJdoColumn);
-        assertThat(facet.isInvertedSemantics(), is(false));
+        assertThat(facet.getSemantics().isOptional(), is(false));
     }
 
     public void testPrimitiveWithNoAllowsNull_isMandatory() throws Exception {
@@ -77,7 +77,7 @@ extends AbstractFacetFactoryTest {
         final MandatoryFacet facet = facetedMethod.getFacet(MandatoryFacet.class);
         assertNotNull(facet);
         assertTrue(facet instanceof MandatoryFacetDerivedFromJdoColumn);
-        assertThat(facet.isInvertedSemantics(), is(false));
+        assertThat(facet.getSemantics().isOptional(), is(false));
     }
 
     public void testPrimitiveWithAllowsNullFalse() throws Exception {
@@ -87,7 +87,7 @@ extends AbstractFacetFactoryTest {
         final MandatoryFacet facet = facetedMethod.getFacet(MandatoryFacet.class);
         assertNotNull(facet);
         assertTrue(facet instanceof MandatoryFacetDerivedFromJdoColumn);
-        assertThat(facet.isInvertedSemantics(), is(false));
+        assertThat(facet.getSemantics().isOptional(), is(false));
     }
 
     public void testPrimitiveWithAllowsNullTrue() throws Exception {
@@ -97,7 +97,7 @@ extends AbstractFacetFactoryTest {
         final MandatoryFacet facet = facetedMethod.getFacet(MandatoryFacet.class);
         assertNotNull(facet);
         assertTrue(facet instanceof MandatoryFacetDerivedFromJdoColumn);
-        assertThat(facet.isInvertedSemantics(), is(true));
+        assertThat(facet.getSemantics().isOptional(), is(true));
     }
 
     public void testReferenceWithNoAnnotation_isOptional() throws Exception {
@@ -107,7 +107,7 @@ extends AbstractFacetFactoryTest {
         final MandatoryFacet facet = facetedMethod.getFacet(MandatoryFacet.class);
         assertNotNull(facet);
         assertTrue(facet instanceof MandatoryFacetInferredFromAbsenceOfJdoColumn);
-        assertThat(facet.isInvertedSemantics(), is(true));
+        assertThat(facet.getSemantics().isOptional(), is(true));
     }
 
     public void testReferenceWithNoAllowsNull_isOptional() throws Exception {
@@ -117,7 +117,7 @@ extends AbstractFacetFactoryTest {
         final MandatoryFacet facet = facetedMethod.getFacet(MandatoryFacet.class);
         assertNotNull(facet);
         assertTrue(facet instanceof MandatoryFacetDerivedFromJdoColumn);
-        assertThat(facet.isInvertedSemantics(), is(true));
+        assertThat(facet.getSemantics().isOptional(), is(true));
     }
 
     public void testReferenceWithAllowsNullFalse() throws Exception {
@@ -127,7 +127,7 @@ extends AbstractFacetFactoryTest {
         final MandatoryFacet facet = facetedMethod.getFacet(MandatoryFacet.class);
         assertNotNull(facet);
         assertTrue(facet instanceof MandatoryFacetDerivedFromJdoColumn);
-        assertThat(facet.isInvertedSemantics(), is(false));
+        assertThat(facet.getSemantics().isOptional(), is(false));
     }
 
     public void testReferenceWithAllowsNullTrue() throws Exception {
@@ -137,7 +137,7 @@ extends AbstractFacetFactoryTest {
         final MandatoryFacet facet = facetedMethod.getFacet(MandatoryFacet.class);
         assertNotNull(facet);
         assertTrue(facet instanceof MandatoryFacetDerivedFromJdoColumn);
-        assertThat(facet.isInvertedSemantics(), is(true));
+        assertThat(facet.getSemantics().isOptional(), is(true));
     }
 
 }
diff --git a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java
index 7c2730a..47af4be 100644
--- a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java
@@ -43,6 +43,7 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.memento._Mementos;
 import org.apache.isis.commons.internal.memento._Mementos.SerializingAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -95,15 +96,11 @@ public class JpaEntityFacetFactory extends FacetFactoryAbstract {
                 final Class<?> entityClass,
                 final @NonNull ServiceRegistry serviceRegistry) {
 
-            super(EntityFacet.class, holder);
+            super(EntityFacet.class, holder, Facet.Precedence.EARLY);
             this.entityClass = entityClass;
             this.serviceRegistry = serviceRegistry;
         }
 
-        @Override public boolean isDerived() { return false;}
-        @Override public boolean isFallback() { return false;}
-        @Override public boolean alwaysReplace() { return true;}
-
         // -- ENTITY FACET
 
         @Override
diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java
index e04492b..6547e7c 100644
--- a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java
@@ -35,7 +35,7 @@ extends LogicalTypeFacetAbstract {
             final Class<?> correspondingClass,
             final FacetHolder holder) {
 
-        if(tableFacet.isFallback()) {
+        if(tableFacet.getPrecedence().isFallback()) {
             return null;
         }
         final String schema = tableFacet.getSchema();
diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableFacetAnnotationImpl.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableFacetAnnotationImpl.java
index c635eb6..a22a702 100644
--- a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableFacetAnnotationImpl.java
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableFacetAnnotationImpl.java
@@ -35,7 +35,7 @@ implements JpaTableFacetAnnotation {
             final String tableOrTypeName,
             final FacetHolder holder) {
 
-        super(JpaTableFacetAnnotation.class, holder, Derivation.NOT_DERIVED);
+        super(JpaTableFacetAnnotation.class, holder);
         this.schema = schemaName;
         this.tableOrTypeName = tableOrTypeName;
     }
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionParameterDescriptionReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionParameterDescriptionReprRenderer.java
index a3cae31..776973c 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionParameterDescriptionReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ActionParameterDescriptionReprRenderer.java
@@ -83,10 +83,9 @@ public class ActionParameterDescriptionReprRenderer extends AbstractTypeFeatureR
         representation.mapPut("name", getObjectFeature().getName());
         representation.mapPut("number", getObjectFeature().getNumber());
         representation.mapPut("optional", getObjectFeature().isOptional());
-        final MaxLengthFacet maxLength = getObjectFeature().getFacet(MaxLengthFacet.class);
-        if (maxLength != null && !maxLength.isFallback()) {
-            representation.mapPut("maxLength", maxLength.value());
-        }
+        getObjectFeature()
+            .lookupNonFallbackFacet(MaxLengthFacet.class)
+            .ifPresent(maxLengthFacet->representation.mapPut("maxLength", maxLengthFacet.value()));
     }
 
     @Override
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/PropertyDescriptionReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/PropertyDescriptionReprRenderer.java
index 0cc5a62..3375ccd 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/PropertyDescriptionReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/PropertyDescriptionReprRenderer.java
@@ -49,10 +49,9 @@ public class PropertyDescriptionReprRenderer extends AbstractTypeMemberReprRende
     @Override
     protected void addPropertiesSpecificToFeature() {
         representation.mapPut("optional", !getObjectFeature().isMandatory());
-        final MaxLengthFacet maxLength = getObjectFeature().getFacet(MaxLengthFacet.class);
-        if (maxLength != null && !maxLength.isFallback()) {
-            representation.mapPut("maxLength", maxLength.value());
-        }
+        getObjectFeature()
+            .lookupNonFallbackFacet(MaxLengthFacet.class)
+            .ifPresent(maxLengthFacet->representation.mapPut("maxLength", maxLengthFacet.value()));
     }
 
     private void addLinkToReturnTypeIfAny() {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanelFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanelFactory.java
index efc3bd8..077ef43 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanelFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanelFactory.java
@@ -36,7 +36,8 @@ public class StringPanelFactory extends ComponentFactoryScalarAbstract {
     @Override
     public Component createComponent(final String id, final ScalarModel scalarModel) {
         final MultiLineFacet multiLineFacet = scalarModel.getFacet(MultiLineFacet.class);
-        if (multiLineFacet != null && !multiLineFacet.isFallback()) {
+        if (multiLineFacet != null
+                && !multiLineFacet.getPrecedence().isFallback()) {
             return new MultiLineStringPanel(id, scalarModel);
         } else {
             return new StringPanel(id, scalarModel);