You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/10/30 14:52:49 UTC

[isis] branch dev/2.0.0/ISIS-1632-meta-annotations updated: ISIS-1632: converts facet factories to support meta annotations ... code now compiles

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

danhaywood pushed a commit to branch dev/2.0.0/ISIS-1632-meta-annotations
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/dev/2.0.0/ISIS-1632-meta-annotations by this push:
     new a965887  ISIS-1632: converts facet factories to support meta annotations ... code now compiles
a965887 is described below

commit a965887aeaaad8ca42e733aa8300053b2e659d80
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Oct 30 14:52:21 2017 +0000

    ISIS-1632: converts facet factories to support meta annotations ... code now compiles
    
    but haven't tried unit tests yet, let alone integ tests etc..
    
    Also:
    - removed support for boolean flags in annotations, replaced with enums.  Need to review to ensure is complete.
---
 .../org/apache/isis/applib/annotation/Action.java  |  8 +-
 .../isis/applib/annotation/ActionLayout.java       |  9 ++-
 .../isis/applib/annotation/BookmarkPolicy.java     |  7 +-
 .../apache/isis/applib/annotation/Collection.java  | 11 +--
 .../apache/isis/applib/annotation/Contributed.java |  8 +-
 .../isis/applib/annotation/DomainObject.java       |  2 +-
 .../isis/applib/annotation/DomainObjectLayout.java |  2 +-
 .../applib/annotation/DomainServiceLayout.java     |  5 +-
 .../apache/isis/applib/annotation/InvokeOn.java    |  7 +-
 .../isis/applib/annotation/LabelPosition.java      |  7 +-
 .../{InvokeOn.java => MementoSerialization.java}   | 25 +++---
 .../apache/isis/applib/annotation/Optionality.java |  7 +-
 .../apache/isis/applib/annotation/PromptStyle.java |  7 +-
 .../apache/isis/applib/annotation/Property.java    | 12 +--
 .../isis/applib/annotation/PropertyLayout.java     | 13 ++-
 .../{BookmarkPolicy.java => RenderDayPolicy.java}  | 22 +++---
 .../{BookmarkPolicy.java => Repainting.java}       | 22 +++---
 .../apache/isis/applib/annotation/SemanticsOf.java |  7 +-
 .../isis/applib/annotation/ViewModelLayout.java    |  2 +-
 .../layout/component/PropertyLayoutData.java       | 44 +++++++++--
 ...ropertyLayoutData_renderedAsDayBefore_Test.java | 75 ++++++++++++++++++
 .../component/PropertyLayoutData_repaint_Test.java | 75 ++++++++++++++++++
 .../action/ActionAnnotationFacetFactory.java       | 48 ++++++-----
 .../action/bulk/BulkFacetForActionAnnotation.java  | 20 +++--
 .../hidden/HiddenFacetForActionAnnotation.java     | 17 ++--
 .../ActionSemanticsFacetForActionAnnotation.java   | 21 ++---
 .../actions/layout/ActionLayoutFacetFactory.java   | 22 +++---
 ...tionPositionFacetForActionLayoutAnnotation.java | 17 ++--
 ...okmarkPolicyFacetForActionLayoutAnnotation.java | 28 +++++--
 .../CssClassFaFacetForActionLayoutAnnotation.java  | 24 ++++--
 .../CssClassFacetForActionLayoutAnnotation.java    | 20 +++--
 .../DescribedAsFacetForActionLayoutAnnotation.java | 18 +++--
 .../HiddenFacetForActionLayoutAnnotation.java      | 18 +++--
 .../NamedFacetForActionLayoutAnnotation.java       | 20 +++--
 ...tContributedFacetForActionLayoutAnnotation.java | 24 +++---
 .../PromptStyleFacetForActionLayoutAnnotation.java | 63 ++++++++-------
 .../CollectionAnnotationFacetFactory.java          | 60 +++++++-------
 .../DisabledFacetForCollectionAnnotation.java      | 41 +++++-----
 .../hidden/HiddenFacetForCollectionAnnotation.java | 20 +++--
 .../NotPersistedFacetForCollectionAnnotation.java  | 30 ++++---
 ...fFacetOnCollectionFromCollectionAnnotation.java | 24 +++---
 ...aultViewFacetForCollectionLayoutAnnotation.java | 19 +++--
 .../PagedFacetForCollectionLayoutAnnotation.java   | 16 ++--
 ...SortedByFacetForCollectionLayoutAnnotation.java | 24 +++---
 .../jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java   |  4 +-
 .../DomainObjectAnnotationFacetFactory.java        |  4 +-
 ...ssClassFaFacetForViewModelLayoutAnnotation.java | 22 ++++--
 ...sClassFacetForDomainObjectLayoutAnnotation.java |  3 -
 ...mainObjectLayoutAnnotationUsingIconUiEvent.java | 41 +++++-----
 .../NamedFacetForDomainObjectLayoutAnnotation.java | 18 +++--
 .../NamedFacetForViewModelLayoutAnnotation.java    | 23 ++++--
 .../PluralFacetForViewModelLayoutAnnotation.java   | 15 ++--
 ...ainObjectLayoutAnnotationUsingTitleUiEvent.java |  4 +-
 .../DomainServiceFacetAnnotationFactory.java       |  2 +-
 .../DomainServiceLayoutFacetFactory.java           | 28 ++++---
 ...NamedFacetForDomainServiceLayoutAnnotation.java | 20 +++--
 ...ValueFacetAnnotationOrConfigurationFactory.java |  2 +-
 .../MustSatisfySpecificationFacetAbstract.java     |  4 +-
 .../property/PropertyAnnotationFacetFactory.java   | 92 ++++++++++------------
 .../command/CommandFacetForPropertyAnnotation.java | 59 ++++++++------
 .../DisabledFacetForPropertyAnnotation.java        | 50 ++++++------
 .../FileAcceptFacetForPropertyAnnotation.java      | 22 +++---
 .../hidden/HiddenFacetForPropertyAnnotation.java   | 24 +++---
 .../MandatoryFacetForPropertyAnnotation.java       | 38 +++++----
 .../MaxLengthFacetForPropertyAnnotation.java       | 17 ++--
 ...sfySpecificationFacetForPropertyAnnotation.java | 32 ++++----
 .../NotPersistedFacetForPropertyAnnotation.java    | 21 +++--
 ...ublishedPropertyFacetForPropertyAnnotation.java | 53 ++++++++-----
 .../RegExFacetForPatternAnnotationOnProperty.java  | 21 ++---
 .../regex/RegExFacetForPropertyAnnotation.java     | 22 +++---
 .../CssClassFacetForPropertyLayoutAnnotation.java  | 20 +++--
 ...escribedAsFacetForPropertyLayoutAnnotation.java | 20 +++--
 .../HiddenFacetForPropertyLayoutAnnotation.java    | 18 +++--
 .../LabelAtFacetForPropertyLayoutAnnotation.java   | 18 +++--
 .../MultiLineFacetForPropertyLayoutAnnotation.java | 17 ++--
 .../NamedFacetForPropertyLayoutAnnotation.java     | 18 +++--
 ...romptStyleFacetForPropertyLayoutAnnotation.java | 69 ++++++++--------
 .../propertylayout/PropertyLayoutFacetFactory.java | 45 +++++------
 ...edAdjustedFacetForPropertyLayoutAnnotation.java | 27 +++++--
 ...icalLengthFacetForPropertyLayoutAnnotation.java | 18 +++--
 ...UnchangingFacetForPropertyLayoutAnnotation.java | 30 +++++--
 ...JdoDatastoreIdentityAnnotationFacetFactory.java |  2 +-
 .../JdoDiscriminatorAnnotationFacetFactory.java    |  2 +-
 .../query/JdoQueryAnnotationFacetFactory.java      |  4 +-
 .../JdoPrimaryKeyAnnotationFacetFactory.java       |  2 +-
 ...stedAnnotationOnCollectionFacetFactoryTest.java |  3 +-
 ...oicesFacetFromBoundedAnnotationFactoryTest.java |  3 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |  5 +-
 ...romptStyleFacetFromPropertyAnnotation_Test.java | 14 ++--
 ...sistedAnnotationOnPropertyFacetFactoryTest.java |  3 +-
 .../PropertyAnnotationFacetFactoryTest.java        |  5 +-
 ...acetForPropertyLayoutAnnotationFactoryTest.java |  6 +-
 ...acetForPropertyLayoutAnnotationFactoryTest.java |  9 ++-
 ...ionParameterAbstractTest_getId_and_getName.java |  8 +-
 .../scenarios/DomainServiceProviderMockery.java    |  3 +-
 95 files changed, 1210 insertions(+), 771 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
index 11ab9f8..822c4d7 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
@@ -93,7 +93,7 @@ public @interface Action {
      * {@link SemanticsOf#IDEMPOTENT idempotent} or
      * {@link SemanticsOf#NON_IDEMPOTENT non-idempotent}.
      */
-    SemanticsOf semantics() default SemanticsOf.NON_IDEMPOTENT;
+    SemanticsOf semantics() default SemanticsOf.NOT_SPECIFIED;
 
 
     // //////////////////////////////////////
@@ -116,7 +116,7 @@ public @interface Action {
      * Has no meaning if annotated on an action of a domain service.
      * </p>
      */
-    InvokeOn invokeOn() default InvokeOn.OBJECT_ONLY;
+    InvokeOn invokeOn() default InvokeOn.NOT_SPECIFIED;
 
     // //////////////////////////////////////
 
@@ -151,11 +151,11 @@ public @interface Action {
      * Whether the action invocation should be published.
      *
      * <p>
-     * Requires that an implementation of the {@link org.apache.isis.applib.services.publish.PublishingService}
+     * Requires that an implementation of the {@link org.apache.isis.applib.services.publish.PublisherService}
      * or {@link org.apache.isis.applib.services.publish.PublisherService} is registered with the framework.
      * </p>
      */
-    Publishing publishing() default Publishing.AS_CONFIGURED;
+    Publishing publishing() default Publishing.NOT_SPECIFIED;
 
 
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
index 67f54b1..d55fb33 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
@@ -45,7 +45,7 @@ public @interface ActionLayout {
      *     identically).
      * </p>
      */
-    BookmarkPolicy bookmarking() default BookmarkPolicy.NEVER;
+    BookmarkPolicy bookmarking() default BookmarkPolicy.NOT_SPECIFIED;
 
     // //////////////////////////////////////
 
@@ -112,7 +112,7 @@ public @interface ActionLayout {
      * Ignored if the action has not been associated with a property.
      * </p>
      */
-    Position position() default Position.BELOW;
+    Position position() default Position.NOT_SPECIFIED;
 
     @XmlType(
             namespace = "http://isis.apache.org/applib/layout/component"
@@ -121,7 +121,8 @@ public @interface ActionLayout {
         BELOW,
         RIGHT,
         PANEL,
-        PANEL_DROPDOWN
+        PANEL_DROPDOWN,
+        NOT_SPECIFIED
     }
 
     /**
@@ -142,7 +143,7 @@ public @interface ActionLayout {
      *     Has no meaning for actions of domain entities.
      * </p>
      */
-    Contributed contributed() default Contributed.AS_BOTH;
+    Contributed contributed() default Contributed.NOT_SPECIFIED;
 
 
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
index 70e810e..143e41c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
@@ -36,5 +36,10 @@ public enum BookmarkPolicy {
     /**
      * An unimportant entity that should never be bookmarked.
      */
-    NEVER
+    NEVER,
+    /**
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
+     */
+    NOT_SPECIFIED
 }
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java
index a9085b0..36b9fca 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java
@@ -70,7 +70,7 @@ public @interface Collection {
     /**
      * Indicates when the collection is not visible to the user.
      */
-    Where hidden() default Where.NOWHERE;
+    Where hidden() default Where.NOT_SPECIFIED;
 
 
     // //////////////////////////////////////
@@ -82,7 +82,7 @@ public @interface Collection {
      *     Note that non-editable objects can nevertheless have actions invoked upon them.
      * </p>
      */
-    Editing editing() default Editing.AS_CONFIGURED;
+    Editing editing() default Editing.NOT_SPECIFIED;
 
     /**
      * If {@link #editing()} is set to {@link Editing#DISABLED},
@@ -95,13 +95,14 @@ public @interface Collection {
 
 
     /**
-     * Indicates that the collection should be excluded from snapshots.
+     * Indicates whether the collecion should be included or excluded from mementos.
      *
      * <p>
-     *     To ensure that the collection is actually not persisted in the objectstore, also annotate with {@link NotPersistent}.
+     *     To ensure that the collection is actually not persisted in the objectstore, also annotate with the JDO annotation {@link NotPersistent}.
      * </p>
      */
-    boolean notPersisted() default false;
+    MementoSerialization mementoSerialization() default MementoSerialization.NOT_SPECIFIED;
+
 
 
     // //////////////////////////////////////
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
index f0f39b3..476bfd3 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
@@ -46,6 +46,10 @@ public enum Contributed {
     /**
      * The action is not contributed as either an action or as an association.
      */
-    AS_NEITHER;
-
+    AS_NEITHER,
+    /**
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
+     */
+    NOT_SPECIFIED
 }
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
index e509b34..849ecb1 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
@@ -48,7 +48,7 @@ public @interface DomainObject {
      * registered with the framework.
      * </p>
      */
-    Auditing auditing() default Auditing.AS_CONFIGURED;
+    Auditing auditing() default Auditing.NOT_SPECIFIED;
 
 
     // //////////////////////////////////////
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
index 377efdf..d0ffd85 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
@@ -141,6 +141,6 @@ s     */
     /**
      * Whether (and how) this domain object can be bookmarked in the UI.
      */
-    BookmarkPolicy bookmarking() default BookmarkPolicy.NEVER;
+    BookmarkPolicy bookmarking() default BookmarkPolicy.NOT_SPECIFIED;
 
 }
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainServiceLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainServiceLayout.java
index d79d007..576b0eb 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainServiceLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainServiceLayout.java
@@ -45,13 +45,14 @@ public @interface DomainServiceLayout {
     public enum MenuBar {
         PRIMARY,
         SECONDARY,
-        TERTIARY
+        TERTIARY,
+        NOT_SPECIFIED
     }
 
     /**
      * The menubar in which the menu that holds this service's actions should reside.
      */
-    MenuBar menuBar() default MenuBar.PRIMARY;
+    MenuBar menuBar() default MenuBar.NOT_SPECIFIED;
 
     /**
      * Number in Dewey Decimal format representing the order.
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/InvokeOn.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/InvokeOn.java
index bdab88d..8e17153 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/InvokeOn.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/InvokeOn.java
@@ -41,6 +41,11 @@ public enum InvokeOn {
      *     Corresponds to (the deprecated) <code>@Bulk(appliesTo=BULK_ONLY)</code> annotation.
      * </p>
      */
-    COLLECTION_ONLY;
+    COLLECTION_ONLY,
+    /**
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
+     */
+    NOT_SPECIFIED
 
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
index 102aa36..e443c4a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
@@ -39,5 +39,10 @@ public enum LabelPosition {
      */
     RIGHT,
     TOP,
-    NONE
+    NONE,
+    /**
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
+     */
+    NOT_SPECIFIED
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/InvokeOn.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/MementoSerialization.java
similarity index 58%
copy from core/applib/src/main/java/org/apache/isis/applib/annotation/InvokeOn.java
copy to core/applib/src/main/java/org/apache/isis/applib/annotation/MementoSerialization.java
index bdab88d..9f79818 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/InvokeOn.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/MementoSerialization.java
@@ -19,28 +19,25 @@
 package org.apache.isis.applib.annotation;
 
 /**
- * Whether an action can be invoked on a single object and/or on many objects in a collection.
+ * Whether the property or collection is included if the domain object is serialized into a memento.
  */
-public enum InvokeOn {
+public enum MementoSerialization {
     /**
-     * The action can only be invoked on a single object.  This is the default.
+     * Property or collection is included in any mementos.
+     * This is the fallback/default if not explicitly excluded.
      */
-    OBJECT_ONLY,
+    INCLUDED,
     /**
-     * The action can be invoked either on a single object or on a collection of objects (each in turn).
+     * Property or collection's state is excluded from any mementos.
      *
      * <p>
-     *     Corresponds to (the deprecated) <code>@Bulk(appliesTo=BULK_AND_REGULAR)</code> annotation.
+     *     Corresponds to <tt>@Property(notPersisted=true)</tt> or <tt>@Collection(notPersisted=true)</tt> prior to Isis 2.x
      * </p>
      */
-    OBJECT_AND_COLLECTION,
+    EXCLUDED,
     /**
-     * The action is intended to be invoked only on a collection of objects (each in turn).
-     *
-     * <p>
-     *     Corresponds to (the deprecated) <code>@Bulk(appliesTo=BULK_ONLY)</code> annotation.
-     * </p>
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
      */
-    COLLECTION_ONLY;
-
+    NOT_SPECIFIED
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Optionality.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Optionality.java
index d1edccb..e3efad5 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Optionality.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Optionality.java
@@ -53,5 +53,10 @@ public enum Optionality {
      * is unable to do so.
      * </p>
      */
-    MANDATORY
+    MANDATORY,
+    /**
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
+     */
+    NOT_SPECIFIED
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
index 175c763..57cf057 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
@@ -62,7 +62,12 @@ public enum PromptStyle {
      * </p>
      *
      */
-    INLINE_AS_IF_EDIT;
+    INLINE_AS_IF_EDIT,
+    /**
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
+     */
+    NOT_SPECIFIED;
 
     public boolean isDialog() { return this == DIALOG; }
     public boolean isInline() { return this == INLINE; }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
index e7bd6fb..77081a1 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
@@ -74,7 +74,7 @@ public @interface Property {
     /**
      * Indicates where the property is not visible to the user.
      */
-    Where hidden() default Where.NOWHERE;
+    Where hidden() default Where.NOT_SPECIFIED;
 
 
 
@@ -102,7 +102,7 @@ public @interface Property {
     /**
      * Whether the property edit should be reified into a {@link org.apache.isis.applib.services.command.Command} object.
      */
-    CommandReification command() default CommandReification.AS_CONFIGURED;
+    CommandReification command() default CommandReification.NOT_SPECIFIED;
 
     /**
      * How the {@link org.apache.isis.applib.services.command.Command Command} object provided by the
@@ -131,7 +131,7 @@ public @interface Property {
      * or {@link org.apache.isis.applib.services.publish.PublisherService} is registered with the framework.
      * </p>
      */
-    Publishing publishing() default Publishing.AS_CONFIGURED;
+    Publishing publishing() default Publishing.NOT_SPECIFIED;
 
 
 
@@ -163,13 +163,13 @@ public @interface Property {
     // //////////////////////////////////////
 
     /**
-     * Indicates that the property should be excluded from snapshots.
+     * Indicates whether the property should be included or excluded from mementos.
      *
      * <p>
-     *     To ensure that the property is actually not persisted in the objectstore, also annotate with {@link NotPersistent}.
+     *     To ensure that the property is actually not persisted in the objectstore, also annotate with the JDO annotation {@link NotPersistent}.
      * </p>
      */
-    boolean notPersisted() default false;
+    MementoSerialization mementoSerialization() default MementoSerialization.NOT_SPECIFIED;
 
 
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
index d719648..36edb5e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
@@ -54,7 +54,7 @@ public @interface PropertyLayout {
      * If not specified, the default depends upon the property value's datatype.
      * </p>
      */
-    LabelPosition labelPosition() default LabelPosition.LEFT;
+    LabelPosition labelPosition() default LabelPosition.NOT_SPECIFIED;
 
     /**
      * For string properties (and parameters), render as a text area over specified number of lines.
@@ -74,7 +74,7 @@ public @interface PropertyLayout {
     /**
      * How the properties of this domain object are be edited, either {@link PromptStyle#DIALOG dialog} or {@link PromptStyle#INLINE inline}.
      */
-    PromptStyle promptStyle() default PromptStyle.AS_CONFIGURED;
+    PromptStyle promptStyle() default PromptStyle.NOT_SPECIFIED;
 
     /**
      * For date properties (and parameters) only, instructs the viewer that the date should be rendered as one day
@@ -101,8 +101,7 @@ public @interface PropertyLayout {
      * In the domain object, itself, however, the value stored is 1-jun-2013.
      * </p>
      */
-    boolean renderedAsDayBefore() default false;
-
+    RenderDayPolicy renderDay() default RenderDayPolicy.NOT_SPECIFIED;
 
     /**
      * The typical entry length of a field, use to determine the optimum width for display
@@ -114,8 +113,8 @@ public @interface PropertyLayout {
      * do change.
      *
      * <p>
-     *     Setting this attribute to <tt>true</tt> is used as a hint to the viewer to not redraw the property
-     *     after an AJAX update of some other property/ies of the object have changed.
+     *     Setting this attribute to <tt>RepaintPolicy.NO_REPAINT</tt> is used as a hint to the viewer to not repaint
+     *     the property after an AJAX update of some other property/ies of the object have changed.
      *     This is primarily for performance, eg can improve the user experience when rendering PDFs/blobs.
      * </p>
      *
@@ -131,7 +130,7 @@ public @interface PropertyLayout {
      *     within the framework than simply a hint for rendering.
      * </p>
      */
-    boolean unchanging() default false;
+    Repainting repainting() default Repainting.NOT_SPECIFIED;
 
 }
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderDayPolicy.java
similarity index 74%
copy from core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
copy to core/applib/src/main/java/org/apache/isis/applib/annotation/RenderDayPolicy.java
index 70e810e..ba5201c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderDayPolicy.java
@@ -16,25 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.applib.annotation;
 
 import javax.xml.bind.annotation.XmlType;
 
+/**
+ * How to render days.
+ */
 @XmlType(
         namespace = "http://isis.apache.org/applib/layout/component"
 )
-public enum BookmarkPolicy {
-    /**
-     * Can be bookmarked, and is a top-level 'root' (or parent) bookmark.
-     */
-    AS_ROOT,
+public enum RenderDayPolicy {
+    AS_DAY,
     /**
-     * Can be bookmarked, but only as a child or some other parent/root bookmark
+     * Equivalent to <tt>@PropertyLayout(renderAsDayBefore=true)</tt> prior to Isis 2.x
      */
-    AS_CHILD,
+    AS_DAY_BEFORE,
     /**
-     * An unimportant entity that should never be bookmarked.
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
      */
-    NEVER
-}
\ No newline at end of file
+    NOT_SPECIFIED;
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Repainting.java
similarity index 72%
copy from core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
copy to core/applib/src/main/java/org/apache/isis/applib/annotation/Repainting.java
index 70e810e..ea05fec 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Repainting.java
@@ -16,25 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.applib.annotation;
 
 import javax.xml.bind.annotation.XmlType;
 
+/**
+ * Whether a component is unchanging and so does not require repainting.
+ */
 @XmlType(
         namespace = "http://isis.apache.org/applib/layout/component"
 )
-public enum BookmarkPolicy {
-    /**
-     * Can be bookmarked, and is a top-level 'root' (or parent) bookmark.
-     */
-    AS_ROOT,
+public enum Repainting {
+    REPAINT,
     /**
-     * Can be bookmarked, but only as a child or some other parent/root bookmark
+     * Equivalent to <tt>@PropertyLayout(unchanging=true)</tt> prior to Isis 2.x
      */
-    AS_CHILD,
+    NO_REPAINT,
     /**
-     * An unimportant entity that should never be bookmarked.
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
      */
-    NEVER
-}
\ No newline at end of file
+    NOT_SPECIFIED
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java
index e834736..fcf1a08 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java
@@ -66,7 +66,12 @@ public enum SemanticsOf {
      * <p>
      * An example is increasing the quantity of a line item in an Order by 1.
      */
-    NON_IDEMPOTENT_ARE_YOU_SURE;
+    NON_IDEMPOTENT_ARE_YOU_SURE,
+    /**
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
+     */
+    NOT_SPECIFIED;
 
     public String getFriendlyName() {
         return Enums.getFriendlyNameOf(this);
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModelLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModelLayout.java
index 5f2daff..1514201 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModelLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModelLayout.java
@@ -120,6 +120,6 @@ public @interface ViewModelLayout {
     /**
      * Whether (and how) this domain object can be bookmarked in the UI.
      */
-    BookmarkPolicy bookmarking() default BookmarkPolicy.NEVER;
+    BookmarkPolicy bookmarking() default BookmarkPolicy.NOT_SPECIFIED;
 
 }
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
index 3e6cad5..5eb4e46 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
@@ -31,6 +31,8 @@ import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.annotation.RenderDayPolicy;
+import org.apache.isis.applib.annotation.Repainting;
 import org.apache.isis.applib.annotation.Where;
 
 /**
@@ -186,15 +188,31 @@ public class PropertyLayoutData
 
 
 
-    private Boolean renderedAsDayBefore;
-
+    /**
+     * @deprecated - use {@link #getRenderDay()} instead.
+     */
+    @Deprecated
     @XmlAttribute(required = false)
     public Boolean getRenderedAsDayBefore() {
-        return renderedAsDayBefore;
+        return getRenderDay() != null ? getRenderDay() == RenderDayPolicy.AS_DAY_BEFORE : null;
     }
 
     public void setRenderedAsDayBefore(Boolean renderedAsDayBefore) {
-        this.renderedAsDayBefore = renderedAsDayBefore;
+        if(getRenderDay() == null && renderedAsDayBefore != null) {
+            setRenderDay(renderedAsDayBefore ? RenderDayPolicy.AS_DAY_BEFORE : RenderDayPolicy.AS_DAY);
+        }
+    }
+
+
+    private RenderDayPolicy renderDay;
+
+    @XmlAttribute(required = false)
+    public RenderDayPolicy getRenderDay() {
+        return renderDay;
+    }
+
+    public void setRenderDay(final RenderDayPolicy renderDay) {
+        this.renderDay = renderDay;
     }
 
 
@@ -210,18 +228,28 @@ public class PropertyLayoutData
     }
 
 
-    private Boolean unchanging;
-
     @XmlAttribute(required = false)
     public Boolean getUnchanging() {
-        return unchanging;
+        return getRepainting() != null ? getRepainting() == Repainting.NO_REPAINT : null;
     }
 
     public void setUnchanging(Boolean unchanging) {
-        this.unchanging = unchanging;
+        if(getRepainting() == null && unchanging != null) {
+            setRepainting(unchanging ? Repainting.NO_REPAINT : Repainting.REPAINT);
+        }
     }
 
 
+    private Repainting repainting;
+
+    @XmlAttribute(required = false)
+    public Repainting getRepainting() {
+        return repainting;
+    }
+
+    public void setRepainting(final Repainting repainting) {
+        this.repainting = repainting;
+    }
 
     private List<ActionLayoutData> actions = Lists.newArrayList();
 
diff --git a/core/applib/src/test/java/org/apache/isis/applib/layout/component/PropertyLayoutData_renderedAsDayBefore_Test.java b/core/applib/src/test/java/org/apache/isis/applib/layout/component/PropertyLayoutData_renderedAsDayBefore_Test.java
new file mode 100644
index 0000000..3c19cca
--- /dev/null
+++ b/core/applib/src/test/java/org/apache/isis/applib/layout/component/PropertyLayoutData_renderedAsDayBefore_Test.java
@@ -0,0 +1,75 @@
+package org.apache.isis.applib.layout.component;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.applib.annotation.RenderDayPolicy;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class PropertyLayoutData_renderedAsDayBefore_Test {
+
+    PropertyLayoutData data;
+    @Before
+    public void setUp() throws Exception {
+        data = new PropertyLayoutData();
+
+        assertThat(data.getRenderedAsDayBefore(), is(nullValue()));
+        assertThat(data.getRenderDay(), is(nullValue()));
+    }
+
+    @Test
+    public void derive_from_setRenderedAsDayBefore_TRUE_when_null() throws Exception {
+
+        // when
+        data.setRenderedAsDayBefore(true);
+
+        // then
+        assertThat(data.getRenderDay(), is(RenderDayPolicy.AS_DAY_BEFORE));
+        assertThat(data.getRenderedAsDayBefore(), is(true));
+
+    }
+
+    @Test
+    public void derive_from_setRenderedAsDayBefore_FALSE_when_null() throws Exception {
+
+        // when
+        data.setRenderedAsDayBefore(false);
+
+        // then
+        assertThat(data.getRenderDay(), is(RenderDayPolicy.AS_DAY));
+        assertThat(data.getRenderedAsDayBefore(), is(false));
+
+    }
+
+    @Test
+    public void ignore_from_setRenderedAsDayBefore_once_set_to_DAY_BEFORE() throws Exception {
+
+        // given
+        data.setRenderDay(RenderDayPolicy.AS_DAY_BEFORE);
+
+        // when
+        data.setRenderedAsDayBefore(false);
+
+        // then (ignored)
+        assertThat(data.getRenderDay(), is(RenderDayPolicy.AS_DAY_BEFORE));
+        assertThat(data.getRenderedAsDayBefore(), is(true));
+    }
+
+    @Test
+    public void ignore_from_setRenderedAsDayBefore_once_set_to_DAY() throws Exception {
+
+        // given
+        data.setRenderDay(RenderDayPolicy.AS_DAY);
+
+        // when
+        data.setRenderedAsDayBefore(true);
+
+        // then (ignored)
+        assertThat(data.getRenderDay(), is(RenderDayPolicy.AS_DAY));
+        assertThat(data.getRenderedAsDayBefore(), is(false));
+    }
+
+}
\ No newline at end of file
diff --git a/core/applib/src/test/java/org/apache/isis/applib/layout/component/PropertyLayoutData_repaint_Test.java b/core/applib/src/test/java/org/apache/isis/applib/layout/component/PropertyLayoutData_repaint_Test.java
new file mode 100644
index 0000000..c9883dd
--- /dev/null
+++ b/core/applib/src/test/java/org/apache/isis/applib/layout/component/PropertyLayoutData_repaint_Test.java
@@ -0,0 +1,75 @@
+package org.apache.isis.applib.layout.component;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.applib.annotation.Repainting;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class PropertyLayoutData_repaint_Test {
+
+    PropertyLayoutData data;
+    @Before
+    public void setUp() throws Exception {
+        data = new PropertyLayoutData();
+
+        assertThat(data.getUnchanging(), is(nullValue()));
+        assertThat(data.getRepainting(), is(nullValue()));
+    }
+
+    @Test
+    public void derive_from_setUnchanging_TRUE_when_null() throws Exception {
+
+        // when
+        data.setUnchanging(true);
+
+        // then
+        assertThat(data.getRepainting(), is(Repainting.NO_REPAINT));
+        assertThat(data.getUnchanging(), is(true));
+
+    }
+
+    @Test
+    public void derive_from_setUnchanging_FALSE_when_null() throws Exception {
+
+        // when
+        data.setUnchanging(false);
+
+        // then
+        assertThat(data.getRepainting(), is(Repainting.REPAINT));
+        assertThat(data.getUnchanging(), is(false));
+
+    }
+
+    @Test
+    public void ignore_from_setUnchanging_once_set_to_NO_REPAINT() throws Exception {
+
+        // given
+        data.setRepainting(Repainting.NO_REPAINT);
+
+        // when
+        data.setUnchanging(false);
+
+        // then (ignored)
+        assertThat(data.getRepainting(), is(Repainting.NO_REPAINT));
+        assertThat(data.getUnchanging(), is(true));
+    }
+
+    @Test
+    public void ignore_from_setUnchanging_once_set_to_REPAINT() throws Exception {
+
+        // given
+        data.setRepainting(Repainting.REPAINT);
+
+        // when
+        data.setUnchanging(true);
+
+        // then (ignored)
+        assertThat(data.getRepainting(), is(Repainting.REPAINT));
+        assertThat(data.getUnchanging(), is(false));
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 6d41b6a..8d59844 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -102,24 +102,21 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             // Set up ActionDomainEventFacet, which will act as the hiding/disabling/validating advisor
             //
             final List<Action> actions = Annotations.getAnnotations(actionMethod, Action.class);
-            final Class<? extends ActionDomainEvent<?>> actionDomainEventType;
 
-            final ActionDomainEventFacetAbstract actionDomainEventFacet;
+            // search for @Action(domainEvent=...), else use the default event type
+            final ActionDomainEventFacetAbstract actionDomainEventFacet =
+                    actions.stream()
+                    .map(Action::domainEvent)
+                    .filter(domainEvent -> domainEvent != ActionDomainEvent.Default.class)
+                    .findFirst()
+                    .map(domainEvent ->
+                            (ActionDomainEventFacetAbstract) new ActionDomainEventFacetForActionAnnotation(
+                                    domainEvent, servicesInjector, getSpecificationLoader(), holder))
+                    .orElse(
+                            new ActionDomainEventFacetDefault(
+                                    ActionDomainEvent.Default.class, servicesInjector, getSpecificationLoader(), holder)
+                    );
 
-
-
-            // search for @Action(domainEvent=...)
-            if(actions != null) {
-                actionDomainEventType = actions.domainEvent();
-                actionDomainEventFacet = new ActionDomainEventFacetForActionAnnotation(
-                        actionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
-            } else
-            // else use default event type
-            {
-                actionDomainEventType = ActionDomainEvent.Default.class;
-                actionDomainEventFacet = new ActionDomainEventFacetDefault(
-                        actionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
-            }
             if(EventUtil.eventTypeIsPostable(
                     actionDomainEventFacet.getEventType(),
                     ActionDomainEvent.Noop.class,
@@ -132,16 +129,16 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             // emit the appropriate domain event and then delegate onto the underlying
 
             final ActionInvocationFacetForDomainEventAbstract actionInvocationFacet;
-            if (actions != null) {
+            if (actionDomainEventFacet instanceof ActionDomainEventFacetForActionAnnotation) {
                 actionInvocationFacet = new ActionInvocationFacetForDomainEventFromActionAnnotation(
-                        actionDomainEventType, actionMethod, typeSpec, returnSpec, holder,
+                        actionDomainEventFacet.getEventType(), actionMethod, typeSpec, returnSpec, holder,
                         servicesInjector
                 );
             } else
             // default
             {
                 actionInvocationFacet = new ActionInvocationFacetForDomainEventFromDefault(
-                        actionDomainEventType, actionMethod, typeSpec, returnSpec, holder,
+                        actionDomainEventFacet.getEventType(), actionMethod, typeSpec, returnSpec, holder,
                         servicesInjector
                 );
             }
@@ -264,14 +261,13 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         }
 
         // check for @Action(typeOf=...)
-        TypeOfFacet typeOfFacet = null;
         final List<Action> actions = Annotations.getAnnotations(method, Action.class);
-        if (actions != null) {
-            final Class<?> typeOf = actions.typeOf();
-            if(typeOf != null && typeOf != Object.class) {
-                typeOfFacet = new TypeOfFacetForActionAnnotation(typeOf, getSpecificationLoader(), holder);
-            }
-        }
+        TypeOfFacet typeOfFacet = actions.stream()
+                .map(Action::typeOf)
+                .filter(typeOf -> typeOf != null && typeOf != Object.class)
+                .findFirst()
+                .map(typeOf -> new TypeOfFacetForActionAnnotation(typeOf, getSpecificationLoader(), holder))
+                .orElse(null);
 
         // infer from return type
         if(typeOfFacet == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/bulk/BulkFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/bulk/BulkFacetForActionAnnotation.java
index 931199d..07c159d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/bulk/BulkFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/bulk/BulkFacetForActionAnnotation.java
@@ -29,18 +29,16 @@ import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacetAbstract;
 
 public class BulkFacetForActionAnnotation extends BulkFacetAbstract {
 
-    public static BulkFacet create(final List<Action> action, final FacetHolder holder) {
-
-        if(action == null) {
-            return null;
-        }
-
-        final InvokeOn invokeOn = action.invokeOn();
-        if(invokeOn == null) {
-            return null;
-        }
+    public static BulkFacet create(
+            final List<Action> actions,
+            final FacetHolder holder) {
 
-        return new BulkFacetForActionAnnotation(invokeOn, holder);
+        return actions.stream()
+                .map(Action::invokeOn)
+                .filter(invokeOn -> invokeOn != null && invokeOn != InvokeOn.NOT_SPECIFIED)
+                .findFirst()
+                .map(invokeOn -> new BulkFacetForActionAnnotation(invokeOn, holder))
+                .orElse(null);
     }
 
     private BulkFacetForActionAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/hidden/HiddenFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/hidden/HiddenFacetForActionAnnotation.java
index fbe55f5..f83cd3a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/hidden/HiddenFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/hidden/HiddenFacetForActionAnnotation.java
@@ -31,18 +31,15 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 public class HiddenFacetForActionAnnotation extends HiddenFacetAbstract {
 
     public static HiddenFacet create(
-            final List<Action> action,
+            final List<Action> actions,
             final FacetHolder holder) {
 
-        if (action == null) {
-            return null;
-        }
-
-        final Where where = action.hidden();
-        if (where != null && where != Where.NOT_SPECIFIED) {
-            return new HiddenFacetForActionAnnotation(where, holder);
-        }
-        return null;
+        return actions.stream()
+                .map(Action::hidden)
+                .filter(where -> where != null && where != Where.NOT_SPECIFIED)
+                .findFirst()
+                .map(where -> new HiddenFacetForActionAnnotation(where, holder))
+                .orElse(null);
     }
 
     private HiddenFacetForActionAnnotation(final Where where, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/semantics/ActionSemanticsFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/semantics/ActionSemanticsFacetForActionAnnotation.java
index 6f7bd16..e4b5ba5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/semantics/ActionSemanticsFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/semantics/ActionSemanticsFacetForActionAnnotation.java
@@ -30,21 +30,16 @@ import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFa
 public class ActionSemanticsFacetForActionAnnotation extends ActionSemanticsFacetAbstract {
 
     public static ActionSemanticsFacet create(
-            final List<Action> action,
+            final List<Action> actions,
             final FacetHolder holder) {
 
-        if(action == null) {
-            return null;
-        }
-
-        final SemanticsOf semantics = action.semantics();
-        if(action.semantics() == null) {
-            // don't think this can happen, therefore will return a facet with the default, ie NON_IDEMPOTENT
-            return null;
-        }
-
-        return new ActionSemanticsFacetForActionAnnotation(
-                semantics, holder);
+        return actions.stream()
+                .map(Action::semantics)
+                .filter(semanticsOf -> semanticsOf != SemanticsOf.NOT_SPECIFIED)
+                .findFirst()
+                .map(semanticsOf ->
+                        (ActionSemanticsFacet)new ActionSemanticsFacetForActionAnnotation(semanticsOf, holder))
+                .orElse(new ActionSemanticsFacetForActionAnnotation(SemanticsOf.NON_IDEMPOTENT, holder));
     }
 
     private ActionSemanticsFacetForActionAnnotation(SemanticsOf of, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index 88cb77d..015f7a8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -52,49 +54,49 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
 
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
-        final ActionLayout actionLayout = Annotations.getAnnotations(processMethodContext.getMethod(), ActionLayout.class);
+        final List<ActionLayout> actionLayouts = Annotations.getAnnotations(processMethodContext.getMethod(), ActionLayout.class);
 
 
         // bookmarkable
         BookmarkPolicyFacet bookmarkableFacet = BookmarkPolicyFacetForActionLayoutAnnotation
-                .create(actionLayout, holder);
+                .create(actionLayouts, holder);
         FacetUtil.addFacet(bookmarkableFacet);
 
 
         // cssClass
-        CssClassFacet cssClassFacet = CssClassFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        CssClassFacet cssClassFacet = CssClassFacetForActionLayoutAnnotation.create(actionLayouts, holder);
         FacetUtil.addFacet(cssClassFacet);
 
 
         // cssClassFa
-        CssClassFaFacet cssClassFaFacet = CssClassFaFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        CssClassFaFacet cssClassFaFacet = CssClassFaFacetForActionLayoutAnnotation.create(actionLayouts, holder);
         FacetUtil.addFacet(cssClassFaFacet);
 
 
         // describedAs
-        DescribedAsFacet describedAsFacet = DescribedAsFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        DescribedAsFacet describedAsFacet = DescribedAsFacetForActionLayoutAnnotation.create(actionLayouts, holder);
         FacetUtil.addFacet(describedAsFacet);
 
 
         // hidden
-        HiddenFacet hiddenFacet = HiddenFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        HiddenFacet hiddenFacet = HiddenFacetForActionLayoutAnnotation.create(actionLayouts, holder);
         FacetUtil.addFacet(hiddenFacet);
 
 
         // named
-        NamedFacet namedFacet = NamedFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        NamedFacet namedFacet = NamedFacetForActionLayoutAnnotation.create(actionLayouts, holder);
         FacetUtil.addFacet(namedFacet);
 
         // promptStyle
         PromptStyleFacet promptStyleFacet = PromptStyleFacetForActionLayoutAnnotation
-                .create(actionLayout, getConfiguration(), holder);
+                .create(actionLayouts, getConfiguration(), holder);
 
         FacetUtil.addFacet(promptStyleFacet);
 
 
         // position
         ActionPositionFacet actionPositionFacet = ActionPositionFacetForActionLayoutAnnotation
-                .create(actionLayout, holder);
+                .create(actionLayouts, holder);
         if(actionPositionFacet == null) {
             actionPositionFacet = new ActionPositionFacetFallback(holder);
         }
@@ -104,7 +106,7 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
         // contributing
         if (isContributingServiceOrMixinObject(processMethodContext)) {
             NotContributedFacet notContributedFacet = NotContributedFacetForActionLayoutAnnotation
-                    .create(actionLayout, holder);
+                    .create(actionLayouts, holder);
             FacetUtil.addFacet(notContributedFacet);
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionLayoutAnnotation.java
index 21e97c7..f60d8d4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
@@ -26,12 +28,15 @@ import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFace
 
 public class ActionPositionFacetForActionLayoutAnnotation extends ActionPositionFacetAbstract {
 
-    public static ActionPositionFacet create(ActionLayout actionLayout, FacetHolder holder) {
-        if(actionLayout == null) {
-            return null;
-        }
-        final ActionLayout.Position position = actionLayout.position();
-        return position != null ? new ActionPositionFacetForActionLayoutAnnotation(position, holder) : null;
+    public static ActionPositionFacet create(
+            final List<ActionLayout> actionLayouts, final FacetHolder holder) {
+
+        return actionLayouts.stream()
+                .map(ActionLayout::position)
+                .filter(position -> position != ActionLayout.Position.NOT_SPECIFIED)
+                .findFirst()
+                .map(position -> new ActionPositionFacetForActionLayoutAnnotation(position, holder))
+                .orElse(null);
     }
 
     private ActionPositionFacetForActionLayoutAnnotation(final ActionLayout.Position position, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionLayoutAnnotation.java
index 1a9f573..56caf9f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +29,26 @@ import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolic
 
 public class BookmarkPolicyFacetForActionLayoutAnnotation extends BookmarkPolicyFacetAbstract {
 
-    public static BookmarkPolicyFacet create(final ActionLayout actionLayout, final FacetHolder holder) {
-        if (actionLayout == null) {
-            return null;
-        }
-        final BookmarkPolicy bookmarkPolicy = actionLayout.bookmarking();
-        return bookmarkPolicy != null && bookmarkPolicy != BookmarkPolicy.NEVER ? new BookmarkPolicyFacetForActionLayoutAnnotation(bookmarkPolicy, holder) : null;
+    public static BookmarkPolicyFacet create(
+            final List<ActionLayout> actionLayouts,
+            final FacetHolder holder) {
+
+        return actionLayouts.stream()
+                .map(ActionLayout::bookmarking)
+                .filter(bookmarkPolicy -> bookmarkPolicy != BookmarkPolicy.NOT_SPECIFIED)
+                .findFirst()
+                .map(bookmarkPolicy -> {
+                    switch (bookmarkPolicy){
+                    case AS_ROOT:
+                    case AS_CHILD:
+                        return new BookmarkPolicyFacetForActionLayoutAnnotation(bookmarkPolicy, holder);
+                    case NEVER:
+                        return null;
+                    }
+                    throw new IllegalStateException("bookmarkPolicy '" + bookmarkPolicy + "' not recognised");
+                }
+                )
+                .orElse(null);
     }
 
     private BookmarkPolicyFacetForActionLayoutAnnotation(final BookmarkPolicy bookmarkPolicy, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionLayoutAnnotation.java
index 3b04e02..cb9b3c5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -29,13 +31,23 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPositi
 
 public class CssClassFaFacetForActionLayoutAnnotation extends CssClassFaFacetAbstract {
 
-    public static CssClassFaFacet create(final ActionLayout actionLayout, final FacetHolder holder) {
-        if(actionLayout == null) {
-            return null;
+    public static CssClassFaFacet create(final List<ActionLayout> actionLayouts, final FacetHolder holder) {
+
+        class Annot {
+            private Annot(final ActionLayout actionLayout) {
+                this.cssClassFa = Strings.emptyToNull(actionLayout.cssClassFa());
+                this.cssClassFaPosition = CssClassFaPosition.from(actionLayout.cssClassFaPosition());
+            }
+            String cssClassFa;
+            CssClassFaPosition cssClassFaPosition;
         }
-        final String cssClassFa = Strings.emptyToNull(actionLayout.cssClassFa());
-        CssClassFaPosition cssClassFaPosition = CssClassFaPosition.from(actionLayout.cssClassFaPosition());
-        return cssClassFa != null ? new CssClassFaFacetForActionLayoutAnnotation(cssClassFa, cssClassFaPosition, holder) : null;
+
+        return actionLayouts.stream()
+                .map(Annot::new)
+                .filter(a -> a.cssClassFa != null )
+                .findFirst()
+                .map(a -> new CssClassFaFacetForActionLayoutAnnotation(a.cssClassFa, a.cssClassFaPosition, holder))
+                .orElse(null);
     }
 
     private CssClassFaFacetForActionLayoutAnnotation(final String value, final CssClassFaPosition position, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionLayoutAnnotation.java
index c355d55..dbaf691 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionLayoutAnnotation.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
+import java.util.List;
+import java.util.Objects;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +30,17 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstr
 
 public class CssClassFacetForActionLayoutAnnotation extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(ActionLayout actionLayout, FacetHolder holder) {
-        if(actionLayout == null) {
-            return null;
-        }
-        final String cssClass = Strings.emptyToNull(actionLayout.cssClass());
-        return cssClass != null ? new CssClassFacetForActionLayoutAnnotation(cssClass, holder) : null;
+    public static CssClassFacet create(
+            final List<ActionLayout> actionLayouts,
+            final FacetHolder holder) {
+
+        return actionLayouts.stream()
+                .map(ActionLayout::cssClass)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(cssClass -> new CssClassFacetForActionLayoutAnnotation(cssClass, holder))
+                .orElse(null);
     }
 
     private CssClassFacetForActionLayoutAnnotation(String value, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionLayoutAnnotation.java
index b28c1e6..2146920 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionLayoutAnnotation.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
+import java.util.List;
+import java.util.Objects;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +30,15 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbs
 
 public class DescribedAsFacetForActionLayoutAnnotation extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(ActionLayout actionLayout, FacetHolder holder) {
-        if(actionLayout == null) {
-            return null;
-        }
-        final String describedAs = Strings.emptyToNull(actionLayout.describedAs());
-        return describedAs != null ? new DescribedAsFacetForActionLayoutAnnotation(describedAs, holder) : null;
+    public static DescribedAsFacet create(List<ActionLayout> actionLayouts, FacetHolder holder) {
+
+        return actionLayouts.stream()
+                .map(ActionLayout::describedAs)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(describedAs -> new DescribedAsFacetForActionLayoutAnnotation(describedAs, holder))
+                .orElse(null);
     }
 
     private DescribedAsFacetForActionLayoutAnnotation(String value, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutAnnotation.java
index 48f8a53..a5d28d7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -28,12 +30,16 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 
 public class HiddenFacetForActionLayoutAnnotation extends HiddenFacetAbstract {
 
-    public static HiddenFacet create(final ActionLayout actionLayout, final FacetHolder holder) {
-        if (actionLayout == null) {
-            return null;
-        }
-        final Where where = actionLayout.hidden();
-        return where != null && where != Where.NOT_SPECIFIED  ? new HiddenFacetForActionLayoutAnnotation(where, holder) : null;
+    public static HiddenFacet create(
+            final List<ActionLayout> actionLayouts,
+            final FacetHolder holder) {
+
+        return actionLayouts.stream()
+                .map(ActionLayout::hidden)
+                .filter(where -> where != null && where != Where.NOT_SPECIFIED)
+                .findFirst()
+                .map(where -> new HiddenFacetForActionLayoutAnnotation(where, holder))
+                .orElse(null);
     }
 
     private HiddenFacetForActionLayoutAnnotation(final Where where, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionLayoutAnnotation.java
index 6a36efb..7f74cab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionLayoutAnnotation.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
+import java.util.List;
+import java.util.Objects;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +30,17 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForActionLayoutAnnotation extends NamedFacetAbstract {
 
-    public static NamedFacet create(final ActionLayout actionLayout, final FacetHolder holder) {
-        if(actionLayout == null) {
-            return null;
-        }
-        final String named = Strings.emptyToNull(actionLayout.named());
-        return named != null ? new NamedFacetForActionLayoutAnnotation(named, holder) : null;
+    public static NamedFacet create(
+            final List<ActionLayout> actionLayouts,
+            final FacetHolder holder) {
+
+        return actionLayouts.stream()
+                .map(ActionLayout::named)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(named -> new NamedFacetForActionLayoutAnnotation(named, holder))
+                .orElse(null);
     }
 
     private NamedFacetForActionLayoutAnnotation(final String value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NotContributedFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NotContributedFacetForActionLayoutAnnotation.java
index 2309da4..17cf9f5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NotContributedFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NotContributedFacetForActionLayoutAnnotation.java
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Contributed;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -29,16 +31,18 @@ import org.apache.isis.core.metamodel.facets.actions.notcontributed.NotContribut
 public class NotContributedFacetForActionLayoutAnnotation extends NotContributedFacetAbstract {
 
     public static NotContributedFacet create(
-            final ActionLayout actionLayout, final FacetHolder holder) {
-        if(actionLayout == null) {
-            return null;
-        }
-        final Contributed contributed = actionLayout.contributed();
-        final NotContributedAs as = NotContributedAs.notFrom(contributed);
-        if(as == null) {
-            return null;
-        }
-        return new NotContributedFacetForActionLayoutAnnotation(as, contributed, holder);
+            final List<ActionLayout> actionLayouts,
+            final FacetHolder holder) {
+
+        return actionLayouts.stream()
+                .map(ActionLayout::contributed)
+                .filter(contributed -> contributed != Contributed.NOT_SPECIFIED)
+                .findFirst()
+                .map(contributed -> {
+                    NotContributedAs as = NotContributedAs.notFrom(contributed);
+                    return new NotContributedFacetForActionLayoutAnnotation(as, contributed, holder);
+                })
+                .orElse(null);
     }
 
     private NotContributedFacetForActionLayoutAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
index ca2b238..d0750f8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -27,7 +29,6 @@ import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleConfi
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAsConfigured;
-import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetFallBackToInline;
 
 public class PromptStyleFacetForActionLayoutAnnotation extends PromptStyleFacetAbstract {
 
@@ -39,48 +40,46 @@ public class PromptStyleFacetForActionLayoutAnnotation extends PromptStyleFacetA
     }
 
     public static PromptStyleFacet create(
-            final ActionLayout actionLayout,
+            final List<ActionLayout> actionLayouts,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        PromptStyle promptStyle = actionLayout != null? actionLayout.promptStyle() : null;
-
-        if(promptStyle == null) {
-            if (holder.containsDoOpNotDerivedFacet(PromptStyleFacet.class)) {
-                // do not replace
-                return null;
-            }
+        return actionLayouts.stream()
+                .map(ActionLayout::promptStyle)
+                .filter(promptStyle -> promptStyle != PromptStyle.NOT_SPECIFIED)
+                .findFirst()
+                .map(promptStyle -> {
 
-            return new PromptStyleFacetFallBackToInline(holder);
-        } else {
+                    switch (promptStyle) {
+                    case DIALOG:
+                    case INLINE:
+                    case INLINE_AS_IF_EDIT:
+                        return new PromptStyleFacetForActionLayoutAnnotation(promptStyle, holder);
 
-            switch (promptStyle) {
-                case DIALOG:
-                case INLINE:
-                case INLINE_AS_IF_EDIT:
-                    return new PromptStyleFacetForActionLayoutAnnotation(promptStyle, holder);
+                    case AS_CONFIGURED:
 
-                case AS_CONFIGURED:
-
-                    // do not replace
-                    if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
-                        return null;
-                    }
+                        // do not replace
+                        if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
+                            return null;
+                        }
 
-                    promptStyle = PromptStyleConfiguration.parse(configuration);
-                    return new PromptStyleFacetAsConfigured(promptStyle, holder);
+                        promptStyle = PromptStyleConfiguration.parse(configuration);
+                        return new PromptStyleFacetAsConfigured(promptStyle, holder);
 
-                default:
 
-                    // do not replace
-                    if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
-                        return null;
                     }
+                    throw new IllegalStateException("promptStyle '" + promptStyle + "' not recognised");
+                })
+                .orElseGet(() -> {
+                    // do not replace
+                        if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
+                            return null;
+                        }
 
-                    promptStyle = PromptStyleConfiguration.parse(configuration);
-                    return new PromptStyleFacetAsConfigured(promptStyle, holder);
-            }
-        }
+                        PromptStyle promptStyle = PromptStyleConfiguration.parse(configuration);
+                        return new PromptStyleFacetAsConfigured(promptStyle, holder);
+                    }
+                );
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
index 7f8f730..a182b77 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
@@ -23,6 +23,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
+import java.util.List;
 
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.services.eventbus.CollectionDomainEvent;
@@ -85,28 +86,25 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         //
         // Set up CollectionDomainEventFacet, which will act as the hiding/disabling/validating advisor
         //
-        final Collection collection = Annotations.getAnnotations(method, Collection.class);
-        final Class<? extends CollectionDomainEvent<?, ?>> collectionDomainEventType;
-
-        final CollectionDomainEventFacetAbstract collectionDomainEventFacet;
-
+        final List<Collection> collections = Annotations.getAnnotations(method, Collection.class);
 
         // search for @Collection(domainEvent=...)
-        if(collection != null) {
-            collectionDomainEventType = collection.domainEvent();
-            collectionDomainEventFacet = new CollectionDomainEventFacetForCollectionAnnotation(
-                    collectionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
-
-        } else
-        // else use default event type
-        {
-            collectionDomainEventType = CollectionDomainEvent.Default.class;
-            collectionDomainEventFacet = new CollectionDomainEventFacetDefault(
-                    collectionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
-        }
+        final CollectionDomainEventFacetAbstract collectionDomainEventFacet = collections.stream()
+                .map(Collection::domainEvent)
+                .filter(domainEvent -> domainEvent != CollectionDomainEvent.Default.class)
+                .findFirst()
+                .map(domainEvent ->
+                        (CollectionDomainEventFacetAbstract)
+                                new CollectionDomainEventFacetForCollectionAnnotation(
+                                        domainEvent, servicesInjector, getSpecificationLoader(), holder))
+                .orElse(
+                        new CollectionDomainEventFacetDefault(
+                                CollectionDomainEvent.Default.class, servicesInjector, getSpecificationLoader(), holder)
+                );
         if(!CollectionDomainEvent.Noop.class.isAssignableFrom(collectionDomainEventFacet.getEventType())) {
             FacetUtil.addFacet(collectionDomainEventFacet);
         }
+
         if(EventUtil.eventTypeIsPostable(
                 collectionDomainEventFacet.getEventType(),
                 CollectionDomainEvent.Noop.class,
@@ -128,14 +126,14 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
             // one of these facets to be created.
             final CollectionAddToFacetForDomainEventFromAbstract replacementFacet;
 
-            if(collection != null) {
+            if(collectionDomainEventFacet instanceof CollectionDomainEventFacetForCollectionAnnotation) {
                 replacementFacet = new CollectionAddToFacetForDomainEventFromCollectionAnnotation(
-                        collectionDomainEventType, getterFacet, collectionAddToFacet, collectionDomainEventFacet, holder, servicesInjector);
+                        collectionDomainEventFacet.getEventType(), getterFacet, collectionAddToFacet, collectionDomainEventFacet, holder, servicesInjector);
             } else
             // default
             {
                 replacementFacet = new CollectionAddToFacetForDomainEventFromDefault(
-                        collectionDomainEventType, getterFacet, collectionAddToFacet, collectionDomainEventFacet, holder, servicesInjector);
+                        collectionDomainEventFacet.getEventType(), getterFacet, collectionAddToFacet, collectionDomainEventFacet, holder, servicesInjector);
             }
             FacetUtil.addFacet(replacementFacet);
         }
@@ -146,12 +144,12 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
 
             final CollectionRemoveFromFacetForDomainEventFromAbstract replacementFacet;
 
-            if(collection != null) {
-                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation(collectionDomainEventType, getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, servicesInjector, holder);
+            if(collectionDomainEventFacet instanceof CollectionDomainEventFacetForCollectionAnnotation) {
+                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation(collectionDomainEventFacet.getEventType(), getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, servicesInjector, holder);
             } else
             // default
             {
-                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromDefault(collectionDomainEventType, getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, servicesInjector, holder);
+                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromDefault(collectionDomainEventFacet.getEventType(), getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, servicesInjector, holder);
             }
             FacetUtil.addFacet(replacementFacet);
         }
@@ -163,8 +161,8 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Collection(hidden=...)
-        final Collection collection = Annotations.getAnnotations(method, Collection.class);
-        HiddenFacet facet = HiddenFacetForCollectionAnnotation.create(collection, holder);
+        final List<Collection> collections = Annotations.getAnnotations(method, Collection.class);
+        HiddenFacet facet = HiddenFacetForCollectionAnnotation.create(collections, holder);
 
         FacetUtil.addFacet(facet);
     }
@@ -174,8 +172,8 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Collection(editing=...)
-        final Collection collection = Annotations.getAnnotations(method, Collection.class);
-        DisabledFacet facet = DisabledFacetForCollectionAnnotation.create(collection, holder);
+        final List<Collection> collections = Annotations.getAnnotations(method, Collection.class);
+        DisabledFacet facet = DisabledFacetForCollectionAnnotation.create(collections, holder);
 
         FacetUtil.addFacet(facet);
     }
@@ -185,8 +183,8 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Collection(notPersisted=...)
-        final Collection collection = Annotations.getAnnotations(method, Collection.class);
-        NotPersistedFacet facet = NotPersistedFacetForCollectionAnnotation.create(collection, holder);
+        final List<Collection> collections = Annotations.getAnnotations(method, Collection.class);
+        NotPersistedFacet facet = NotPersistedFacetForCollectionAnnotation.create(collections, holder);
 
         FacetUtil.addFacet(facet);
     }
@@ -203,9 +201,9 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         }
 
         // check for @Collection(typeOf=...)
-        final Collection collection = Annotations.getAnnotations(method, Collection.class);
+        final List<Collection> collections = Annotations.getAnnotations(method, Collection.class);
         TypeOfFacet facet = TypeOfFacetOnCollectionFromCollectionAnnotation
-                .create(collection, facetHolder, getSpecificationLoader());
+                .create(collections, facetHolder, getSpecificationLoader());
 
         // else infer from return type
         if(facet == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/disabled/DisabledFacetForCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/disabled/DisabledFacetForCollectionAnnotation.java
index c2ea273..a229f86 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/disabled/DisabledFacetForCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/disabled/DisabledFacetForCollectionAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.collections.collection.disabled;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.applib.annotation.Where;
@@ -29,31 +31,34 @@ import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetAbstr
 public class DisabledFacetForCollectionAnnotation extends DisabledFacetAbstractImpl {
 
     public static DisabledFacet create(
-            final Collection collection,
+            final List<Collection> collections,
             final FacetHolder holder) {
 
-        if (collection == null) {
-            return null;
-        }
+        return collections.stream()
+                .filter(collection -> collection.editing() != Editing.NOT_SPECIFIED)
+                .findFirst()
+                .map(collection -> {
+                    final Editing editing = collection.editing();
+                    final String disabledReason = collection.editingDisabledReason();
 
-        final Editing editing = collection.editing();
-        final String disabledReason = collection.editingDisabledReason();
+                    switch (editing) {
+                    case AS_CONFIGURED:
 
-        switch (editing) {
-            case AS_CONFIGURED:
+                        // nothing needs to be done here; the DomainObjectFactory (processing @DomainObject annotation)
+                        // will install an ImmutableFacetForDomainObjectAnnotation on the domain object and then a
+                        // DisabledFacetOnCollectionDerivedFromImmutable facet will be installed.
 
-                // nothing needs to be done here; the DomainObjectFactory (processing @DomainObject annotation)
-                // will install an ImmutableFacetForDomainObjectAnnotation on the domain object and then a
-                // DisabledFacetOnCollectionDerivedFromImmutable facet will be installed.
+                        return null;
 
-                return null;
+                    case DISABLED:
+                        return (DisabledFacet)new DisabledFacetForCollectionAnnotation(disabledReason, holder);
 
-            case DISABLED:
-                return new DisabledFacetForCollectionAnnotation(disabledReason, holder);
-            case ENABLED:
-                return null;
-        }
-        return null;
+                    case ENABLED:
+                        return null;
+                    }
+                    throw new IllegalStateException("editing '" + editing + "' not recognised");
+                })
+                .orElse(null);
     }
 
     private DisabledFacetForCollectionAnnotation(final String reason, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/hidden/HiddenFacetForCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/hidden/HiddenFacetForCollectionAnnotation.java
index 7fc16f0..0f57725 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/hidden/HiddenFacetForCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/hidden/HiddenFacetForCollectionAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.collections.collection.hidden;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -29,19 +31,15 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 public class HiddenFacetForCollectionAnnotation extends HiddenFacetAbstract {
 
     public static HiddenFacet create(
-            final Collection collection,
+            final List<Collection> collections,
             final FacetHolder holder) {
 
-        if (collection == null) {
-            return null;
-        }
-
-        final Where where = collection.hidden();
-        if (where != null && where != Where.NOT_SPECIFIED) {
-            return new HiddenFacetForCollectionAnnotation(where, holder);
-        }
-
-        return null;
+        return collections.stream()
+                .map(Collection::hidden)
+                .filter(where -> where != null && where != Where.NOT_SPECIFIED)
+                .findFirst()
+                .map(where -> new HiddenFacetForCollectionAnnotation(where, holder))
+                .orElse(null);
     }
 
     private HiddenFacetForCollectionAnnotation(final Where where, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/notpersisted/NotPersistedFacetForCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/notpersisted/NotPersistedFacetForCollectionAnnotation.java
index ce4e888..b016553 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/notpersisted/NotPersistedFacetForCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/notpersisted/NotPersistedFacetForCollectionAnnotation.java
@@ -19,8 +19,10 @@
 
 package org.apache.isis.core.metamodel.facets.collections.collection.notpersisted;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Collection;
-import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.MementoSerialization;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacetAbstract;
@@ -32,18 +34,22 @@ public class NotPersistedFacetForCollectionAnnotation extends NotPersistedFacetA
     }
 
     public static NotPersistedFacet create(
-            final Collection collection,
+            final List<Collection> collections,
             final FacetHolder holder) {
 
-        if (collection == null) {
-            return null;
-        }
-
-        final boolean notPersisted = collection.notPersisted();
-        final boolean persisted = !notPersisted;
-        if(persisted) {
-            return null;
-        }
-        return new NotPersistedFacetForCollectionAnnotation(holder);
+        return collections.stream()
+                .map(Collection::mementoSerialization)
+                .filter(mementoSerialization -> mementoSerialization != MementoSerialization.NOT_SPECIFIED)
+                .findFirst()
+                .map(mementoSerialization -> {
+                    switch (mementoSerialization) {
+                    case INCLUDED:
+                        return null;
+                    case EXCLUDED:
+                        return new NotPersistedFacetForCollectionAnnotation(holder);
+                    }
+                    throw new IllegalStateException("mementoSerialization '" + mementoSerialization + "' not recognized");
+                })
+                .orElse(null);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/typeof/TypeOfFacetOnCollectionFromCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/typeof/TypeOfFacetOnCollectionFromCollectionAnnotation.java
index 853422c..ebc16e9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/typeof/TypeOfFacetOnCollectionFromCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/typeof/TypeOfFacetOnCollectionFromCollectionAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.collections.collection.typeof;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
@@ -27,15 +29,19 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class TypeOfFacetOnCollectionFromCollectionAnnotation extends TypeOfFacetAbstract {
 
-    public static TypeOfFacetOnCollectionFromCollectionAnnotation create(final Collection annotation, final FacetedMethod facetHolder, final SpecificationLoader specificationLoader) {
-        if(annotation == null) {
-            return null;
-        }
-        final Class<?> typeOfClass = annotation.typeOf();
-        if(typeOfClass == Object.class) {
-            return null;
-        }
-        return new TypeOfFacetOnCollectionFromCollectionAnnotation(typeOfClass, facetHolder, specificationLoader);
+    public static TypeOfFacetOnCollectionFromCollectionAnnotation create(
+            final List<Collection> collections,
+            final FacetedMethod facetHolder,
+            final SpecificationLoader specificationLoader) {
+
+
+        return collections.stream()
+                .map(Collection::typeOf)
+                .filter(typeOf -> typeOf != Object.class)
+                .findFirst()
+                .map(typeOf ->
+                        new TypeOfFacetOnCollectionFromCollectionAnnotation(typeOf, facetHolder, specificationLoader))
+                .orElse(null);
     }
 
     private TypeOfFacetOnCollectionFromCollectionAnnotation(final Class<?> type, final FacetHolder holder, final SpecificationLoader specificationLookup) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionLayoutAnnotation.java
index 2a5aee4..de17ed5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionLayoutAnnotation.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import java.util.List;
+import java.util.Objects;
 
 import com.google.common.base.Strings;
 
@@ -34,12 +35,16 @@ public class DefaultViewFacetForCollectionLayoutAnnotation extends DefaultViewFa
         super(value, holder);
     }
 
-    public static DefaultViewFacet create(List<CollectionLayout> collectionLayout, FacetHolder holder) {
-        if (collectionLayout == null) {
-            return null;
-        }
-
-        final String defaultView = Strings.emptyToNull(collectionLayout.defaultView());
-        return defaultView != null ? new DefaultViewFacetForCollectionLayoutAnnotation(defaultView, holder) : null;
+    public static DefaultViewFacet create(
+            final List<CollectionLayout> collectionLayouts,
+            final FacetHolder holder) {
+
+        return collectionLayouts.stream()
+                .map(CollectionLayout::defaultView)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(defaultView -> new DefaultViewFacetForCollectionLayoutAnnotation(defaultView, holder))
+                .orElse(null);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
index b9b114d..cdeabbb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
@@ -28,12 +28,16 @@ import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
 public class PagedFacetForCollectionLayoutAnnotation extends PagedFacetAbstract {
 
-    public static PagedFacet create(List<CollectionLayout> collectionLayout, FacetHolder holder) {
-        if(collectionLayout == null) {
-            return null;
-        }
-        final int paged = collectionLayout.paged();
-        return paged != -1 ? new PagedFacetForCollectionLayoutAnnotation(paged, holder) : null;
+    public static PagedFacet create(
+            final List<CollectionLayout> collectionLayouts,
+            final FacetHolder holder) {
+
+        return collectionLayouts.stream()
+                .map(CollectionLayout::paged)
+                .filter(paged -> paged != -1)
+                .findFirst()
+                .map(paged -> new PagedFacetForCollectionLayoutAnnotation(paged, holder))
+                .orElse(null);
     }
 
     private PagedFacetForCollectionLayoutAnnotation(int paged, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
index 63c2f6d..47e457b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
@@ -29,16 +29,20 @@ import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacetA
 
 public class SortedByFacetForCollectionLayoutAnnotation extends SortedByFacetAbstract {
 
-    public static SortedByFacet create(List<CollectionLayout> collectionLayout, FacetHolder holder) {
-        if(collectionLayout == null) {
-            return null;
-        }
-        final Class sortedBy = collectionLayout.sortedBy();
-        if(sortedBy == Comparator.class) {
-            return null;
-        }
-
-        return sortedBy != null ? new SortedByFacetForCollectionLayoutAnnotation(sortedBy, holder) : null;
+    public static SortedByFacet create(
+            final List<CollectionLayout> collectionLayouts,
+            final FacetHolder holder) {
+
+        return collectionLayouts.stream()
+                .map(CollectionLayout::sortedBy)
+                .filter(sortedBy -> sortedBy != Comparator.class)
+                .filter(Comparator.class::isAssignableFrom)
+                .findFirst()
+                .map(sortedBy -> {
+                    Class<? extends Comparator<?>> sortedByForceGenerics = sortedBy;
+                    return new SortedByFacetForCollectionLayoutAnnotation(sortedByForceGenerics, holder);
+                })
+                .orElse(null);
     }
 
     private SortedByFacetForCollectionLayoutAnnotation(Class<? extends Comparator<?>> sortedBy, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java
index 1095016..64112aa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java
@@ -82,7 +82,7 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
     public void process(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
 
-        final XmlJavaTypeAdapter annotation = Annotations.getAnnotations(cls, XmlJavaTypeAdapter.class);
+        final XmlJavaTypeAdapter annotation = Annotations.getAnnotation(cls, XmlJavaTypeAdapter.class);
         if(annotation == null) {
             return;
         }
@@ -99,7 +99,7 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
 
         final Method method = processMethodContext.getMethod();
 
-        final XmlJavaTypeAdapter annotation = Annotations.getAnnotations(method, XmlJavaTypeAdapter.class);
+        final XmlJavaTypeAdapter annotation = Annotations.getAnnotation(method, XmlJavaTypeAdapter.class);
         if(annotation == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 429106e..c5b2810 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -179,7 +179,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
         }
 
         class Annot {
-            private Annot(final DomainObject domainObject) {
+            Annot(final DomainObject domainObject) {
                 this.autoCompleteRepository = domainObject.autoCompleteRepository();
                 this.autoCompleteAction = domainObject.autoCompleteAction();
             }
@@ -189,7 +189,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
         }
 
         return domainObjects.stream()
-                .map(Annot::new)
+                .map(domainObject -> new Annot(domainObject))
                 .filter(a -> a.autoCompleteRepository != Object.class)
                 .filter(a -> isServiceType(cls, "@DomainObject", a.autoCompleteRepository))
                 .peek(a -> a.repositoryMethod = findRepositoryMethod(cls, "@DomainObject", a.autoCompleteRepository, a.autoCompleteAction))
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForViewModelLayoutAnnotation.java
index 8389c88..f324be0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForViewModelLayoutAnnotation.java
@@ -28,13 +28,23 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPositi
 
 public class CssClassFaFacetForViewModelLayoutAnnotation extends CssClassFaFacetAbstract {
 
-    public static CssClassFaFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
-        if (viewModelLayout == null) {
-            return null;
+    public static CssClassFaFacet create(final List<ViewModelLayout> viewModelLayouts, final FacetHolder holder) {
+
+        class Annot {
+            private Annot(final ViewModelLayout viewModelLayout) {
+                this.cssClassFa = Strings.emptyToNull(viewModelLayout.cssClassFa());
+                this.cssClassFaPosition = CssClassFaPosition.from(viewModelLayout.cssClassFaPosition());
+            }
+            String cssClassFa;
+            CssClassFaPosition cssClassFaPosition;
         }
-        final String cssClassFa = Strings.emptyToNull(viewModelLayout.cssClassFa());
-        final CssClassFaPosition position = CssClassFaPosition.from(viewModelLayout.cssClassFaPosition());
-        return cssClassFa != null ? new CssClassFaFacetForViewModelLayoutAnnotation(cssClassFa, position, holder) : null;
+
+        return viewModelLayouts.stream()
+                .map(Annot::new)
+                .filter(a -> a.cssClassFa != null )
+                .findFirst()
+                .map(a -> new CssClassFaFacetForViewModelLayoutAnnotation(a.cssClassFa, a.cssClassFaPosition, holder))
+                .orElse(null);
     }
 
     public CssClassFaFacetForViewModelLayoutAnnotation(final String value, CssClassFaPosition position,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java
index 0f29bb0..1dd69a2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java
@@ -29,9 +29,6 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstr
 public class CssClassFacetForDomainObjectLayoutAnnotation extends CssClassFacetAbstract {
 
     public static CssClassFacet create(final List<DomainObjectLayout> domainObjectLayouts, final FacetHolder holder) {
-        if (domainObjectLayouts.isEmpty()) {
-            return null;
-        }
         return domainObjectLayouts.stream()
                 .map(DomainObjectLayout::cssClass)
                 .map(Strings::emptyToNull)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
index 0193844..0167e34 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
@@ -42,27 +42,28 @@ public class IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent extends Ic
     private static final Logger LOG = LoggerFactory.getLogger(IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.class);
 
     public static Facet create(
-            final List<DomainObjectLayout> domainObjectLayout,
+            final List<DomainObjectLayout> domainObjectLayouts,
             final ServicesInjector servicesInjector,
-            final IsisConfiguration configuration, final FacetHolder facetHolder) {
-        if(domainObjectLayout == null) {
-            return null;
-        }
-        final Class<? extends IconUiEvent<?>> iconUiEventClass = domainObjectLayout.iconUiEvent();
-
-        if(!EventUtil.eventTypeIsPostable(
-                iconUiEventClass,
-                IconUiEvent.Noop.class,
-                IconUiEvent.Default.class,
-                "isis.reflector.facet.domainObjectLayoutAnnotation.iconUiEvent.postForDefault",
-                configuration)) {
-            return null;
-        }
-
-        final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
-
-        return new IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent(
-                iconUiEventClass, eventBusService, facetHolder);
+            final IsisConfiguration configuration,
+            final FacetHolder facetHolder) {
+
+        return domainObjectLayouts.stream()
+                .map(DomainObjectLayout::iconUiEvent)
+                .filter(iconUiEvent -> EventUtil.eventTypeIsPostable(
+                        iconUiEvent,
+                        IconUiEvent.Noop.class,
+                        IconUiEvent.Default.class,
+                        "isis.reflector.facet.domainObjectLayoutAnnotation.iconUiEvent.postForDefault",
+                        configuration))
+                .findFirst()
+                .map(iconUiEvent -> {
+
+                    final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
+
+                    return new IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent(
+                            iconUiEvent, eventBusService, facetHolder);
+                })
+                .orElse(null);
     }
 
     private final Class<? extends IconUiEvent<?>> iconUiEventClass;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java
index c4350b6..00b0693 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
 import java.util.List;
+import java.util.Objects;
 
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
@@ -30,12 +31,17 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForDomainObjectLayoutAnnotation extends NamedFacetAbstract {
 
-    public static NamedFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
-        if(domainObjectLayout == null) {
-            return null;
-        }
-        final String named = Strings.emptyToNull(domainObjectLayout.named());
-        return named != null ? new NamedFacetForDomainObjectLayoutAnnotation(named, holder) : null;
+    public static NamedFacet create(
+            final List<DomainObjectLayout> domainObjectLayouts,
+            final FacetHolder holder) {
+
+        return domainObjectLayouts.stream()
+                .map(DomainObjectLayout::named)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(named -> new NamedFacetForDomainObjectLayoutAnnotation(named, holder))
+                .orElse(null);
     }
 
     private NamedFacetForDomainObjectLayoutAnnotation(final String value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForViewModelLayoutAnnotation.java
index 89e9210..04e2b9a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForViewModelLayoutAnnotation.java
@@ -18,24 +18,31 @@
  */
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
-
 import java.util.List;
+import java.util.Objects;
 
 import com.google.common.base.Strings;
+
+import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
-
+import org.apache.isis.core.metamodel.facets.object.domainservicelayout.NamedFacetForDomainServiceLayoutAnnotation;
 
 public class NamedFacetForViewModelLayoutAnnotation extends NamedFacetAbstract {
 
-    public static NamedFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
-        if(viewModelLayout == null) {
-            return null;
-        }
-        final String named = Strings.emptyToNull(viewModelLayout.named());
-        return named != null ? new NamedFacetForViewModelLayoutAnnotation(named, holder) : null;
+    public static NamedFacet create(
+            final List<ViewModelLayout> viewModelLayouts,
+            final FacetHolder holder) {
+
+        return viewModelLayouts.stream()
+                .map(ViewModelLayout::named)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(named -> new NamedFacetForViewModelLayoutAnnotation(named, holder))
+                .orElse(null);
     }
 
     private NamedFacetForViewModelLayoutAnnotation(final String value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForViewModelLayoutAnnotation.java
index e73efe2..15d3623 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForViewModelLayoutAnnotation.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
 import java.util.List;
+import java.util.Objects;
 
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.ViewModelLayout;
@@ -30,12 +31,14 @@ import org.apache.isis.core.metamodel.facets.object.plural.PluralFacetAbstract;
 
 public class PluralFacetForViewModelLayoutAnnotation extends PluralFacetAbstract {
 
-    public static PluralFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
-        if(viewModelLayout == null) {
-            return null;
-        }
-        final String plural = Strings.emptyToNull(viewModelLayout.plural());
-        return plural != null ? new PluralFacetForViewModelLayoutAnnotation(plural, holder) : null;
+    public static PluralFacet create(final List<ViewModelLayout> viewModelLayouts, final FacetHolder holder) {
+        return viewModelLayouts.stream()
+                .map(ViewModelLayout::plural)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(plural -> new PluralFacetForViewModelLayoutAnnotation(plural, holder))
+                .orElse(null);
     }
 
     private PluralFacetForViewModelLayoutAnnotation(final String value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
index cd191e5..40f792f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
@@ -51,8 +51,8 @@ public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends
 
         return domainObjectLayouts.stream()
                 .map(DomainObjectLayout::titleUiEvent)
-                .filter(titleUiEventClass -> EventUtil.eventTypeIsPostable(
-                        titleUiEventClass,
+                .filter(titleUiEvent -> EventUtil.eventTypeIsPostable(
+                        titleUiEvent,
                         TitleUiEvent.Noop.class,
                         TitleUiEvent.Default.class,
                         "isis.reflector.facet.domainObjectLayoutAnnotation.titleUiEvent.postForDefault",
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
index 684745c..cdbbce1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
@@ -60,7 +60,7 @@ public class DomainServiceFacetAnnotationFactory extends FacetFactoryAbstract im
     @Override
     public void process(ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainService annotation = Annotations.getAnnotations(cls, DomainService.class);
+        final DomainService annotation = Annotations.getAnnotation(cls, DomainService.class);
         if (annotation == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java
index 7187780..6ddfc35 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainservicelayout;
 
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -41,10 +43,10 @@ public class DomainServiceLayoutFacetFactory extends FacetFactoryAbstract {
 
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final DomainService domainService = Annotations.getAnnotations(cls, DomainService.class);
-        final DomainServiceLayout domainServiceLayout = Annotations.getAnnotations(cls, DomainServiceLayout.class);
+        final DomainService domainService = Annotations.getAnnotation(cls, DomainService.class);
+        final List<DomainServiceLayout> domainServiceLayouts = Annotations.getAnnotations(cls, DomainServiceLayout.class);
 
-        if (domainService == null && domainServiceLayout == null) {
+        if (domainService == null && domainServiceLayouts == null) {
             return;
         }
 
@@ -52,23 +54,27 @@ public class DomainServiceLayoutFacetFactory extends FacetFactoryAbstract {
                 domainService != null && !domainService.menuOrder().equals("" + (Integer.MAX_VALUE - 100))
                         ? domainService.menuOrder()
                         : null;
-        final String domainServiceLayoutMenuOrder =
-                domainServiceLayout != null && !domainServiceLayout.menuOrder().equals("" + (Integer.MAX_VALUE - 100))
-                        ? domainServiceLayout.menuOrder()
-                        : null;
+        final String domainServiceLayoutMenuOrder =domainServiceLayouts.stream()
+                .map(DomainServiceLayout::menuOrder)
+                .filter(menuOrder -> !menuOrder.equals("" + (Integer.MAX_VALUE - 100)))
+                .findFirst()
+                .orElse(null);
+
         final String menuOrder = coalesce(domainServiceLayoutMenuOrder, domainServiceMenuOrder);
 
         DomainServiceLayout.MenuBar menuBar =
-                domainServiceLayout != null
-                        ? domainServiceLayout.menuBar()
-                        : DomainServiceLayout.MenuBar.PRIMARY;
+                domainServiceLayouts.stream()
+                    .map(DomainServiceLayout::menuBar)
+                    .filter(mb -> mb != DomainServiceLayout.MenuBar.NOT_SPECIFIED)
+                    .findFirst()
+                    .orElse(DomainServiceLayout.MenuBar.PRIMARY);
 
         FacetUtil.addFacet(
                 new DomainServiceLayoutFacetAnnotation(
                         facetHolder,
                         menuBar, menuOrder));
 
-        FacetUtil.addFacet(NamedFacetForDomainServiceLayoutAnnotation.create(domainServiceLayout, facetHolder));
+        FacetUtil.addFacet(NamedFacetForDomainServiceLayoutAnnotation.create(domainServiceLayouts, facetHolder));
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/NamedFacetForDomainServiceLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/NamedFacetForDomainServiceLayoutAnnotation.java
index b769a95..7a82d5c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/NamedFacetForDomainServiceLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/NamedFacetForDomainServiceLayoutAnnotation.java
@@ -19,6 +19,9 @@
 package org.apache.isis.core.metamodel.facets.object.domainservicelayout;
 
 
+import java.util.List;
+import java.util.Objects;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,12 +31,17 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForDomainServiceLayoutAnnotation extends NamedFacetAbstract {
 
-    public static NamedFacet create(final DomainServiceLayout domainServiceLayout, final FacetHolder holder) {
-        if(domainServiceLayout == null) {
-            return null;
-        }
-        final String named = Strings.emptyToNull(domainServiceLayout.named());
-        return named != null ? new NamedFacetForDomainServiceLayoutAnnotation(named, holder) : null;
+    public static NamedFacet create(
+            final List<DomainServiceLayout> domainServiceLayouts,
+            final FacetHolder holder) {
+
+        return domainServiceLayouts.stream()
+                .map(DomainServiceLayout::named)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(named -> new NamedFacetForDomainServiceLayoutAnnotation(named, holder))
+                .orElse(null);
     }
 
     private NamedFacetForDomainServiceLayoutAnnotation(String value, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
index c4c8877..ed73cd8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
@@ -84,7 +84,7 @@ public class ValueFacetAnnotationOrConfigurationFactory extends FacetFactoryAbst
     private ValueFacet create(final Class<?> cls, final FacetHolder holder) {
 
         // create from annotation, if present
-        final Value annotation = Annotations.getAnnotations(cls, Value.class);
+        final Value annotation = Annotations.getAnnotation(cls, Value.class);
         if (annotation != null) {
             final ValueFacetAnnotation facet = new ValueFacetAnnotation(cls, holder, servicesInjector);
             if (facet.isValid()) {
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 773caa0..c2f013e 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
@@ -97,9 +97,7 @@ public abstract class MustSatisfySpecificationFacetAbstract extends FacetAbstrac
         }
         try {
             return (Specification) value.newInstance();
-        } catch (final InstantiationException e) {
-            return null;
-        } catch (final IllegalAccessException e) {
+        } catch (final InstantiationException | IllegalAccessException e) {
             return null;
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index 3b1cc62..a405e95 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.properties.property;
 
 import java.lang.reflect.Method;
+import java.util.List;
 
 import javax.annotation.Nullable;
 import javax.validation.constraints.Pattern;
@@ -62,8 +63,8 @@ import org.apache.isis.core.metamodel.facets.properties.property.modify.Property
 import org.apache.isis.core.metamodel.facets.properties.property.mustsatisfy.MustSatisfySpecificationFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.notpersisted.NotPersistedFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.publishing.PublishedPropertyFacetForPropertyAnnotation;
-import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForPatternAnnotationOnProperty;
+import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropertyFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
@@ -109,25 +110,18 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         //
         // Set up PropertyDomainEventFacet, which will act as the hiding/disabling/validating advisor
         //
-        final Property property = Annotations.getAnnotations(method, Property.class);
-        final Class<? extends PropertyDomainEvent<?, ?>> propertyDomainEventType;
-
-        final PropertyDomainEventFacetAbstract propertyDomainEventFacet;
-
-
-        // search for @Property(domainEvent=...)
-        if(property != null) {
-            propertyDomainEventType = property.domainEvent();
-            propertyDomainEventFacet = new PropertyDomainEventFacetForPropertyAnnotation(
-                    propertyDomainEventType, getterFacet, servicesInjector, getSpecificationLoader(), holder);
-
-        } else
-        // else use default event type
-        {
-            propertyDomainEventType = PropertyDomainEvent.Default.class;
-            propertyDomainEventFacet = new PropertyDomainEventFacetDefault(
-                    propertyDomainEventType, getterFacet, servicesInjector, getSpecificationLoader(), holder);
-        }
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
+
+        // search for @Property(domainEvent=...), else use default event type
+        final PropertyDomainEventFacetAbstract propertyDomainEventFacet = properties.stream()
+                .map(Property::domainEvent)
+                .filter(domainEvent -> domainEvent != PropertyDomainEvent.Default.class)
+                .findFirst()
+                .map(domainEvent -> (PropertyDomainEventFacetAbstract) new PropertyDomainEventFacetForPropertyAnnotation(
+                        domainEvent, getterFacet, servicesInjector, getSpecificationLoader(), holder))
+                .orElse(new PropertyDomainEventFacetDefault(
+                        PropertyDomainEvent.Default.class, getterFacet, servicesInjector, getSpecificationLoader(),
+                        holder));
 
         if(EventUtil.eventTypeIsPostable(
                 propertyDomainEventFacet.getEventType(),
@@ -149,14 +143,14 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
             // the current setter facet will end up as the underlying facet
             final PropertySetterFacet replacementFacet;
 
-            if(property != null) {
+            if(propertyDomainEventFacet instanceof PropertyDomainEventFacetForPropertyAnnotation) {
                 replacementFacet = new PropertySetterFacetForDomainEventFromPropertyAnnotation(
-                        propertyDomainEventType, getterFacet, setterFacet, propertyDomainEventFacet, holder, servicesInjector);
+                        propertyDomainEventFacet.getEventType(), getterFacet, setterFacet, propertyDomainEventFacet, holder, servicesInjector);
             } else
             // default
             {
                 replacementFacet = new PropertySetterFacetForDomainEventFromDefault(
-                        propertyDomainEventType, getterFacet, setterFacet, propertyDomainEventFacet, holder, servicesInjector);
+                        propertyDomainEventFacet.getEventType(), getterFacet, setterFacet, propertyDomainEventFacet, holder, servicesInjector);
             }
             FacetUtil.addFacet(replacementFacet);
         }
@@ -166,14 +160,14 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
             // the current clear facet will end up as the underlying facet
             final PropertyClearFacet replacementFacet;
 
-            if(property != null) {
+            if(propertyDomainEventFacet instanceof PropertyDomainEventFacetForPropertyAnnotation) {
                 replacementFacet = new PropertyClearFacetForDomainEventFromPropertyAnnotation(
-                        propertyDomainEventType, getterFacet, clearFacet, propertyDomainEventFacet, holder, servicesInjector);
+                        propertyDomainEventFacet.getEventType(), getterFacet, clearFacet, propertyDomainEventFacet, holder, servicesInjector);
             } else
             // default
             {
                 replacementFacet = new PropertyClearFacetForDomainEventFromDefault(
-                        propertyDomainEventType, getterFacet, clearFacet, propertyDomainEventFacet, holder, servicesInjector);
+                        propertyDomainEventFacet.getEventType(), getterFacet, clearFacet, propertyDomainEventFacet, holder, servicesInjector);
             }
             FacetUtil.addFacet(replacementFacet);
         }
@@ -185,8 +179,8 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(hidden=...)
-        final Property property = Annotations.getAnnotations(method, Property.class);
-        HiddenFacet facet = HiddenFacetForPropertyAnnotation.create(property, holder);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
+        HiddenFacet facet = HiddenFacetForPropertyAnnotation.create(properties, holder);
 
         FacetUtil.addFacet(facet);
     }
@@ -196,8 +190,8 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(editing=...)
-        final Property property = Annotations.getAnnotations(method, Property.class);
-        DisabledFacet facet = DisabledFacetForPropertyAnnotation.create(property, holder);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
+        DisabledFacet facet = DisabledFacetForPropertyAnnotation.create(properties, holder);
 
         FacetUtil.addFacet(facet);
     }
@@ -206,7 +200,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
 
         final Class<?> cls = processMethodContext.getCls();
         final Method method = processMethodContext.getMethod();
-        final Property property = Annotations.getAnnotations(method, Property.class);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
         final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
 
         final FacetHolder holder = facetHolder;
@@ -221,7 +215,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         }
 
         // check for @Property(command=...)
-        final CommandFacet commandFacet = CommandFacetForPropertyAnnotation.create(property, getConfiguration(), holder);
+        final CommandFacet commandFacet = CommandFacetForPropertyAnnotation.create(properties, getConfiguration(), holder);
 
         FacetUtil.addFacet(commandFacet);
     }
@@ -229,7 +223,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
     void processPublishing(final ProcessMethodContext processMethodContext) {
 
         final Method method = processMethodContext.getMethod();
-        final Property property = Annotations.getAnnotations(method, Property.class);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         //
@@ -244,7 +238,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
 
         // check for @Property(publishing=...)
         final PublishedPropertyFacet facet = PublishedPropertyFacetForPropertyAnnotation
-                .create(property, getConfiguration(), holder);
+                .create(properties, getConfiguration(), holder);
 
         FacetUtil.addFacet(facet);
     }
@@ -256,8 +250,8 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(maxLength=...)
-        final Property property = Annotations.getAnnotations(method, Property.class);
-        MaxLengthFacet facet = MaxLengthFacetForPropertyAnnotation.create(property, holder);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
+        MaxLengthFacet facet = MaxLengthFacetForPropertyAnnotation.create(properties, holder);
 
         FacetUtil.addFacet(facet);
     }
@@ -267,8 +261,8 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(mustSatisfy=...)
-        final Property property = Annotations.getAnnotations(method, Property.class);
-        Facet facet = MustSatisfySpecificationFacetForPropertyAnnotation.create(property, holder, servicesInjector);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
+        Facet facet = MustSatisfySpecificationFacetForPropertyAnnotation.create(properties, holder, servicesInjector);
 
         FacetUtil.addFacet(facet);
     }
@@ -278,8 +272,8 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(notPersisted=...)
-        final Property property = Annotations.getAnnotations(method, Property.class);
-        NotPersistedFacet facet = NotPersistedFacetForPropertyAnnotation.create(property, holder);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
+        NotPersistedFacet facet = NotPersistedFacetForPropertyAnnotation.create(properties, holder);
 
         FacetUtil.addFacet(facet);
     }
@@ -291,7 +285,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Nullable
-        final Nullable nullableAnnotation = Annotations.getAnnotations(method, Nullable.class);
+        final Nullable nullableAnnotation = Annotations.getAnnotation(method, Nullable.class);
         final MandatoryFacet facet2 =
                 MandatoryFacetInvertedByNullableAnnotationOnProperty.create(nullableAnnotation, method, holder);
         FacetUtil.addFacet(facet2);
@@ -299,8 +293,8 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
                     facet2, "Conflicting @Nullable with other optionality annotation");
 
         // search for @Property(optional=...)
-        final Property property = Annotations.getAnnotations(method, Property.class);
-        final MandatoryFacet facet3 = MandatoryFacetForPropertyAnnotation.create(property, method, holder);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
+        final MandatoryFacet facet3 = MandatoryFacetForPropertyAnnotation.create(properties, method, holder);
         FacetUtil.addFacet(facet3);
         conflictingOptionalityValidator.flagIfConflict(
                     facet3, "Conflicting Property#optionality with other optionality annotation");
@@ -313,13 +307,13 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final Class<?> returnType = processMethodContext.getMethod().getReturnType();
 
         // check for @Pattern first
-        final Pattern annotation = Annotations.getAnnotations(processMethodContext.getMethod(), Pattern.class);
-        RegExFacet facet = RegExFacetForPatternAnnotationOnProperty.create(annotation, returnType, holder);
+        final List<Pattern> patterns = Annotations.getAnnotations(processMethodContext.getMethod(), Pattern.class);
+        RegExFacet facet = RegExFacetForPatternAnnotationOnProperty.create(patterns, returnType, holder);
 
         // else search for @Property(pattern=...)
-        final Property property = Annotations.getAnnotations(method, Property.class);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
         if (facet == null) {
-            facet = RegExFacetForPropertyAnnotation.create(property, returnType, holder);
+            facet = RegExFacetForPropertyAnnotation.create(properties, returnType, holder);
         }
 
         FacetUtil.addFacet(facet);
@@ -332,8 +326,8 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
 
 
         // else search for @Property(maxLength=...)
-        final Property property = Annotations.getAnnotations(method, Property.class);
-        FileAcceptFacet facet = FileAcceptFacetForPropertyAnnotation.create(property, holder);
+        final List<Property> properties = Annotations.getAnnotations(method, Property.class);
+        FileAcceptFacet facet = FileAcceptFacetForPropertyAnnotation.create(properties, holder);
 
         FacetUtil.addFacet(facet);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotation.java
index f7523b4..28c5902 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotation.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.core.metamodel.facets.properties.property.command;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.CommandExecuteIn;
 import org.apache.isis.applib.annotation.CommandPersistence;
 import org.apache.isis.applib.annotation.CommandReification;
@@ -31,35 +33,44 @@ import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstrac
 public class CommandFacetForPropertyAnnotation extends CommandFacetAbstract {
 
     public static CommandFacet create(
-            final Property property,
+            final List<Property> properties,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        final CommandReification command = property != null ? property.command() : CommandReification.AS_CONFIGURED;
-        final CommandPersistence commandPersistence = property != null ? property.commandPersistence() : CommandPersistence.PERSISTED;
-        final CommandExecuteIn commandExecuteIn = property != null? property.commandExecuteIn() :  CommandExecuteIn.FOREGROUND;
-
-        final CommandPersistence persistence = commandPersistence;
-        final CommandExecuteIn executeIn = commandExecuteIn;
+        final CommandPropertiesConfiguration setting = CommandPropertiesConfiguration.parse(configuration);
 
-        switch (command) {
-            case AS_CONFIGURED:
-                final CommandPropertiesConfiguration setting = CommandPropertiesConfiguration.parse(configuration);
-                switch (setting) {
-                case NONE:
-                    return null;
-                default:
-                    return property != null
-                            ? new CommandFacetForPropertyAnnotationAsConfigured(persistence, executeIn, Enablement.ENABLED, holder)
-                            : CommandFacetFromConfiguration.create(holder);
-                }
-            case DISABLED:
-                return null;
-            case ENABLED:
-                return new CommandFacetForPropertyAnnotation(persistence, executeIn, Enablement.ENABLED, holder);
-        }
+        return properties.stream()
+                .filter(property -> property.command() != CommandReification.NOT_SPECIFIED)
+                .findFirst()
+                .map(property -> {
+                    final CommandReification command = property.command();
+                    final CommandPersistence commandPersistence = property.commandPersistence();
+                    final CommandExecuteIn commandExecuteIn = property.commandExecuteIn();
 
-        return null;
+                    switch (command) {
+                    case AS_CONFIGURED:
+                        switch (setting) {
+                        case NONE:
+                            return null;
+                        default:
+                            return (CommandFacet)new CommandFacetForPropertyAnnotationAsConfigured(commandPersistence,
+                                    commandExecuteIn, Enablement.ENABLED, holder);
+                        }
+                    case DISABLED:
+                        return null;
+                    case ENABLED:
+                        return new CommandFacetForPropertyAnnotation(commandPersistence, commandExecuteIn, Enablement.ENABLED, holder);
+                    }
+                    throw new IllegalStateException("command '" + command + "' not recognised");
+                })
+                .orElseGet(() -> {
+                    switch (setting) {
+                    case NONE:
+                        return null;
+                    default:
+                        return CommandFacetFromConfiguration.create(holder);
+                    }
+                });
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotation.java
index 147fbb4..fecd07c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.disabled;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Where;
@@ -28,30 +30,30 @@ import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetAbstr
 
 public class DisabledFacetForPropertyAnnotation extends DisabledFacetAbstractImpl {
 
-    public static DisabledFacet create(final Property property, final FacetHolder holder) {
-
-        if (property == null) {
-            return null;
-        }
-
-        final Editing editing = property.editing();
-
-        switch (editing) {
-            case AS_CONFIGURED:
-
-                // nothing needs to be done here; the DomainObjectFactory (processing @DomainObject annotation)
-                // will install an ImmutableFacetForDomainObjectAnnotation on the domain object and then a
-                // DisabledFacetOnPropertyDerivedFromImmutable facet will be installed.
-
-                return null;
-
-            case DISABLED:
-                final String disabledReason = property.editingDisabledReason();
-                return new DisabledFacetForPropertyAnnotation(disabledReason, holder);
-            case ENABLED:
-                return new DisabledFacetForPropertyAnnotationInvertedSemantics(holder);
-        }
-        return null;
+    public static DisabledFacet create(final List<Property> properties, final FacetHolder holder) {
+
+        return properties.stream()
+                .filter(property -> property.editing() != Editing.NOT_SPECIFIED)
+                .findFirst()
+                .map(property -> {
+                    switch (property.editing()) {
+                    case AS_CONFIGURED:
+
+                        // nothing needs to be done here; the DomainObjectFactory (processing @DomainObject annotation)
+                        // will install an ImmutableFacetForDomainObjectAnnotation on the domain object and then a
+                        // DisabledFacetOnPropertyDerivedFromImmutable facet will be installed.
+
+                        return null;
+
+                    case DISABLED:
+                        final String disabledReason = property.editingDisabledReason();
+                        return new DisabledFacetForPropertyAnnotation(disabledReason, holder);
+                    case ENABLED:
+                        return new DisabledFacetForPropertyAnnotationInvertedSemantics(holder);
+                    }
+                    return null;
+                })
+                .orElse(null);
     }
 
     private DisabledFacetForPropertyAnnotation(final String reason, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/fileaccept/FileAcceptFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/fileaccept/FileAcceptFacetForPropertyAnnotation.java
index 231955e..9399c29 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/fileaccept/FileAcceptFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/fileaccept/FileAcceptFacetForPropertyAnnotation.java
@@ -19,6 +19,11 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.fileaccept;
 
+import java.util.List;
+import java.util.Objects;
+
+import com.google.common.base.Strings;
+
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
@@ -27,17 +32,16 @@ import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFa
 public class FileAcceptFacetForPropertyAnnotation extends FileAcceptFacetAbstract {
 
     public static FileAcceptFacet create(
-            final Property property,
+            final List<Property> properties,
             final FacetHolder holder) {
 
-        if (property == null) {
-            return null;
-        }
-
-        final String fileAccept = property.fileAccept();
-        return !"".equals(fileAccept)
-                ? new FileAcceptFacetForPropertyAnnotation(fileAccept, holder)
-                : null;
+        return properties.stream()
+                .map(Property::fileAccept)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(fileAccept -> new FileAcceptFacetForPropertyAnnotation(fileAccept, holder))
+                .orElse(null);
     }
 
     private FileAcceptFacetForPropertyAnnotation(final String value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/hidden/HiddenFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/hidden/HiddenFacetForPropertyAnnotation.java
index 0b9ea1e..502dff3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/hidden/HiddenFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/hidden/HiddenFacetForPropertyAnnotation.java
@@ -19,27 +19,29 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.hidden;
 
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.action.hidden.HiddenFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 
 public class HiddenFacetForPropertyAnnotation extends HiddenFacetAbstract {
 
-    public static HiddenFacet create(final Property property, final FacetHolder holder) {
-
-        if (property == null) {
-            return null;
-        }
-
-        final Where where = property.hidden();
-        if (where != null && where != Where.NOT_SPECIFIED) {
-            return new HiddenFacetForPropertyAnnotation(where, holder);
-        }
+    public static HiddenFacet create(
+            final List<Property> properties,
+            final FacetHolder holder) {
 
-        return null;
+        return properties.stream()
+                .map(Property::hidden)
+                .filter(where -> where != null && where != Where.NOT_SPECIFIED)
+                .findFirst()
+                .map(where -> new HiddenFacetForPropertyAnnotation(where, holder))
+                .orElse(null);
     }
 
     private HiddenFacetForPropertyAnnotation(final Where where, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/mandatory/MandatoryFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/mandatory/MandatoryFacetForPropertyAnnotation.java
index 8e81f4e..7f6c562 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/mandatory/MandatoryFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/mandatory/MandatoryFacetForPropertyAnnotation.java
@@ -20,6 +20,8 @@
 package org.apache.isis.core.metamodel.facets.properties.property.mandatory;
 
 import java.lang.reflect.Method;
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -33,31 +35,33 @@ public abstract class MandatoryFacetForPropertyAnnotation extends MandatoryFacet
     }
 
     public static MandatoryFacet create(
-            final Property property,
+            final List<Property> properties,
             final Method method,
             final FacetHolder holder) {
 
-        if (property == null) {
-            return null;
-        }
-
         final Class<?> returnType = method.getReturnType();
         if (returnType.isPrimitive()) {
             return new MandatoryFacetForPropertyAnnotation.Primitive(holder);
         }
 
-        final Optionality optionality = property.optionality();
-        switch (optionality) {
-            case DEFAULT:
-                // do nothing here; instead will rely on MandatoryFromJdoColumnAnnotationFacetFactory to perform
-                // the remaining processing
-                return null;
-            case MANDATORY:
-                return new MandatoryFacetForPropertyAnnotation.Required(holder);
-            case OPTIONAL:
-                return new MandatoryFacetForPropertyAnnotation.Optional(holder);
-        }
-        return null;
+        return properties.stream()
+                .map(Property::optionality)
+                .filter(optionality -> optionality != Optionality.NOT_SPECIFIED)
+                .findFirst()
+                .map(optionality -> {
+                    switch (optionality) {
+                        case DEFAULT:
+                            // do nothing here; instead will rely on MandatoryFromJdoColumnAnnotationFacetFactory to perform
+                            // the remaining processing
+                            return null;
+                        case MANDATORY:
+                            return new MandatoryFacetForPropertyAnnotation.Required(holder);
+                        case OPTIONAL:
+                            return new MandatoryFacetForPropertyAnnotation.Optional(holder);
+                    }
+                    throw new IllegalStateException("optionality '" + optionality + "' not recognised");
+                })
+                .orElse(null);
     }
 
     public static class Primitive extends MandatoryFacetForPropertyAnnotation {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/maxlength/MaxLengthFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/maxlength/MaxLengthFacetForPropertyAnnotation.java
index 6716c0f..2111570 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/maxlength/MaxLengthFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/maxlength/MaxLengthFacetForPropertyAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.maxlength;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
@@ -27,16 +29,15 @@ import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacetAb
 public class MaxLengthFacetForPropertyAnnotation extends MaxLengthFacetAbstract {
 
     public static MaxLengthFacet create(
-            final Property property,
+            final List<Property> properties,
             final FacetHolder holder) {
 
-        if (property == null) {
-            return null;
-        }
-        final int maxLength = property.maxLength();
-        return maxLength != -1
-                ? new MaxLengthFacetForPropertyAnnotation(maxLength, holder)
-                : null;
+        return properties.stream()
+                .map(Property::maxLength)
+                .filter(maxLength -> maxLength != -1)
+                .findFirst()
+                .map(maxLength -> new MaxLengthFacetForPropertyAnnotation(maxLength, holder))
+                .orElse(null);
     }
 
     private MaxLengthFacetForPropertyAnnotation(final int value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/mustsatisfy/MustSatisfySpecificationFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/mustsatisfy/MustSatisfySpecificationFacetForPropertyAnnotation.java
index 40c10fd..fa4be84 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/mustsatisfy/MustSatisfySpecificationFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/mustsatisfy/MustSatisfySpecificationFacetForPropertyAnnotation.java
@@ -19,8 +19,11 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.mustsatisfy;
 
+import java.util.Arrays;
 import java.util.List;
-import com.google.common.collect.Lists;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.spec.Specification;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -31,23 +34,22 @@ import org.apache.isis.core.metamodel.services.ServicesInjector;
 public class MustSatisfySpecificationFacetForPropertyAnnotation extends MustSatisfySpecificationFacetAbstract {
 
     public static Facet create(
-            final Property property,
+            final List<Property> properties,
             final FacetHolder holder,
             final ServicesInjector servicesInjector) {
 
-        if (property == null) {
-            return null;
-        }
-
-        final Class<?>[] values = property.mustSatisfy();
-        final List<Specification> specifications = Lists.newArrayList();
-        for (final Class<?> value : values) {
-            final Specification specification = newSpecificationElseNull(value);
-            if (specification != null) {
-                specifications.add(specification);
-            }
-        }
-        return specifications.size() > 0 ? new MustSatisfySpecificationFacetForPropertyAnnotation(specifications, holder, servicesInjector) : null;
+        List<Specification> specifications = properties.stream()
+                .map(Property::mustSatisfy)
+                .flatMap(classes ->
+                        Arrays.stream(classes)
+                              .map(MustSatisfySpecificationFacetAbstract::newSpecificationElseNull)
+                              .filter(Objects::nonNull)
+                )
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        return specifications.size() > 0
+                ? new MustSatisfySpecificationFacetForPropertyAnnotation(specifications, holder, servicesInjector)
+                : null;
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/notpersisted/NotPersistedFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/notpersisted/NotPersistedFacetForPropertyAnnotation.java
index bd7d87b..faa6b36 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/notpersisted/NotPersistedFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/notpersisted/NotPersistedFacetForPropertyAnnotation.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.notpersisted;
 
+import java.util.List;
+
+import org.apache.isis.applib.annotation.MementoSerialization;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacet;
@@ -31,18 +34,14 @@ public class NotPersistedFacetForPropertyAnnotation extends NotPersistedFacetAbs
     }
 
     public static NotPersistedFacet create(
-            final Property property,
+            final List<Property> properties,
             final FacetHolder holder) {
 
-        if (property == null) {
-            return null;
-        }
-
-        final boolean notPersisted = property.notPersisted();
-        final boolean persisted = !notPersisted;
-        if(persisted) {
-            return null;
-        }
-        return new NotPersistedFacetForPropertyAnnotation(holder);
+        return properties.stream()
+                .map(Property::mementoSerialization)
+                .filter(mementoSerialization -> mementoSerialization == MementoSerialization.EXCLUDED)
+                .findFirst()
+                .map(mementoSerialization -> new NotPersistedFacetForPropertyAnnotation(holder))
+                .orElse(null);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotation.java
index d8b19a7..7d00aa7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.publishing;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -29,29 +31,44 @@ import org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropert
 public class PublishedPropertyFacetForPropertyAnnotation extends PublishedPropertyFacetAbstract {
 
     public static PublishedPropertyFacet create(
-            final Property property,
+            final List<Property> properties,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        final Publishing publishing = property != null ? property.publishing() : Publishing.AS_CONFIGURED;
+        final PublishPropertiesConfiguration setting = PublishPropertiesConfiguration.parse(configuration);
+
+        return properties.stream()
+                .map(Property::publishing)
+                .filter(publishing -> publishing != Publishing.NOT_SPECIFIED)
+                .findFirst()
+                .map(publishing -> {
 
-        switch (publishing) {
-            case AS_CONFIGURED:
-                final PublishPropertiesConfiguration setting = PublishPropertiesConfiguration.parse(configuration);
-                switch (setting) {
-                case NONE:
+                    switch (publishing) {
+                    case AS_CONFIGURED:
+                        switch (setting) {
+                        case NONE:
+                            return null;
+                        default:
+                            return (PublishedPropertyFacet)
+                                    new PublishedPropertyFacetForPropertyAnnotationAsConfigured(holder);
+                        }
+                    case DISABLED:
+                        return null;
+                    case ENABLED:
+                        return new PublishedPropertyFacetForPropertyAnnotation(holder);
+                    }
                     return null;
-                default:
-                    return property != null
-                            ? new PublishedPropertyFacetForPropertyAnnotationAsConfigured(holder)
-                            : new PublishedPropertyFacetFromConfiguration(holder);
-                }
-            case DISABLED:
-                return null;
-            case ENABLED:
-                return new PublishedPropertyFacetForPropertyAnnotation(holder);
-        }
-        return null;
+
+                })
+                .orElseGet(() -> {
+                    switch (setting) {
+                    case NONE:
+                        return null;
+                    default:
+                        return new PublishedPropertyFacetFromConfiguration(holder);
+                    }
+                });
+
     }
 
     public PublishedPropertyFacetForPropertyAnnotation(final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/regex/RegExFacetForPatternAnnotationOnProperty.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/regex/RegExFacetForPatternAnnotationOnProperty.java
index 4db36e6..c2363da 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/regex/RegExFacetForPatternAnnotationOnProperty.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/regex/RegExFacetForPatternAnnotationOnProperty.java
@@ -19,8 +19,11 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.regex;
 
+import java.util.List;
 import java.util.regex.Pattern;
 
+import com.google.common.base.Strings;
+
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.objectvalue.regex.RegExFacet;
@@ -31,21 +34,19 @@ public class RegExFacetForPatternAnnotationOnProperty extends RegExFacetAbstract
     private final Pattern pattern;
 
     public static RegExFacet create(
-            final javax.validation.constraints.Pattern annotation, final Class<?> returnType, final FacetHolder holder) {
-
-        if(annotation == null) {
-            return null;
-        }
+            final List<javax.validation.constraints.Pattern> patterns, final Class<?> returnType, final FacetHolder holder) {
 
         if (!Annotations.isString(returnType)) {
             return null;
         }
 
-        final String regexp = annotation.regexp();
-        final javax.validation.constraints.Pattern.Flag[] flags = annotation.flags();
-        final String message = annotation.message();
-
-        return new RegExFacetForPatternAnnotationOnProperty(regexp, flags, message, holder);
+        return patterns.stream()
+                .filter(pattern -> Strings.emptyToNull(pattern.regexp()) != null)
+                .findFirst()
+                .map(pattern ->
+                        new RegExFacetForPatternAnnotationOnProperty(
+                                pattern.regexp(), pattern.flags(), pattern.message(), holder))
+                .orElse(null);
     }
 
     private RegExFacetForPatternAnnotationOnProperty(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/regex/RegExFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/regex/RegExFacetForPropertyAnnotation.java
index fe5637e..297e72f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/regex/RegExFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/regex/RegExFacetForPropertyAnnotation.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.regex;
 
+import java.util.List;
 import java.util.regex.Pattern;
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.Property;
@@ -32,27 +33,22 @@ public class RegExFacetForPropertyAnnotation extends RegExFacetAbstract {
     private final Pattern pattern;
 
     public static RegExFacet create(
-            final Property annotation,
+            final List<Property> properties,
             final Class<?> returnType,
             final FacetHolder holder) {
 
-        if (annotation == null) {
-            return null;
-        }
-
         if (!Annotations.isString(returnType)) {
             return null;
         }
 
-        final String pattern = annotation.regexPattern();
-        if(Strings.isNullOrEmpty(pattern)) {
-            return null;
-        }
-
-        final String replacement = annotation.regexPatternReplacement();
-        final int patternFlags = annotation.regexPatternFlags();
+        return properties.stream()
+                .filter(property -> Strings.emptyToNull(property.regexPattern()) != null)
+                .findFirst()
+                .map(property -> new RegExFacetForPropertyAnnotation(
+                        property.regexPattern(), property.regexPatternFlags(), holder,
+                        property.regexPatternReplacement()))
+                .orElse(null);
 
-        return new RegExFacetForPropertyAnnotation(pattern, patternFlags, holder, replacement);
     }
 
     private RegExFacetForPropertyAnnotation(final String pattern, final int patternFlags, final FacetHolder holder, final String replacement) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyLayoutAnnotation.java
index a4984b6..6c4c5f5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyLayoutAnnotation.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+import java.util.Objects;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +30,17 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstr
 
 public class CssClassFacetForPropertyLayoutAnnotation extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(PropertyLayout propertyLayout, FacetHolder holder) {
-        if(propertyLayout == null) {
-            return null;
-        }
-        final String cssClass = Strings.emptyToNull(propertyLayout.cssClass());
-        return cssClass != null ? new CssClassFacetForPropertyLayoutAnnotation(cssClass, holder) : null;
+    public static CssClassFacet create(
+            final List<PropertyLayout> propertyLayouts,
+            final FacetHolder holder) {
+
+        return propertyLayouts.stream()
+                .map(PropertyLayout::cssClass)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(cssClass -> new CssClassFacetForPropertyLayoutAnnotation(cssClass, holder))
+                .orElse(null);
     }
 
     private CssClassFacetForPropertyLayoutAnnotation(String value, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyLayoutAnnotation.java
index 7a2b062..24e3742 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyLayoutAnnotation.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+import java.util.Objects;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +30,17 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbs
 
 public class DescribedAsFacetForPropertyLayoutAnnotation extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(PropertyLayout propertyLayout, FacetHolder holder) {
-        if(propertyLayout == null) {
-            return null;
-        }
-        final String describedAs = Strings.emptyToNull(propertyLayout.describedAs());
-        return describedAs != null ? new DescribedAsFacetForPropertyLayoutAnnotation(describedAs, holder) : null;
+    public static DescribedAsFacet create(
+            final List<PropertyLayout> propertyLayouts,
+            final FacetHolder holder) {
+
+        return propertyLayouts.stream()
+                .map(PropertyLayout::describedAs)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(describedAs -> new DescribedAsFacetForPropertyLayoutAnnotation(describedAs, holder))
+                .orElse(null);
     }
 
     private DescribedAsFacetForPropertyLayoutAnnotation(String value, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutAnnotation.java
index 307ef7e..ccc77a6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -28,12 +30,16 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 
 public class HiddenFacetForPropertyLayoutAnnotation extends HiddenFacetAbstract {
 
-    public static HiddenFacet create(final PropertyLayout propertyLayout, final FacetHolder holder) {
-        if (propertyLayout == null) {
-            return null;
-        }
-        final Where where = propertyLayout.hidden();
-        return where != null && where != Where.NOT_SPECIFIED ? new HiddenFacetForPropertyLayoutAnnotation(where, holder) : null;
+    public static HiddenFacet create(
+            final List<PropertyLayout> propertyLayouts,
+            final FacetHolder holder) {
+
+        return propertyLayouts.stream()
+                .map(PropertyLayout::hidden)
+                .filter(where -> where != null && where != Where.NOT_SPECIFIED)
+                .findFirst()
+                .map(where -> new HiddenFacetForPropertyLayoutAnnotation(where, holder))
+                .orElse(null);
     }
 
     private HiddenFacetForPropertyLayoutAnnotation(final Where where, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyLayoutAnnotation.java
index c35bd8c..ee94231 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +29,16 @@ import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacetAbs
 
 public class LabelAtFacetForPropertyLayoutAnnotation extends LabelAtFacetAbstract {
 
-    public static LabelAtFacet create(final PropertyLayout propertyLayout, FacetHolder holder) {
-        if (propertyLayout == null) {
-            return null;
-        }
-        final LabelPosition labelPosition = propertyLayout.labelPosition();
-        return labelPosition != null ? new LabelAtFacetForPropertyLayoutAnnotation(labelPosition, holder) : null;
+    public static LabelAtFacet create(
+            final List<PropertyLayout> propertyLayouts,
+            final FacetHolder holder) {
+
+        return propertyLayouts.stream()
+                .map(PropertyLayout::labelPosition)
+                .filter(labelPosition -> labelPosition != LabelPosition.NOT_SPECIFIED)
+                .findFirst()
+                .map(labelPosition -> new LabelAtFacetForPropertyLayoutAnnotation(labelPosition, holder))
+                .orElse(null);
     }
 
     private LabelAtFacetForPropertyLayoutAnnotation(final LabelPosition value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyLayoutAnnotation.java
index 0e6582d..b7b31f0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacet;
@@ -26,12 +28,15 @@ import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFace
 
 public class MultiLineFacetForPropertyLayoutAnnotation extends MultiLineFacetAbstract {
 
-    public static MultiLineFacet create(PropertyLayout propertyLayout, FacetHolder holder) {
-        if(propertyLayout == null) {
-            return null;
-        }
-        final int multiLine = propertyLayout.multiLine();
-        return multiLine > 1 ? new MultiLineFacetForPropertyLayoutAnnotation(multiLine, false, holder) : null;
+    public static MultiLineFacet create(
+            final List<PropertyLayout> propertyLayouts, final FacetHolder holder) {
+
+        return propertyLayouts.stream()
+                .map(PropertyLayout::multiLine)
+                .filter(multiLine -> multiLine > 1)
+                .findFirst()
+                .map(multiLine -> new MultiLineFacetForPropertyLayoutAnnotation(multiLine, false, holder))
+                .orElse(null);
     }
 
     private MultiLineFacetForPropertyLayoutAnnotation(int numberOfLines, boolean preventWrapping, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotation.java
index 8fef193..ec395f4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotation.java
@@ -19,7 +19,10 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
+
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
@@ -27,12 +30,15 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForPropertyLayoutAnnotation extends NamedFacetAbstract {
 
-    public static NamedFacet create(PropertyLayout propertyLayout, FacetHolder holder) {
-        if(propertyLayout == null) {
-            return null;
-        }
-        final String named = Strings.emptyToNull(propertyLayout.named());
-        return named != null ? new NamedFacetForPropertyLayoutAnnotation(named, propertyLayout.namedEscaped(), holder) : null;
+    public static NamedFacet create(
+            final List<PropertyLayout> propertyLayouts,
+            final FacetHolder holder) {
+        return propertyLayouts.stream()
+                .filter(propertyLayout -> Strings.emptyToNull(propertyLayout.named()) != null)
+                .findFirst()
+                .map(propertyLayout -> new NamedFacetForPropertyLayoutAnnotation(
+                                            propertyLayout.named(), propertyLayout.namedEscaped(), holder))
+                .orElse(null);
     }
 
     private NamedFacetForPropertyLayoutAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
index c9b965c..7892d25 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -27,7 +29,6 @@ import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleConfi
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAsConfigured;
-import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetFallBackToInline;
 
 public class PromptStyleFacetForPropertyLayoutAnnotation extends PromptStyleFacetAbstract {
 
@@ -39,50 +40,46 @@ public class PromptStyleFacetForPropertyLayoutAnnotation extends PromptStyleFace
     }
 
     public static PromptStyleFacet create(
-            final PropertyLayout propertyLayout,
+            final List<PropertyLayout> propertyLayouts,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        PromptStyle promptStyle = propertyLayout != null? propertyLayout.promptStyle() : null;
+        return propertyLayouts.stream()
+                .map(PropertyLayout::promptStyle)
+                .filter(promptStyle -> promptStyle != PromptStyle.NOT_SPECIFIED)
+                .findFirst()
+                .map(promptStyle -> {
 
-        if(promptStyle == null) {
-            if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
-                // do not replace
-                return null;
-            }
+                    switch (promptStyle) {
+                    case DIALOG:
+                    case INLINE:
+                        return new PromptStyleFacetForPropertyLayoutAnnotation(promptStyle, holder);
+                    case INLINE_AS_IF_EDIT:
+                        return new PromptStyleFacetForPropertyLayoutAnnotation(PromptStyle.INLINE, holder);
 
-            return new PromptStyleFacetFallBackToInline(holder);
-        } else {
+                    case AS_CONFIGURED:
 
-            switch (promptStyle) {
-                case DIALOG:
-                case INLINE:
-                    return new PromptStyleFacetForPropertyLayoutAnnotation(promptStyle, holder);
-                case INLINE_AS_IF_EDIT:
-                    return new PromptStyleFacetForPropertyLayoutAnnotation(PromptStyle.INLINE, holder);
+                        // do not replace
+                        if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
+                            return null;
+                        }
 
-                case AS_CONFIGURED:
+                        promptStyle = PromptStyleConfiguration.parse(configuration);
+                        return new PromptStyleFacetAsConfigured(promptStyle, holder);
 
-                    // do not replace
-                    if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
-                        return null;
                     }
-
-                    promptStyle = PromptStyleConfiguration.parse(configuration);
-                    return new PromptStyleFacetAsConfigured(promptStyle, holder);
-
-                default:
-
-                    // do not replace
-                    if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
-                        return null;
-                    }
-
-                    promptStyle = PromptStyleConfiguration.parse(configuration);
-                    return new PromptStyleFacetAsConfigured(promptStyle, holder);
-            }
-        }
-
+                    throw new IllegalStateException("promptStyle '" + promptStyle + "' not recognised");
+                })
+                .orElseGet(() -> {
+
+                        // do not replace
+                        if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
+                            return null;
+                        }
+
+                        PromptStyle promptStyle = PromptStyleConfiguration.parse(configuration);
+                        return new PromptStyleFacetAsConfigured(promptStyle, holder);
+                });
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
index 45f2bc3..6884548 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import java.lang.reflect.Method;
+import java.util.List;
 
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -50,73 +51,73 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
     public void process(final ProcessMethodContext processMethodContext) {
 
         final FacetHolder holder = facetHolderFrom(processMethodContext);
-        final PropertyLayout propertyLayout = propertyLayoutAnnotationFrom(processMethodContext);
+        final List<PropertyLayout> propertyLayouts = propertyLayoutsFrom(processMethodContext);
 
-        processCssClass(holder, propertyLayout);
+        processCssClass(holder, propertyLayouts);
 
-        processDescribedAs(holder, propertyLayout);
+        processDescribedAs(holder, propertyLayouts);
 
-        processPromptStyle(holder, propertyLayout);
+        processPromptStyle(holder, propertyLayouts);
 
-        processHidden(holder, propertyLayout);
+        processHidden(holder, propertyLayouts);
 
-        processLabelAt(holder, propertyLayout);
+        processLabelAt(holder, propertyLayouts);
 
-        processMultiLine(holder, propertyLayout);
+        processMultiLine(holder, propertyLayouts);
 
-        processNamed(holder, propertyLayout);
+        processNamed(holder, propertyLayouts);
 
-        processRenderedAdjusted(holder, propertyLayout);
+        processRenderedAdjusted(holder, propertyLayouts);
 
-        processTypicalLength(holder, propertyLayout);
+        processTypicalLength(holder, propertyLayouts);
 
-        processUnchanging(holder, propertyLayout);
+        processUnchanging(holder, propertyLayouts);
     }
 
-    void processCssClass(final FacetHolder holder, final PropertyLayout propertyLayout) {
+    void processCssClass(final FacetHolder holder, final List<PropertyLayout> propertyLayout) {
         CssClassFacet cssClassFacet = CssClassFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
         FacetUtil.addFacet(cssClassFacet);
     }
 
     void processDescribedAs(
             final FacetHolder holder,
-            final PropertyLayout propertyLayout) {
+            final List<PropertyLayout> propertyLayout) {
         DescribedAsFacet describedAsFacet = DescribedAsFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
         FacetUtil.addFacet(describedAsFacet);
     }
 
-    void processPromptStyle(final FacetHolder holder, final PropertyLayout propertyLayout) {
+    void processPromptStyle(final FacetHolder holder, final List<PropertyLayout> propertyLayout) {
         PromptStyleFacet promptStyleFacet = PromptStyleFacetForPropertyLayoutAnnotation
                 .create(propertyLayout, getConfiguration(), holder);
 
         FacetUtil.addFacet(promptStyleFacet);
     }
 
-    void processHidden(final FacetHolder holder, final PropertyLayout propertyLayout) {
+    void processHidden(final FacetHolder holder, final List<PropertyLayout> propertyLayout) {
         HiddenFacet hiddenFacet = HiddenFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
         FacetUtil.addFacet(hiddenFacet);
     }
 
     void processLabelAt(
             final FacetHolder holder,
-            final PropertyLayout propertyLayout) {
+            final List<PropertyLayout> propertyLayout) {
         LabelAtFacet labelAtFacet = LabelAtFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
         FacetUtil.addFacet(labelAtFacet);
     }
 
-    void processMultiLine(final FacetHolder holder, final PropertyLayout propertyLayout) {
+    void processMultiLine(final FacetHolder holder, final List<PropertyLayout> propertyLayout) {
         MultiLineFacet multiLineFacet = MultiLineFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
         FacetUtil.addFacet(multiLineFacet);
     }
 
-    void processNamed(final FacetHolder holder, final PropertyLayout propertyLayout) {
+    void processNamed(final FacetHolder holder, final List<PropertyLayout> propertyLayout) {
         NamedFacet namedFacet = NamedFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
         FacetUtil.addFacet(namedFacet);
     }
 
     void processRenderedAdjusted(
             final FacetHolder holder,
-            final PropertyLayout propertyLayout) {
+            final List<PropertyLayout> propertyLayout) {
         RenderedAdjustedFacet renderedAdjustedFacet = RenderedAdjustedFacetForPropertyLayoutAnnotation
                 .create(propertyLayout, holder);
         FacetUtil.addFacet(renderedAdjustedFacet);
@@ -124,7 +125,7 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
 
     void processTypicalLength(
             final FacetHolder holder,
-            final PropertyLayout propertyLayout) {
+            final List<PropertyLayout> propertyLayout) {
         TypicalLengthFacet typicalLengthFacet = TypicalLengthFacetForPropertyLayoutAnnotation
                 .create(propertyLayout, holder);
         FacetUtil.addFacet(typicalLengthFacet);
@@ -132,7 +133,7 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
 
     void processUnchanging(
             final FacetHolder holder,
-            final PropertyLayout propertyLayout) {
+            final List<PropertyLayout> propertyLayout) {
         UnchangingFacet unchangingFacet = UnchangingFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
         FacetUtil.addFacet(unchangingFacet);
     }
@@ -188,7 +189,7 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
         return processMethodContext.getFacetHolder();
     }
 
-    PropertyLayout propertyLayoutAnnotationFrom(final ProcessMethodContext processMethodContext) {
+    List<PropertyLayout> propertyLayoutsFrom(final ProcessMethodContext processMethodContext) {
         final Method method = processMethodContext.getMethod();
         return Annotations.getAnnotations(method, PropertyLayout.class);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyLayoutAnnotation.java
index bb3f0fb..c23643b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyLayoutAnnotation.java
@@ -19,19 +19,34 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.PropertyLayout;
+import org.apache.isis.applib.annotation.RenderDayPolicy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacetAbstract;
 
 public class RenderedAdjustedFacetForPropertyLayoutAnnotation extends RenderedAdjustedFacetAbstract {
 
-    public static RenderedAdjustedFacet create(PropertyLayout propertyLayout, FacetHolder holder) {
-        if(propertyLayout == null) {
-            return null;
-        }
-        final boolean renderedAsDayBefore = propertyLayout.renderedAsDayBefore();
-        return renderedAsDayBefore ? new RenderedAdjustedFacetForPropertyLayoutAnnotation(holder) : null;
+    public static RenderedAdjustedFacet create(
+            final List<PropertyLayout> propertyLayouts,
+            final FacetHolder holder) {
+
+        return propertyLayouts.stream()
+                .map(PropertyLayout::renderDay)
+                .filter(renderDay -> renderDay != RenderDayPolicy.NOT_SPECIFIED)
+                .findFirst()
+                .map(renderDay -> {
+                    switch (renderDay) {
+                    case AS_DAY:
+                        return null;
+                    case AS_DAY_BEFORE:
+                        return new RenderedAdjustedFacetForPropertyLayoutAnnotation(holder);
+                    }
+                    throw new IllegalStateException("renderDay '" + renderDay + "' not recognised");
+                })
+                .orElse(null);
     }
 
     public static final int ADJUST_BY = -1;
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 8d50e35..ccb23ac 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
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
@@ -26,12 +28,16 @@ import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengt
 
 public class TypicalLengthFacetForPropertyLayoutAnnotation extends TypicalLengthFacetAbstract {
 
-    public static TypicalLengthFacet create(PropertyLayout propertyLayout, FacetHolder holder) {
-        if(propertyLayout == null) {
-            return null;
-        }
-        final int typicalLength = propertyLayout.typicalLength();
-        return typicalLength != -1 ? new TypicalLengthFacetForPropertyLayoutAnnotation(typicalLength, holder) : null;
+    public static TypicalLengthFacet create(
+            final List<PropertyLayout> propertyLayouts,
+            final FacetHolder holder) {
+
+        return propertyLayouts.stream()
+                .map(PropertyLayout::typicalLength)
+                .filter(typicalLength -> typicalLength != -1)
+                .findFirst()
+                .map(typicalLength -> new TypicalLengthFacetForPropertyLayoutAnnotation(typicalLength, holder))
+                .orElse(null);
     }
 
     private final int typicalLength;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/UnchangingFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/UnchangingFacetForPropertyLayoutAnnotation.java
index f9f5142..0458a11 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/UnchangingFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/UnchangingFacetForPropertyLayoutAnnotation.java
@@ -19,19 +19,37 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.PropertyLayout;
+import org.apache.isis.applib.annotation.Repainting;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
 import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacetAbstract;
 
 public class UnchangingFacetForPropertyLayoutAnnotation extends UnchangingFacetAbstract {
 
-    public static UnchangingFacet create(PropertyLayout propertyLayout, FacetHolder holder) {
-        if(propertyLayout == null) {
-            return null;
-        }
-        final boolean isUnchanging = propertyLayout.unchanging();
-        return new UnchangingFacetForPropertyLayoutAnnotation(isUnchanging, holder);
+    public static UnchangingFacet create(
+            final List<PropertyLayout> propertyLayouts,
+            final FacetHolder holder) {
+
+        return propertyLayouts.stream()
+                .map(PropertyLayout::repainting)
+                .filter(repainting -> repainting != Repainting.NOT_SPECIFIED)
+                .findFirst()
+                .map(repainting -> {
+                    boolean unchanging;
+                    switch (repainting) {
+                    case REPAINT:
+                        unchanging = false;
+                        return new UnchangingFacetForPropertyLayoutAnnotation(unchanging, holder);
+                    case NO_REPAINT:
+                        unchanging = true;
+                        return new UnchangingFacetForPropertyLayoutAnnotation(unchanging, holder);
+                    }
+                    throw new IllegalStateException("repainting '" + repainting + "' not recognised");
+                })
+                .orElse(null);
     }
 
     private UnchangingFacetForPropertyLayoutAnnotation(final boolean unchanging, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java
index a3af30a..6dea94d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java
@@ -43,7 +43,7 @@ public class JdoDatastoreIdentityAnnotationFacetFactory extends FacetFactoryAbst
             return;
         }
 
-        final DatastoreIdentity annotation = Annotations.getAnnotations(cls, DatastoreIdentity.class);
+        final DatastoreIdentity annotation = Annotations.getAnnotation(cls, DatastoreIdentity.class);
         if (annotation == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
index c24aaa5..303f24c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
@@ -46,7 +46,7 @@ public class JdoDiscriminatorAnnotationFacetFactory extends FacetFactoryAbstract
             return;
         }
 
-        final Discriminator annotation = Annotations.getAnnotations(processClassContext.getCls(), Discriminator.class);
+        final Discriminator annotation = Annotations.getAnnotation(processClassContext.getCls(), Discriminator.class);
         if (annotation == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
index a81796e..e08d788 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
@@ -62,7 +62,7 @@ public class JdoQueryAnnotationFacetFactory extends FacetFactoryAbstract impleme
             return;
         }
 
-        final Queries namedQueriesAnnotation = Annotations.getAnnotations(cls, Queries.class);
+        final Queries namedQueriesAnnotation = Annotations.getAnnotation(cls, Queries.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
         
         if (namedQueriesAnnotation != null) {
@@ -71,7 +71,7 @@ public class JdoQueryAnnotationFacetFactory extends FacetFactoryAbstract impleme
             return;
         }
 
-        final Query namedQueryAnnotation = Annotations.getAnnotations(cls, Query.class);
+        final Query namedQueryAnnotation = Annotations.getAnnotation(cls, Query.class);
         if (namedQueryAnnotation != null) {
             FacetUtil.addFacet(new JdoQueryFacetAnnotation(
                     namedQueryAnnotation, facetHolder));
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
index 3cf8034..980043a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
@@ -42,7 +42,7 @@ public class JdoPrimaryKeyAnnotationFacetFactory extends FacetFactoryAbstract {
             return;
         }
 
-        final PrimaryKey annotation = Annotations.getAnnotations(processMethodContext.getMethod(), PrimaryKey.class);
+        final PrimaryKey annotation = Annotations.getAnnotation(processMethodContext.getMethod(), PrimaryKey.class);
         if (annotation == null) {
             return;
         }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/NotPersistedAnnotationOnCollectionFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/NotPersistedAnnotationOnCollectionFacetFactoryTest.java
index ba5ada1..cc6ad70 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/NotPersistedAnnotationOnCollectionFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/NotPersistedAnnotationOnCollectionFacetFactoryTest.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.facets.collections.collection;
 import java.lang.reflect.Method;
 import java.util.Collection;
 
+import org.apache.isis.applib.annotation.MementoSerialization;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
@@ -43,7 +44,7 @@ public class NotPersistedAnnotationOnCollectionFacetFactoryTest extends Abstract
         }
         class Customer {
             @SuppressWarnings("unused")
-            @org.apache.isis.applib.annotation.Collection(notPersisted = true)
+            @org.apache.isis.applib.annotation.Collection(mementoSerialization = MementoSerialization.EXCLUDED)
             public Collection<Order> getOrders() {
                 return null;
             }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java
index 6016cfb..dafdb4b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobject;
 
+import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
@@ -45,7 +46,7 @@ public class ChoicesFacetFromBoundedAnnotationFactoryTest extends AbstractFacetF
     }
 
     public void testBoundedAnnotationPickedUpOnClass() {
-        @DomainObject(bounded = true)
+        @DomainObject(bounding = Bounding.BOUNDED)
         class Customer {
         }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 7b0eed4..78d1e06 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -27,6 +27,7 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.services.HasTransactionId;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -482,11 +483,11 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
     public static class Bounded extends DomainObjectAnnotationFacetFactoryTest {
 
-        @DomainObject(bounded = true)
+        @DomainObject(bounding = Bounding.BOUNDED)
         class CustomerWithDomainObjectAndBoundedSetToTrue {
         }
 
-        @DomainObject(bounded = false)
+        @DomainObject(bounding = Bounding.UNBOUNDED)
         class CustomerWithDomainObjectAndBoundedSetToFalse {
         }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleFacetFromPropertyAnnotation_Test.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleFacetFromPropertyAnnotation_Test.java
index a9e5e04..e878863 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleFacetFromPropertyAnnotation_Test.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleFacetFromPropertyAnnotation_Test.java
@@ -16,6 +16,8 @@
  */
 package org.apache.isis.core.metamodel.facets.properties.promptstyle;
 
+import java.util.Collections;
+
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
 import org.hamcrest.TypeSafeMatcher;
@@ -65,7 +67,7 @@ public class PromptStyleFacetFromPropertyAnnotation_Test {
             }});
 
             PromptStyleFacet facet = PromptStyleFacetForPropertyLayoutAnnotation
-                    .create(mockPropertyLayout, mockConfiguration, mockFacetHolder);
+                    .create(Collections.singletonList(mockPropertyLayout), mockConfiguration, mockFacetHolder);
 
             Assert.assertThat(facet, is((Matcher) anInstanceOf(PromptStyleFacetForPropertyLayoutAnnotation.class)));
             Assert.assertThat(facet.value(), is(PromptStyle.DIALOG));
@@ -83,7 +85,7 @@ public class PromptStyleFacetFromPropertyAnnotation_Test {
 
 
             PromptStyleFacet facet = PromptStyleFacetForPropertyLayoutAnnotation
-                    .create(mockPropertyLayout, mockConfiguration, mockFacetHolder);
+                    .create(Collections.singletonList(mockPropertyLayout), mockConfiguration, mockFacetHolder);
 
             Assert.assertThat(facet, is((Matcher) anInstanceOf(PromptStyleFacetForPropertyLayoutAnnotation.class)));
             Assert.assertThat(facet.value(), is(PromptStyle.INLINE));
@@ -104,7 +106,7 @@ public class PromptStyleFacetFromPropertyAnnotation_Test {
             }});
 
             PromptStyleFacet facet = PromptStyleFacetForPropertyLayoutAnnotation
-                    .create(mockPropertyLayout, mockConfiguration, mockFacetHolder);
+                    .create(Collections.singletonList(mockPropertyLayout), mockConfiguration, mockFacetHolder);
 
             Assert.assertThat(facet, is((Matcher) anInstanceOf(PromptStyleFacetAsConfigured.class)));
             Assert.assertThat(facet.value(), is(PromptStyle.INLINE));
@@ -124,7 +126,7 @@ public class PromptStyleFacetFromPropertyAnnotation_Test {
             }});
 
             PromptStyleFacet facet = PromptStyleFacetForPropertyLayoutAnnotation
-                    .create(mockPropertyLayout, mockConfiguration, mockFacetHolder);
+                    .create(Collections.singletonList(mockPropertyLayout), mockConfiguration, mockFacetHolder);
 
             Assert.assertThat(facet, is(nullValue()));
         }
@@ -143,7 +145,7 @@ public class PromptStyleFacetFromPropertyAnnotation_Test {
             }});
 
             PromptStyleFacet facet = PromptStyleFacetForPropertyLayoutAnnotation
-                    .create(mockPropertyLayout, mockConfiguration, mockFacetHolder);
+                    .create(Collections.singletonList(mockPropertyLayout), mockConfiguration, mockFacetHolder);
 
             Assert.assertThat(facet.value(), is(PromptStyle.INLINE));
             Assert.assertThat(facet, is((Matcher) anInstanceOf(PromptStyleFacetFallBackToInline.class)));
@@ -163,7 +165,7 @@ public class PromptStyleFacetFromPropertyAnnotation_Test {
             }});
 
             PromptStyleFacet facet = PromptStyleFacetForPropertyLayoutAnnotation
-                    .create(mockPropertyLayout, mockConfiguration, mockFacetHolder);
+                    .create(Collections.singletonList(mockPropertyLayout), mockConfiguration, mockFacetHolder);
 
             Assert.assertThat(facet, is(nullValue()));
         }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/NotPersistedAnnotationOnPropertyFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/NotPersistedAnnotationOnPropertyFacetFactoryTest.java
index 7931928..816dc16 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/NotPersistedAnnotationOnPropertyFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/NotPersistedAnnotationOnPropertyFacetFactoryTest.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.properties.property;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.applib.annotation.MementoSerialization;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
@@ -41,7 +42,7 @@ public class NotPersistedAnnotationOnPropertyFacetFactoryTest extends AbstractFa
 
         class Customer {
             @SuppressWarnings("unused")
-            @Property(notPersisted = true)
+            @Property(mementoSerialization = MementoSerialization.EXCLUDED)
             public String getFirstName() {
                 return null;
             }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
index f181d7a..963913b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
@@ -29,6 +29,7 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.isis.applib.annotation.MementoSerialization;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Where;
@@ -537,9 +538,7 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
         public void withAnnotation() {
 
             class Customer {
-                @Property(
-                        notPersisted = true
-                )
+                @Property(mementoSerialization = MementoSerialization.EXCLUDED)
                 public String getName() {
                     return null;
                 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyLayoutAnnotationFactoryTest.java
index 0350c83..a177648 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyLayoutAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyLayoutAnnotationFactoryTest.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import java.lang.reflect.Method;
-import java.util.Properties;
+import java.util.List;
 
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.PropertyLayout;
@@ -55,9 +55,9 @@ public class LabelAtFacetForPropertyLayoutAnnotationFactoryTest extends Abstract
 
         // when
         final FacetHolder holder = facetFactory.facetHolderFrom(processMethodContext);
-        final PropertyLayout propertyLayout = facetFactory.propertyLayoutAnnotationFrom(processMethodContext);
+        final List<PropertyLayout> propertyLayouts = facetFactory.propertyLayoutsFrom(processMethodContext);
 
-        facetFactory.processLabelAt(holder, propertyLayout);
+        facetFactory.processLabelAt(holder, propertyLayouts);
 
         // then
         final Facet facet = facetedMethod.getFacet(LabelAtFacet.class);
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotationFactoryTest.java
index ff6022b..d45ff07 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotationFactoryTest.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import java.lang.reflect.Method;
+import java.util.List;
 
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -52,9 +53,9 @@ public class NamedFacetForPropertyLayoutAnnotationFactoryTest extends AbstractFa
                 methodRemover, facetedMethod);
 
         final FacetHolder holder = facetFactory.facetHolderFrom(processMethodContext);
-        final PropertyLayout propertyLayout = facetFactory.propertyLayoutAnnotationFrom(processMethodContext);
+        final List<PropertyLayout> propertyLayouts = facetFactory.propertyLayoutsFrom(processMethodContext);
 
-        facetFactory.processNamed(holder, propertyLayout);
+        facetFactory.processNamed(holder, propertyLayouts);
 
         // then
         final NamedFacet facet = facetedMethod.getFacet(NamedFacet.class);
@@ -81,9 +82,9 @@ public class NamedFacetForPropertyLayoutAnnotationFactoryTest extends AbstractFa
                 methodRemover, facetedMethod);
 
         final FacetHolder holder = facetFactory.facetHolderFrom(processMethodContext);
-        final PropertyLayout propertyLayout = facetFactory.propertyLayoutAnnotationFrom(processMethodContext);
+        final List<PropertyLayout> propertyLayouts = facetFactory.propertyLayoutsFrom(processMethodContext);
 
-        facetFactory.processNamed(holder, propertyLayout);
+        facetFactory.processNamed(holder, propertyLayouts);
 
         // then
         final NamedFacet facet = facetedMethod.getFacet(NamedFacet.class);
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
index c5b46ec..1f3fcc3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
 
 import org.jmock.Expectations;
@@ -27,7 +28,6 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
-import com.google.common.base.Predicate;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -164,7 +164,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
                 one(actionParamPeer).getFacet(NamedFacet.class);
                 will(returnValue(null));
 
-                one(parentAction).getParameters((Predicate<ObjectActionParameter>) with(anything()));
+                one(parentAction).getParameters((Predicate<ObjectActionParameter>) with(Expectations.<Predicate>anything()));
                 will(returnValue(Lists.newArrayList(objectActionParameter)));
             }
         });
@@ -183,7 +183,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
                 one(actionParamPeer).getFacet(NamedFacet.class);
                 will(returnValue(null));
 
-                one(parentAction).getParameters((Predicate<ObjectActionParameter>) with(anything()));
+                one(parentAction).getParameters(with(Expectations.<Predicate>anything()));
                 will(returnValue(Lists.newArrayList(stubObjectActionParameterString, objectActionParameter, stubObjectActionParameterString2)));
             }
         });
@@ -202,7 +202,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
                 one(actionParamPeer).getFacet(NamedFacet.class);
                 will(returnValue(null));
 
-                one(parentAction).getParameters((Predicate<ObjectActionParameter>) with(anything()));
+                one(parentAction).getParameters(with(Expectations.<Predicate>anything()));
                 will(returnValue(Lists.newArrayList(stubObjectActionParameterString, objectActionParameter, stubObjectActionParameterString2)));
             }
         });
diff --git a/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/DomainServiceProviderMockery.java b/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/DomainServiceProviderMockery.java
index 65e8c41..9814a84 100644
--- a/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/DomainServiceProviderMockery.java
+++ b/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/DomainServiceProviderMockery.java
@@ -27,7 +27,6 @@ import org.jmock.Mockery;
 import org.jmock.api.Action;
 import org.jmock.api.Invocation;
 
-import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.core.unittestsupport.jmocking.JavassistImposteriser;
@@ -84,7 +83,7 @@ class DomainServiceProviderMockery implements DomainServiceProvider {
             mockRepositoryService = (RepositoryService) mock;
             context.checking(new Expectations() {
                 {
-                    allowing(mockRepositoryService).persist(with(anything()));
+                    allowing(mockRepositoryService).persist(with(Expectations.<T>anything()));
                 }
             });
         }

-- 
To stop receiving notification emails like this one, please contact
['"commits@isis.apache.org" <co...@isis.apache.org>'].