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

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

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);