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 2019/01/10 07:10:59 UTC

[isis] branch v2 updated (8ef9a72 -> ce55270)

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

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


    from 8ef9a72  ISIS-2067: reinstated WebServer for testing.
     add 15ae5b8  ISIS-1899: update docs - release process
     add 017eacb  ISIS-1899: updates docs for 1.17.0 release
     add 74a1c23  ISIS-1899: updates html template for 1.17.0
     add 53fc418  ISIS-1899: fixes some bad links
     add 7e573ad  ISIS-1899: updates to release notes and migration notes
     add 74f46ee  ISIS-1899: fixes index.html for 1.17.0
     add def829a  ISIS-2072: bumps core's parent to latest ASF version (21)
     add 3c2c5c6  ISIS-2078: extends @ActionLayout to allow modal vs sidebar promptStyle to be selected on an action-by-action basis
     add 7cc51fc  ISIS-2078: tidies up StandaloneCollectionPanel, no longer implements ActionPromptProvider
     add c6f8229  ISIS-2078: tidies up StandaloneCollectionPanel, removes unused div for modal dialog
     add 0d0a4a7  ISIS-2078: handles service actions (ie menu items) gracefully if there promptStyle is set to INLINE or INLINE_AS_IF_EDIT
     add 115c700  ISIS-2080: adds LayoutFacet with Method and Fallback implementations
     add f2841bc  ISIS-2080: adds GridService2 and GridLoaderService2 with support for loading different layouts
     add 3b90371  ISIS-2079: improves rebuildMetaModel mixin to return the object being rebuilt.
     add 37aeeeb  ISIS-2079: fixes rebuildMetaModel to return the mixee rather than itself (a mixin)
     add ee80c61  ISIS-2081: updates @ActionLayout and XML to allow redirect policy to be specified on a case-by-case basis.
     add 6b57899  ISIS-2080: updates docs for alternate layouts and also @ActionLayout#redirect
     add b7ebfb6  ISIS-2080: changes naming convention for alternative layout file name
     add c4bb64e  ISIS-2081: adds @DomainObjectLayout(layoutUiEvent=...)
     add 5fcad44  ISIS-2081: updates .adocs
     new 4573d5b  ISIS-2082: updates download.adoc, parameterize using __versions.adoc[].
     new 4a5363a  Merge branch 'master' into v2
     new 17ce576  fixes compile/unit test errors from merge.
     new ce55270  ISIS-2067: adds TODO to the migration-notes.adoc

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


Summary of changes:
 STATUS                                             |   4 +
 .../asciidoc/applib/layout/component/component.xsd |  12 ++
 .../documentation/src/main/asciidoc/doap_isis.rdf  |  48 ++++++
 .../cgcom/_cgcom_post-release-successful.adoc      |  23 +--
 .../rgant/_rgant-ActionLayout_bookmarking.adoc     |  15 +-
 .../guides/rgant/_rgant-ActionLayout_cssClass.adoc |  22 +--
 .../rgant/_rgant-ActionLayout_cssClassFa.adoc      |  21 +--
 .../rgant/_rgant-ActionLayout_describedAs.adoc     |  22 +--
 .../guides/rgant/_rgant-ActionLayout_hidden.adoc   |  31 ++--
 .../guides/rgant/_rgant-ActionLayout_named.adoc    |  29 ++--
 .../guides/rgant/_rgant-ActionLayout_position.adoc |  11 +-
 .../rgant/_rgant-ActionLayout_promptStyle.adoc     |  23 ++-
 .../guides/rgant/_rgant-ActionLayout_redirect.adoc |  62 ++++++++
 .../guides/rgant/_rgant-Action_hidden.adoc         |   9 +-
 .../guides/rgant/_rgant-Action_typeOf.adoc         |   8 +-
 .../rgant/_rgant-CollectionLayout_cssClass.adoc    |  16 +-
 .../rgant/_rgant-CollectionLayout_defaultView.adoc |  19 ++-
 .../rgant/_rgant-CollectionLayout_describedAs.adoc |  12 +-
 .../rgant/_rgant-CollectionLayout_hidden.adoc      |  32 ++--
 .../rgant/_rgant-CollectionLayout_named.adoc       |  36 ++---
 .../rgant/_rgant-CollectionLayout_paged.adoc       |  24 +--
 .../rgant/_rgant-CollectionLayout_sortedBy.adoc    |  14 +-
 .../guides/rgant/_rgant-Collection_editing.adoc    |  11 +-
 .../guides/rgant/_rgant-Collection_hidden.adoc     |  10 +-
 .../guides/rgant/_rgant-Collection_typeOf.adoc     |   6 +-
 .../guides/rgant/_rgant-DomainObjectLayout.adoc    |   6 +
 .../_rgant-DomainObjectLayout_bookmarking.adoc     |   3 +
 .../rgant/_rgant-DomainObjectLayout_cssClass.adoc  |  21 ++-
 .../_rgant-DomainObjectLayout_cssClassFa.adoc      |   9 +-
 .../_rgant-DomainObjectLayout_cssClassUiEvent.adoc |   4 +
 .../_rgant-DomainObjectLayout_describedAs.adoc     |  16 +-
 .../_rgant-DomainObjectLayout_iconUiEvent.adoc     |   7 +-
 .../_rgant-DomainObjectLayout_layoutUiEvent.adoc   | 114 ++++++++++++++
 .../rgant/_rgant-DomainObjectLayout_named.adoc     |  15 +-
 .../rgant/_rgant-DomainObjectLayout_paged.adoc     |   9 +-
 .../rgant/_rgant-DomainObjectLayout_plural.adoc    |   6 +-
 .../_rgant-DomainObjectLayout_titleUiEvent.adoc    |   5 +
 .../rgant/_rgant-DomainServiceLayout_named.adoc    |  13 +-
 .../guides/rgant/_rgant-DomainService_nature.adoc  |   9 +-
 .../rgant/_rgant-ParameterLayout_cssClass.adoc     |  13 +-
 .../_rgant-ParameterLayout_labelPosition.adoc      |  24 +--
 .../guides/rgant/_rgant-ParameterLayout_named.adoc |  14 +-
 .../guides/rgant/_rgant-Parameter_maxLength.adoc   |   8 +-
 .../rgant/_rgant-Parameter_regexPattern.adoc       |   7 +-
 .../rgant/_rgant-PropertyLayout_cssClass.adoc      |  26 ++--
 .../rgant/_rgant-PropertyLayout_describedAs.adoc   |  13 +-
 .../guides/rgant/_rgant-PropertyLayout_hidden.adoc |  35 ++---
 .../rgant/_rgant-PropertyLayout_labelPosition.adoc |  31 ++--
 .../rgant/_rgant-PropertyLayout_multiLine.adoc     |  20 +--
 .../guides/rgant/_rgant-PropertyLayout_named.adoc  |  38 ++---
 .../rgant/_rgant-PropertyLayout_promptStyle.adoc   |   1 -
 .../_rgant-PropertyLayout_renderedAsDayBefore.adoc |  13 +-
 .../rgant/_rgant-PropertyLayout_typicalLength.adoc |   4 +-
 .../guides/rgant/_rgant-Property_editing.adoc      |   8 +-
 .../guides/rgant/_rgant-Property_hidden.adoc       |  11 +-
 .../guides/rgant/_rgant-Property_maxLength.adoc    |  14 +-
 .../guides/rgant/_rgant-Property_regexPattern.adoc |  14 +-
 .../guides/rgant/_rgant-ViewModelLayout.adoc       |  27 +++-
 .../_rgant-ViewModelLayout_bookmarking.adoc}       |  10 +-
 .../rgant/_rgant-ViewModelLayout_cssClass.adoc     |  21 +--
 .../rgant/_rgant-ViewModelLayout_cssClassFa.adoc   |  30 +---
 ...=> _rgant-ViewModelLayout_cssClassUiEvent.adoc} |  14 +-
 .../rgant/_rgant-ViewModelLayout_describedAs.adoc  |  16 +-
 .../_rgant-ViewModelLayout_iconUiEvent.adoc}       |  24 +--
 ...c => _rgant-ViewModelLayout_layoutUiEvent.adoc} |  14 +-
 .../guides/rgant/_rgant-ViewModelLayout_named.adoc |  28 +---
 .../guides/rgant/_rgant-ViewModelLayout_paged.adoc |  28 +---
 .../rgant/_rgant-ViewModelLayout_plural.adoc       |  13 +-
 .../_rgant-ViewModelLayout_titleUiEvent.adoc}      |  11 +-
 .../guides/rgcfg/_rgcfg_configuring-core.adoc      |  36 +++++
 .../guides/rgcms/_rgcms_methods_reserved.adoc      |  14 +-
 .../rgcms/_rgcms_methods_reserved_cssClass.adoc    |  14 +-
 .../guides/rgcms/_rgcms_methods_reserved_hide.adoc |   3 +-
 .../rgcms/_rgcms_methods_reserved_iconName.adoc    |  20 ++-
 .../rgcms/_rgcms_methods_reserved_layout.adoc      |  48 ++++++
 .../rgcms/_rgcms_methods_reserved_title.adoc       |  23 +--
 .../guides/ugvro/_ugvro_layout-resources.adoc      |   4 +-
 .../guides/ugvw/_ugvw_layout_file-based.adoc       | 107 +++++++------
 .../guides/ugvw/images/layouts/customer-order.png  | Bin 6026 -> 5981 bytes
 adocs/documentation/src/main/asciidoc/index.html   |   7 +-
 .../_migration-notes_1.16.0-to-1.17.0.adoc         |  29 +++-
 .../release-notes/_release-notes_1.17.0.adoc       |  88 ++++++++++-
 .../main/asciidoc/release-notes/release-notes.adoc |  12 +-
 .../org/apache/isis/applib/IsisApplibModule.java   |   4 +
 .../isis/applib/annotation/ActionLayout.java       |   8 +
 .../isis/applib/annotation/DomainObjectLayout.java |  14 +-
 .../apache/isis/applib/annotation/PromptStyle.java |  18 ++-
 .../{BookmarkPolicy.java => Redirect.java}         |  34 +++--
 .../isis/applib/annotation/ViewModelLayout.java    |  52 ++++++-
 .../isis/applib/domain/DomainObjectList.java       |   4 +-
 .../applib/layout/component/ActionLayoutData.java  |  14 ++
 .../mixins/layout/Object_rebuildMetamodel.java     |   3 +-
 .../eventbus/LayoutUiEvent.java}                   |  55 +++----
 .../applib/services/grid/GridLoaderService2.java}  |  14 +-
 .../isis/applib/services/grid/GridService2.java}   |  15 +-
 .../actions/layout/ActionLayoutFacetFactory.java   |  10 ++
 ...> RedirectFacetFromActionLayoutAnnotation.java} |  24 ++-
 ...ionXml.java => RedirectFacetFromActionXml.java} |  19 +--
 .../redirect/RedirectFacet.java}                   |  10 +-
 .../RedirectFacetAbstract.java}                    |  33 ++--
 .../RedirectFacetFallback.java}                    |   9 +-
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |   3 -
 ...ModelLayoutAnnotationUsingCssClassUiEvent.java} |  28 ++--
 .../DomainObjectLayoutFacetFactory.java            |  18 +++
 ...ViewModelLayoutAnnotationUsingIconUiEvent.java} |  26 ++--
 ...nObjectLayoutAnnotationUsingLayoutUiEvent.java} |  79 +++++-----
 ...iewModelLayoutAnnotationUsingLayoutUiEvent.java | 119 +++++++++++++++
 ...iewModelLayoutAnnotationUsingTitleUiEvent.java} |  35 +++--
 .../metamodel/facets/object/grid/GridFacet.java    |   3 +-
 .../facets/object/grid/GridFacetDefault.java       |  21 +--
 .../facets/object/grid/GridFacetFactory.java       |   4 +-
 .../layout/LayoutFacet.java}                       |  21 +--
 .../layout/LayoutFacetAbstract.java}               |  13 +-
 .../LayoutFacetFactory.java}                       |  22 +--
 .../layout/LayoutFacetFallback.java}               |  17 ++-
 .../LayoutFacetMethod.java}                        |  14 +-
 .../services/grid/GridLoaderServiceDefault.java    | 166 ++++++++++++++-------
 .../services/grid/GridServiceDefault.java          |  14 +-
 .../services/grid/GridSystemServiceAbstract.java   |   2 +
 .../services/layout/LayoutServiceDefault.java      |   2 +-
 .../dflt/ProgrammingModelFacetsJava5.java          |   2 +
 .../DomainObjectLayoutFactoryTest.java             |   2 +-
 .../LayoutFacetFactoryTest.java}                   |  28 ++--
 .../LayoutFacetMethodTest.java}                    |  28 ++--
 ...dLoaderServiceDefault_resourceNameFor_Test.java |   8 +-
 .../SpecificationLoaderTestAbstract.java           |   4 +-
 core/pom.xml                                       |   2 +-
 .../resources/DomainObjectResourceServerside.java  |   3 +-
 .../resources/DomainTypeResourceServerside.java    |   2 +-
 .../wicket/model/models/ActionPromptProvider.java  |   7 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   7 +-
 .../links/EntityLinksSelectorPanelFactory.java     |   4 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   7 +-
 .../StandaloneCollectionPanel.html                 |   2 -
 .../StandaloneCollectionPanel.java                 |  17 +--
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  13 +-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |  36 +++--
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |  54 +++++--
 .../wicket/ui/panels/PromptFormAbstract.java       |  39 +++--
 migration-notes.adoc                               |  10 ++
 141 files changed, 1875 insertions(+), 1041 deletions(-)
 create mode 100644 adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_redirect.adoc
 create mode 100644 adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_layoutUiEvent.adoc
 copy adocs/documentation/src/main/asciidoc/guides/{rgcms/_rgcms_classes_i18n_TranslatableString.adoc => rgant/_rgant-ViewModelLayout_bookmarking.adoc} (72%)
 copy adocs/documentation/src/main/asciidoc/guides/rgant/{_rgant_aaa.adoc => _rgant-ViewModelLayout_cssClassUiEvent.adoc} (57%)
 copy adocs/documentation/src/main/asciidoc/guides/{dg/_dg_hints-and-tips_enhance-only.adoc => rgant/_rgant-ViewModelLayout_iconUiEvent.adoc} (52%)
 copy adocs/documentation/src/main/asciidoc/guides/rgant/{_rgant_aaa.adoc => _rgant-ViewModelLayout_layoutUiEvent.adoc} (58%)
 copy adocs/documentation/src/main/asciidoc/guides/{rgcms/_rgcms_classes_contributee.adoc => rgant/_rgant-ViewModelLayout_titleUiEvent.adoc} (60%)
 create mode 100644 adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_methods_reserved_layout.adoc
 copy core/applib/src/main/java/org/apache/isis/applib/annotation/{BookmarkPolicy.java => Redirect.java} (60%)
 copy core/applib/src/main/java/org/apache/isis/applib/{events/ui/CssClassUiEvent.java => services/eventbus/LayoutUiEvent.java} (62%)
 copy core/{security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSessionProvider.java => applib/src/main/java/org/apache/isis/applib/services/grid/GridLoaderService2.java} (69%)
 copy core/{security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSessionProvider.java => applib/src/main/java/org/apache/isis/applib/services/grid/GridService2.java} (69%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/{NamedFacetForActionLayoutAnnotation.java => RedirectFacetFromActionLayoutAnnotation.java} (61%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/{CssClassFacetForActionXml.java => RedirectFacetFromActionXml.java} (62%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{object/paged/PagedFacet.java => actions/redirect/RedirectFacet.java} (77%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/{position/ActionPositionFacetAbstract.java => redirect/RedirectFacetAbstract.java} (61%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/{homepage/HomePageFacetImpl.java => redirect/RedirectFacetFallback.java} (75%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/{CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java => CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java} (83%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/{IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java => IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java} (83%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/{IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java => LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java} (53%)
 create mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/{TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java => TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java} (83%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{actions/homepage/HomePageFacet.java => object/layout/LayoutFacet.java} (69%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{actions/notinservicemenu/NotInServiceMenuFacetAbstract.java => object/layout/LayoutFacetAbstract.java} (74%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/{icon/method/IconFacetMethodFactory.java => layout/LayoutFacetFactory.java} (72%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{fallback/TitleFacetNone.java => object/layout/LayoutFacetFallback.java} (69%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/{icon/method/IconFacetMethod.java => layout/LayoutFacetMethod.java} (80%)
 copy core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/{icon/IconFacetMethodFactoryTest.java => layout/LayoutFacetFactoryTest.java} (68%)
 copy core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/{icon/IconFacetMethodTest.java => layout/LayoutFacetMethodTest.java} (71%)


[isis] 02/04: Merge branch 'master' into v2

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

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

commit 4a5363a27db334c0716dd1ad0f996577a1d04e19
Merge: 8ef9a72 4573d5b
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Jan 10 07:44:31 2019 +0100

    Merge branch 'master' into v2
    
    # Conflicts:
    #	adocs/documentation/src/main/asciidoc/__versions.adoc
    #	adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-CollectionLayout_defaultView.adoc
    #	adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-CollectionLayout_render.adoc
    #	adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_cssClassUiEvent.adoc
    #	adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_iconUiEvent.adoc
    #	adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_titleUiEvent.adoc
    #	adocs/documentation/src/main/asciidoc/pages/tg/tg.adoc
    #	adocs/template/document.html.erb
    #	core/applib/src/main/java/org/apache/isis/applib/IsisApplibModule.java
    #	core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
    #	core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
    #	core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
    #	core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
    #	core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
    #	core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
    #	core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
    #	core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
    #	core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
    #	core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
    #	core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
    #	core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
    #	core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
    #	core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
    #	core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java

 STATUS                                             |   4 +
 .../asciidoc/applib/layout/component/component.xsd |  12 ++
 .../documentation/src/main/asciidoc/doap_isis.rdf  |  48 ++++++
 .../cgcom/_cgcom_post-release-successful.adoc      |  23 +--
 .../rgant/_rgant-ActionLayout_bookmarking.adoc     |  15 +-
 .../guides/rgant/_rgant-ActionLayout_cssClass.adoc |  22 +--
 .../rgant/_rgant-ActionLayout_cssClassFa.adoc      |  21 +--
 .../rgant/_rgant-ActionLayout_describedAs.adoc     |  22 +--
 .../guides/rgant/_rgant-ActionLayout_hidden.adoc   |  31 ++--
 .../guides/rgant/_rgant-ActionLayout_named.adoc    |  29 ++--
 .../guides/rgant/_rgant-ActionLayout_position.adoc |  11 +-
 .../rgant/_rgant-ActionLayout_promptStyle.adoc     |  23 ++-
 .../guides/rgant/_rgant-ActionLayout_redirect.adoc |  62 ++++++++
 .../guides/rgant/_rgant-Action_hidden.adoc         |   9 +-
 .../guides/rgant/_rgant-Action_typeOf.adoc         |   8 +-
 .../rgant/_rgant-CollectionLayout_cssClass.adoc    |  16 +-
 .../rgant/_rgant-CollectionLayout_defaultView.adoc |  19 ++-
 .../rgant/_rgant-CollectionLayout_describedAs.adoc |  12 +-
 .../rgant/_rgant-CollectionLayout_hidden.adoc      |  32 ++--
 .../rgant/_rgant-CollectionLayout_named.adoc       |  36 ++---
 .../rgant/_rgant-CollectionLayout_paged.adoc       |  24 +--
 .../rgant/_rgant-CollectionLayout_sortedBy.adoc    |  14 +-
 .../guides/rgant/_rgant-Collection_editing.adoc    |  11 +-
 .../guides/rgant/_rgant-Collection_hidden.adoc     |  10 +-
 .../guides/rgant/_rgant-Collection_typeOf.adoc     |   6 +-
 .../guides/rgant/_rgant-DomainObjectLayout.adoc    |   6 +
 .../_rgant-DomainObjectLayout_bookmarking.adoc     |   3 +
 .../rgant/_rgant-DomainObjectLayout_cssClass.adoc  |  21 ++-
 .../_rgant-DomainObjectLayout_cssClassFa.adoc      |   9 +-
 .../_rgant-DomainObjectLayout_cssClassUiEvent.adoc |   4 +
 .../_rgant-DomainObjectLayout_describedAs.adoc     |  16 +-
 .../_rgant-DomainObjectLayout_iconUiEvent.adoc     |   7 +-
 .../_rgant-DomainObjectLayout_layoutUiEvent.adoc   | 114 ++++++++++++++
 .../rgant/_rgant-DomainObjectLayout_named.adoc     |  15 +-
 .../rgant/_rgant-DomainObjectLayout_paged.adoc     |   9 +-
 .../rgant/_rgant-DomainObjectLayout_plural.adoc    |   6 +-
 .../_rgant-DomainObjectLayout_titleUiEvent.adoc    |   5 +
 .../rgant/_rgant-DomainServiceLayout_named.adoc    |  13 +-
 .../guides/rgant/_rgant-DomainService_nature.adoc  |   9 +-
 .../rgant/_rgant-ParameterLayout_cssClass.adoc     |  13 +-
 .../_rgant-ParameterLayout_labelPosition.adoc      |  24 +--
 .../guides/rgant/_rgant-ParameterLayout_named.adoc |  14 +-
 .../guides/rgant/_rgant-Parameter_maxLength.adoc   |   8 +-
 .../rgant/_rgant-Parameter_regexPattern.adoc       |   7 +-
 .../rgant/_rgant-PropertyLayout_cssClass.adoc      |  26 ++--
 .../rgant/_rgant-PropertyLayout_describedAs.adoc   |  13 +-
 .../guides/rgant/_rgant-PropertyLayout_hidden.adoc |  35 ++---
 .../rgant/_rgant-PropertyLayout_labelPosition.adoc |  31 ++--
 .../rgant/_rgant-PropertyLayout_multiLine.adoc     |  20 +--
 .../guides/rgant/_rgant-PropertyLayout_named.adoc  |  38 ++---
 .../rgant/_rgant-PropertyLayout_promptStyle.adoc   |   1 -
 .../_rgant-PropertyLayout_renderedAsDayBefore.adoc |  13 +-
 .../rgant/_rgant-PropertyLayout_typicalLength.adoc |   4 +-
 .../guides/rgant/_rgant-Property_editing.adoc      |   8 +-
 .../guides/rgant/_rgant-Property_hidden.adoc       |  11 +-
 .../guides/rgant/_rgant-Property_maxLength.adoc    |  14 +-
 .../guides/rgant/_rgant-Property_regexPattern.adoc |  14 +-
 .../guides/rgant/_rgant-ViewModelLayout.adoc       |  27 +++-
 .../rgant/_rgant-ViewModelLayout_bookmarking.adoc} |  22 +--
 .../rgant/_rgant-ViewModelLayout_cssClass.adoc     |  21 +--
 .../rgant/_rgant-ViewModelLayout_cssClassFa.adoc   |  30 +---
 .../_rgant-ViewModelLayout_cssClassUiEvent.adoc}   |  24 +--
 .../rgant/_rgant-ViewModelLayout_describedAs.adoc  |  16 +-
 ...doc => _rgant-ViewModelLayout_iconUiEvent.adoc} |  28 +---
 .../_rgant-ViewModelLayout_layoutUiEvent.adoc}     |  24 +--
 .../guides/rgant/_rgant-ViewModelLayout_named.adoc |  28 +---
 .../guides/rgant/_rgant-ViewModelLayout_paged.adoc |  28 +---
 .../rgant/_rgant-ViewModelLayout_plural.adoc       |  13 +-
 .../_rgant-ViewModelLayout_titleUiEvent.adoc}      |  24 +--
 .../guides/rgcfg/_rgcfg_configuring-core.adoc      |  36 +++++
 .../guides/rgcms/_rgcms_methods_reserved.adoc      |  14 +-
 .../rgcms/_rgcms_methods_reserved_cssClass.adoc    |  14 +-
 .../guides/rgcms/_rgcms_methods_reserved_hide.adoc |   3 +-
 .../rgcms/_rgcms_methods_reserved_iconName.adoc    |  20 ++-
 .../rgcms/_rgcms_methods_reserved_layout.adoc      |  48 ++++++
 .../rgcms/_rgcms_methods_reserved_title.adoc       |  23 +--
 .../guides/ugvro/_ugvro_layout-resources.adoc      |   4 +-
 .../guides/ugvw/_ugvw_layout_file-based.adoc       | 107 +++++++------
 .../guides/ugvw/images/layouts/customer-order.png  | Bin 6026 -> 5981 bytes
 adocs/documentation/src/main/asciidoc/index.html   |   7 +-
 .../_migration-notes_1.16.0-to-1.17.0.adoc         |  29 +++-
 .../release-notes/_release-notes_1.17.0.adoc       |  88 ++++++++++-
 .../main/asciidoc/release-notes/release-notes.adoc |  12 +-
 .../org/apache/isis/applib/IsisApplibModule.java   |   4 +
 .../isis/applib/annotation/ActionLayout.java       |   8 +
 .../isis/applib/annotation/DomainObjectLayout.java |  14 +-
 .../apache/isis/applib/annotation/PromptStyle.java |  18 ++-
 .../apache/isis/applib/annotation/Redirect.java    |  49 ++++++
 .../isis/applib/annotation/ViewModelLayout.java    |  52 ++++++-
 .../isis/applib/domain/DomainObjectList.java       |   4 +-
 .../applib/layout/component/ActionLayoutData.java  |  14 ++
 .../mixins/layout/Object_rebuildMetamodel.java     |   3 +-
 .../applib/services/eventbus/LayoutUiEvent.java    | 103 +++++++++++++
 .../applib/services/grid/GridLoaderService2.java   |  31 ++++
 .../isis/applib/services/grid/GridService2.java    |  32 ++++
 .../actions/layout/ActionLayoutFacetFactory.java   |  10 ++
 .../RedirectFacetFromActionLayoutAnnotation.java   |  43 ++++++
 .../actions/layout/RedirectFacetFromActionXml.java |  43 ++++++
 .../redirect/RedirectFacet.java}                   |  21 +--
 .../actions/redirect/RedirectFacetAbstract.java    |  66 ++++++++
 .../redirect/RedirectFacetFallback.java}           |  25 +---
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |   3 -
 ...ModelLayoutAnnotationUsingCssClassUiEvent.java} |  28 ++--
 .../DomainObjectLayoutFacetFactory.java            |  18 +++
 ...aViewModelLayoutAnnotationUsingIconUiEvent.java | 120 +++++++++++++++
 ...nObjectLayoutAnnotationUsingLayoutUiEvent.java} |  84 +++++------
 ...iewModelLayoutAnnotationUsingLayoutUiEvent.java | 119 +++++++++++++++
 ...ViewModelLayoutAnnotationUsingTitleUiEvent.java | 141 +++++++++++++++++
 .../metamodel/facets/object/grid/GridFacet.java    |   3 +-
 .../facets/object/grid/GridFacetDefault.java       |  21 +--
 .../facets/object/grid/GridFacetFactory.java       |   4 +-
 .../GridFacet.java => layout/LayoutFacet.java}     |  29 ++--
 .../LayoutFacetAbstract.java}                      |  33 ++--
 .../facets/object/layout/LayoutFacetFactory.java   |  57 +++++++
 .../LayoutFacetFallback.java}                      |  37 ++---
 .../facets/object/layout/LayoutFacetMethod.java    |  54 +++++++
 .../services/grid/GridLoaderServiceDefault.java    | 166 ++++++++++++++-------
 .../services/grid/GridServiceDefault.java          |  14 +-
 .../services/grid/GridSystemServiceAbstract.java   |   2 +
 .../services/layout/LayoutServiceDefault.java      |   2 +-
 .../dflt/ProgrammingModelFacetsJava5.java          |   2 +
 .../ident/layout/LayoutFacetFactoryTest.java       |  71 +++++++++
 .../object/ident/layout/LayoutFacetMethodTest.java |  84 +++++++++++
 ...dLoaderServiceDefault_resourceNameFor_Test.java |   8 +-
 core/pom.xml                                       |   2 +-
 .../resources/DomainObjectResourceServerside.java  |   3 +-
 .../resources/DomainTypeResourceServerside.java    |   2 +-
 .../wicket/model/models/ActionPromptProvider.java  |   7 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   7 +-
 .../links/EntityLinksSelectorPanelFactory.java     |   4 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   7 +-
 .../StandaloneCollectionPanel.html                 |   2 -
 .../StandaloneCollectionPanel.java                 |  17 +--
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  13 +-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |  36 +++--
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |  54 +++++--
 .../wicket/ui/panels/PromptFormAbstract.java       |  39 +++--
 138 files changed, 2604 insertions(+), 972 deletions(-)

diff --cc adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-CollectionLayout_defaultView.adoc
index b0603ce,7577b3d..b03486d
--- a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-CollectionLayout_defaultView.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-CollectionLayout_defaultView.adoc
@@@ -25,16 -25,14 +25,15 @@@ public class BusRoute 
  ----
  
  
- As an alternative to using the annotation, the dynamic xref:../ugvw/ugvw.adoc#_ugvw_layout_file-based[file-based layout] can be used instead, eg:
+ [NOTE]
+ ====
+ This attribute takes precedence over any value for the xref:../rgant/rgant.adoc#_rgant-CollectionLayout_render[`@CollectionLayout#render()`] attribute.  For example, if the
+ `defaultView` attribute is defined to "table", then the table will be show even if `render` is set to `LAZILY`.
+ ====
  
- NOTE: FIXME - change to .layout.xml syntax instead.
 +
- [source,javascript]
- ----
- "dependencies": {
-     "collectionLayout": {
-         "defaultView": "map"
-     }
- }
- ----
+ == Alternatives
+ 
+ 
+ As an alternative to using the annotation, the dynamic xref:../ugvw/ugvw.adoc#_ugvw_layout_file-based[file-based layout] can be used instead.
  
diff --cc adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_cssClassUiEvent.adoc
index e885673,040aeec..d44a403
--- a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_cssClassUiEvent.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_cssClassUiEvent.adoc
@@@ -111,6 -111,10 +111,10 @@@ And, conversely, the framework also pro
  == Raising events programmatically
  
  Normally events are only raised for interactions through the UI.
 -However, events can be raised programmatically by calling the xref:../rgsvc/rgsvc.adoc#_rgsvc_core-domain-api_EventBusService[`EventBusService`] API directly.
 +However, events can be raised programmatically either by calling the xref:../rgsvc/rgsvc.adoc#_rgsvc_core-domain-api_EventBusService[`EventBusService`] API directly.
  
  
+ == See also
+ 
+ This attribute can also be applied to xref:../rgant/rgant.adoc#_rgant-ViewModelLayout_cssClassUiEvent[view models].
+ 
diff --cc adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_titleUiEvent.adoc
index da4ccd0,5ed1021..e0fa4d8
--- a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_titleUiEvent.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_titleUiEvent.adoc
@@@ -105,4 -105,11 +105,9 @@@ And, conversely, the framework also pro
  == Raising events programmatically
  
  Normally events are only raised for interactions through the UI.
 -However, events can be raised programmatically either by calling the xref:../rgsvc/rgsvc.adoc#_rgsvc_core-domain-api_EventBusService[`EventBusService`] API directly, or as a result of calling the xref:../rgsvc/rgsvc.adoc#_rgsvc_core-domain-api_DomainObjectContainer[`DomainObjectContainer`]'s `titleOf(...)` method.
 -
 +However, events can be raised programmatically either by calling the xref:../rgsvc/rgsvc.adoc#_rgsvc_core-domain-api_EventBusService[`EventBusService`] API directly, or as a result of calling the xref:../rgsvc/rgsvc.adoc#_rgsvc_application-layer-api_TitleService[`TitleService`]'s `titleOf(...)` method.
+ 
+ 
+ == See also
+ 
+ This attribute can also be applied to xref:../rgant/rgant.adoc#_rgant-ViewModelLayout_titleUiEvent[view models].
 -
diff --cc adocs/documentation/src/main/asciidoc/release-notes/release-notes.adoc
index a766dc4,bff7ec4..e1c7e5f
--- a/adocs/documentation/src/main/asciidoc/release-notes/release-notes.adoc
+++ b/adocs/documentation/src/main/asciidoc/release-notes/release-notes.adoc
@@@ -21,28 -21,14 +21,28 @@@ This table summarises all releases of A
  | Bugs
  | JIRA relnotes
  
 +
  | xref:release-notes.adoc#_release-notes_1.17.0[1.17.0]
- | dd-mm-yyyy
- | TODO
- |
- |
- |
- | TODO
+ | 06-01-2019
+ | Sidebar dialogs, metamodel export
+ | 4
+ | 17
+ | 9
+ | https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12311171&version=12342854[Release notes for 1.17.0]
  
 +| link:https://isis.apache.org/versions/2.0.0-M1/release-notes/release-notes.html#_release-notes_2.0.0-M1[2.0.0-M1]
 +| 31-07-2018
 +| First milestone release for Apache Isis 2.0.0: Java 8 support, DataNucleus 5.1, Wicket 8, meta-annotations, breadcrumbs
 +| 6
 +| 55
 ++ 4 tasks
 ++ 13 sub-tasks
 +| 22
 +| https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12311171&version=12342392[Release notes for 2.0.0-M1]
 +
 +| link:https://isis.apache.org/versions/1.16.2/release-notes/release-notes.html#_release-notes_1.16.2[1.16.2]
 +
 +
  | xref:release-notes.adoc#_release-notes_1.16.2[1.16.2]
  | 05-03-2018
  | RO viewer support, performance improvement, fix of severe bug for parented checkboxes
diff --cc core/applib/src/main/java/org/apache/isis/applib/IsisApplibModule.java
index dbf3918,e2955b9..b5e4b28
--- a/core/applib/src/main/java/org/apache/isis/applib/IsisApplibModule.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/IsisApplibModule.java
@@@ -23,40 -25,80 +23,44 @@@ import javax.xml.bind.annotation.XmlRoo
  @XmlRootElement(name = "module")
  public class IsisApplibModule extends ModuleAbstract {
  
 -    //region > ui event classes
 +    // -- UI EVENT CLASSES
 +
      public abstract static class TitleUiEvent<S>
 -            extends org.apache.isis.applib.services.eventbus.TitleUiEvent<S> { }
 +    extends org.apache.isis.applib.events.ui.TitleUiEvent<S> {
 +        private static final long serialVersionUID = 1L;
 +    }
 +
      public abstract static class IconUiEvent<S>
 -            extends org.apache.isis.applib.services.eventbus.IconUiEvent<S> { }
 +    extends org.apache.isis.applib.events.ui.IconUiEvent<S> {
 +        private static final long serialVersionUID = 1L;
 +    }
 +
      public abstract static class CssClassUiEvent<S>
 -            extends org.apache.isis.applib.services.eventbus.CssClassUiEvent<S> { }
 +    extends org.apache.isis.applib.events.ui.CssClassUiEvent<S> {
 +        private static final long serialVersionUID = 1L;
 +    }
+     public abstract static class LayoutUiEvent<S>
 -            extends org.apache.isis.applib.services.eventbus.LayoutUiEvent<S> { }
 -    //endregion
++            extends org.apache.isis.applib.services.eventbus.LayoutUiEvent<S> {
++        private static final long serialVersionUID = 1L;
++    }
  
 -    //region > domain event classes
 -    public abstract static class ActionDomainEvent<S> extends org.apache.isis.applib.services.eventbus.ActionDomainEvent<S> {
 -        public ActionDomainEvent() {}
 +    // -- DOMAIN EVENT CLASSES
  
 -        /**
 -         * @deprecated - use the {@link #ActionDomainEvent() no-arg constructor} instead to avoid boilerplate.
 -         */
 -        @Deprecated
 -        public ActionDomainEvent(final S source, final Identifier identifier) {
 -            super(source, identifier);
 -        }
 -        /**
 -         * @deprecated - use the {@link #ActionDomainEvent() no-arg constructor} instead to avoid boilerplate.
 -         */
 -        @Deprecated
 -        public ActionDomainEvent(final S source, final Identifier identifier, final Object... arguments) {
 -            super(source, identifier, arguments);
 -        }
 -        /**
 -         * @deprecated - use the {@link #ActionDomainEvent() no-arg constructor} instead to avoid boilerplate.
 -         */
 -        @Deprecated
 -        public ActionDomainEvent(final S source, final Identifier identifier, final List<Object> arguments) {
 -            super(source, identifier, arguments);
 -        }
 +    public abstract static class ActionDomainEvent<S>
 +    extends org.apache.isis.applib.events.domain.ActionDomainEvent<S> {
 +        private static final long serialVersionUID = 1L;
      }
  
 -    public abstract static class CollectionDomainEvent<S,T> extends org.apache.isis.applib.services.eventbus.CollectionDomainEvent<S,T> {
 -        public CollectionDomainEvent() { }
 -        /**
 -         * @deprecated - use the {@link #CollectionDomainEvent() no-arg constructor} instead to avoid boilerplate.
 -         */
 -        @Deprecated
 -        public CollectionDomainEvent(final S source, final Identifier identifier, final Of of) {
 -            super(source, identifier, of);
 -        }
 -        /**
 -         * @deprecated - use the {@link #CollectionDomainEvent() no-arg constructor} instead to avoid boilerplate.
 -         */
 -        @Deprecated
 -        public CollectionDomainEvent(final S source, final Identifier identifier, final Of of, final T value) {
 -            super(source, identifier, of, value);
 -        }
 +    public abstract static class CollectionDomainEvent<S,T>
 +    extends org.apache.isis.applib.events.domain.CollectionDomainEvent<S,T> {
 +        private static final long serialVersionUID = 1L;
      }
  
 -    public abstract static class PropertyDomainEvent<S,T> extends org.apache.isis.applib.services.eventbus.PropertyDomainEvent<S,T> {
 -        public PropertyDomainEvent() { }
 -        /**
 -         * @deprecated - use the {@link #PropertyDomainEvent() no-arg constructor} instead to avoid boilerplate.
 -         */
 -        @Deprecated
 -        public PropertyDomainEvent(final S source, final Identifier identifier) {
 -            super(source, identifier);
 -        }
 -        /**
 -         * @deprecated - use the {@link #PropertyDomainEvent() no-arg constructor} instead to avoid boilerplate.
 -         */
 -        @Deprecated
 -        public PropertyDomainEvent(final S source, final Identifier identifier, final T oldValue, final T newValue) {
 -            super(source, identifier, oldValue, newValue);
 -        }
 +    public abstract static class PropertyDomainEvent<S,T>
 +    extends org.apache.isis.applib.events.domain.PropertyDomainEvent<S,T> {
 +        private static final long serialVersionUID = 1L;
      }
  
 -    //endregion
 +
  
  }
diff --cc core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
index a5e72f0,dfaf5be..6ae3d61
--- 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
@@@ -25,9 -25,10 +25,10 @@@ import java.lang.annotation.Retention
  import java.lang.annotation.RetentionPolicy;
  import java.lang.annotation.Target;
  
 -import org.apache.isis.applib.services.eventbus.CssClassUiEvent;
 -import org.apache.isis.applib.services.eventbus.IconUiEvent;
 +import org.apache.isis.applib.events.ui.CssClassUiEvent;
 +import org.apache.isis.applib.events.ui.IconUiEvent;
 +import org.apache.isis.applib.events.ui.TitleUiEvent;
+ import org.apache.isis.applib.services.eventbus.LayoutUiEvent;
 -import org.apache.isis.applib.services.eventbus.TitleUiEvent;
  
  /**
   * Layout hints for domain objects.
diff --cc core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
index b864411,c60b25b..2c6d6da
--- 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,14 -76,9 +76,14 @@@ 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 isDialog() { return this == DIALOG || this == DIALOG_MODAL || this == DIALOG_SIDEBAR; }
      public boolean isInline() { return this == INLINE; }
      public boolean isInlineAsIfEdit() { return this == INLINE_AS_IF_EDIT; }
  
diff --cc core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModelLayout.java
index 1514201,f1b69ef..e1735dc
--- 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
@@@ -25,6 -25,11 +25,11 @@@ import java.lang.annotation.Retention
  import java.lang.annotation.RetentionPolicy;
  import java.lang.annotation.Target;
  
 -import org.apache.isis.applib.services.eventbus.CssClassUiEvent;
 -import org.apache.isis.applib.services.eventbus.IconUiEvent;
++import org.apache.isis.applib.events.ui.CssClassUiEvent;
++import org.apache.isis.applib.events.ui.IconUiEvent;
++import org.apache.isis.applib.events.ui.TitleUiEvent;
+ import org.apache.isis.applib.services.eventbus.LayoutUiEvent;
 -import org.apache.isis.applib.services.eventbus.TitleUiEvent;
+ 
  /**
   * Layout hints for view models.
   *
diff --cc core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
index 7ba0d63,8c4b4c2..144a6ca
--- a/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
@@@ -55,23 -56,25 +55,25 @@@ import org.apache.isis.schema.utils.jax
  @DomainObjectLayout(
          titleUiEvent = DomainObjectList.TitleUiEvent.class,
          iconUiEvent = DomainObjectList.IconUiEvent.class,
-         cssClassUiEvent = DomainObjectList.CssClassUiEvent.class
+         cssClassUiEvent = DomainObjectList.CssClassUiEvent.class,
+         layoutUiEvent = DomainObjectList.LayoutUiEvent.class
 -)
 +        )
  public class DomainObjectList {
  
 -    //region > ui event classes
 -    public static class TitleUiEvent extends IsisApplibModule.TitleUiEvent<DomainObjectList>{}
 -    public static class IconUiEvent extends IsisApplibModule.IconUiEvent<DomainObjectList>{}
 -    public static class CssClassUiEvent extends IsisApplibModule.CssClassUiEvent<DomainObjectList>{}
 -    public static class LayoutUiEvent extends IsisApplibModule.LayoutUiEvent<DomainObjectList>{}
 -    //endregion
 +    // -- ui event classes
 +    public static class TitleUiEvent extends IsisApplibModule.TitleUiEvent<DomainObjectList>{ private static final long serialVersionUID = 1L; }
 +    public static class IconUiEvent extends IsisApplibModule.IconUiEvent<DomainObjectList>{ private static final long serialVersionUID = 1L; }
 +    public static class CssClassUiEvent extends IsisApplibModule.CssClassUiEvent<DomainObjectList>{ private static final long serialVersionUID = 1L; }
++    public static class LayoutUiEvent extends IsisApplibModule.LayoutUiEvent<DomainObjectList>{ private static final long serialVersionUID = 1L; }
 +
 +
 +    // -- domain event classes
 +    public static abstract class PropertyDomainEvent<T> extends IsisApplibModule.PropertyDomainEvent<DomainObjectList, T> { private static final long serialVersionUID = 1L; }
 +    public static abstract class CollectionDomainEvent<T> extends IsisApplibModule.CollectionDomainEvent<DomainObjectList, T> { private static final long serialVersionUID = 1L; }
 +    public static abstract class ActionDomainEvent extends IsisApplibModule.ActionDomainEvent<DomainObjectList> { private static final long serialVersionUID = 1L; }
  
 -    //region > domain event classes
 -    public static abstract class PropertyDomainEvent<T> extends IsisApplibModule.PropertyDomainEvent<DomainObjectList, T> { }
 -    public static abstract class CollectionDomainEvent<T> extends IsisApplibModule.CollectionDomainEvent<DomainObjectList, T> { }
 -    public static abstract class ActionDomainEvent extends IsisApplibModule.ActionDomainEvent<DomainObjectList> { }
 -    //endregion
  
 -    //region > constructors
 +    // -- constructors
      public DomainObjectList() {
      }
      public DomainObjectList(
diff --cc core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
index e01b6a9,0000000..c3375a9
mode 100644,000000..100644
--- a/core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
@@@ -1,63 -1,0 +1,64 @@@
 +/**
 + *  Licensed to the Apache Software Foundation (ASF) under one or more
 + *  contributor license agreements.  See the NOTICE file distributed with
 + *  this work for additional information regarding copyright ownership.
 + *  The ASF licenses this file to You under the Apache License, Version 2.0
 + *  (the "License"); you may not use this file except in compliance with
 + *  the License.  You may obtain a copy of the License at
 + *
 + *     http://www.apache.org/licenses/LICENSE-2.0
 + *
 + *  Unless required by applicable law or agreed to in writing, software
 + *  distributed under the License is distributed on an "AS IS" BASIS,
 + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + *  See the License for the specific language governing permissions and
 + *  limitations under the License.
 + */
 +package org.apache.isis.applib.mixins.layout;
 +
 +import org.apache.isis.applib.annotation.Action;
 +import org.apache.isis.applib.annotation.ActionLayout;
 +import org.apache.isis.applib.annotation.CommandPersistence;
 +import org.apache.isis.applib.annotation.Contributed;
 +import org.apache.isis.applib.annotation.MemberOrder;
 +import org.apache.isis.applib.annotation.Mixin;
 +import org.apache.isis.applib.annotation.RestrictTo;
 +import org.apache.isis.applib.annotation.SemanticsOf;
 +import org.apache.isis.applib.services.metamodel.MetaModelService;
 +
 +@Mixin(method="act")
 +public class Object_rebuildMetamodel {
 +
 +    private final Object object;
 +
 +    public Object_rebuildMetamodel(final Object object) {
 +        this.object = object;
 +    }
 +
 +    public static class ActionDomainEvent
 +    extends org.apache.isis.applib.IsisApplibModule.ActionDomainEvent<Object_rebuildMetamodel> {
 +        private static final long serialVersionUID = 1L;
 +    }
 +
 +    @Action(
 +            domainEvent = ActionDomainEvent.class,
 +            semantics = SemanticsOf.IDEMPOTENT,
 +            commandPersistence = CommandPersistence.NOT_PERSISTED,
 +            restrictTo = RestrictTo.PROTOTYPING
 +            )
 +    @ActionLayout(
 +            contributed = Contributed.AS_ACTION,
 +            cssClassFa = "fa-refresh",
 +            position = ActionLayout.Position.PANEL_DROPDOWN
 +            )
 +    @MemberOrder(name = "datanucleusIdLong", sequence = "800.1")
-     public void act() {
++    public Object act() {
 +        metaModelService.rebuild(object.getClass());
++        return object;
 +    }
 +
 +    @javax.inject.Inject
 +    MetaModelService metaModelService;
 +
 +
 +}
diff --cc core/applib/src/main/java/org/apache/isis/applib/services/eventbus/LayoutUiEvent.java
index 0000000,0ab989d..f378769
mode 000000,100644..100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/LayoutUiEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/LayoutUiEvent.java
@@@ -1,0 -1,102 +1,103 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ package org.apache.isis.applib.services.eventbus;
+ 
+ import java.util.EventObject;
+ 
+ import org.apache.isis.applib.annotation.DomainObjectLayout;
++import org.apache.isis.applib.events.ui.AbstractUiEvent;
+ 
+ /**
+  * Emitted for subscribers to obtain a layout hint (equivalent to the <tt>layout()</tt> supporting method).
+  */
+ public abstract class LayoutUiEvent<S> extends AbstractUiEvent<S> {
+ 
+     private static final long serialVersionUID = 1L;
+ 
+     //region > constructors
+     /**
+      * If used then the framework will set state via (non-API) setters.
+      *
+      * <p>
+      *     Because the {@link EventObject} superclass prohibits a null source, a dummy value is temporarily used.
+      * </p>
+      */
+     public LayoutUiEvent() {
+         this(null);
+     }
+ 
+     public LayoutUiEvent(final S source) {
+         super(source);
+     }
+ 
+     //endregion
+ 
+     //region > Default class
+     /**
+      * This class is the default for the
+      * {@link DomainObjectLayout#layoutUiEvent()} annotation attribute.  Whether this
+      * raises an event or not depends upon the "isis.reflector.facet.domainObjectLayoutAnnotation.layoutUiEvent.postForDefault"
+      * configuration property.
+      */
+     public static class Default extends LayoutUiEvent<Object> {
+         private static final long serialVersionUID = 1L;
+     }
+     //endregion
+ 
+     //region > Noop class
+ 
+     /**
+      * Convenience class to use indicating that an event should <i>not</i> be posted (irrespective of the configuration
+      * property setting for the {@link Default} event.
+      */
+     public static class Noop extends LayoutUiEvent<Object> {
+         private static final long serialVersionUID = 1L;
+     }
+     //endregion
+ 
+     //region > Doop class
+ 
+     /**
+      * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
+      * property setting for the {@link Default} event..
+      */
+     public static class Doop extends LayoutUiEvent<Object> {
+         private static final long serialVersionUID = 1L;
+     }
+     //endregion
+ 
+     //region > layout
+     private String layout;
+ 
+     /**
+      * The name of the alternate layout to use, as provided by a subscriber using {@link #setLayout(String)}.
+      */
+     public String getLayout() {
+         return layout;
+     }
+ 
+     /**
+      * For subscribers to call to provide a layout for this object.
+      */
+     public void setLayout(final String layout) {
+         this.layout = layout;
+     }
+     //endregion
+ 
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index f9af501,14d9293..719cfa8
--- 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
@@@ -102,10 -132,20 +104,18 @@@ public class ActionLayoutFacetFactory e
          FacetUtil.addFacet(actionPositionFacet);
  
  
+         // redirectPolicy
+         RedirectFacet redirectFacet = RedirectFacetFromActionLayoutAnnotation.create(actionLayout, holder);
+         if(redirectFacet == null) {
+             redirectFacet = new RedirectFacetFallback(holder);
+         }
+         FacetUtil.addFacet(redirectFacet);
+ 
+ 
          // contributing
          if (isContributingServiceOrMixinObject(processMethodContext)) {
 -            NotContributedFacet notContributedFacet = NotContributedFacetForLayoutProperties.create(properties, holder);
 -            if(notContributedFacet == null) {
 -                notContributedFacet = NotContributedFacetForActionLayoutAnnotation.create(actionLayout, holder);
 -            }
 +            NotContributedFacet notContributedFacet = NotContributedFacetForActionLayoutAnnotation
 +                    .create(actionLayouts, holder);
              FacetUtil.addFacet(notContributedFacet);
          }
      }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
index 8337fa0,2f90964..8d41509
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
@@@ -19,18 -19,17 +19,15 @@@
  
  package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
  
 +import java.util.List;
  import java.util.Map;
  
--import org.slf4j.Logger;
--import org.slf4j.LoggerFactory;
--
  import org.apache.isis.applib.NonRecoverableException;
  import org.apache.isis.applib.annotation.DomainObjectLayout;
 -import org.apache.isis.applib.services.eventbus.CssClassUiEvent;
 +import org.apache.isis.applib.events.ui.CssClassUiEvent;
  import org.apache.isis.applib.services.eventbus.EventBusService;
 -import org.apache.isis.core.commons.config.IsisConfiguration;
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 +import org.apache.isis.commons.internal.base._Casts;
 +import org.apache.isis.config.IsisConfiguration;
  import org.apache.isis.core.metamodel.facetapi.Facet;
  import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
  import org.apache.isis.core.metamodel.facetapi.FacetHolder;
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
index 8337fa0,0ad34b5..58cf372
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
@@@ -19,53 -19,53 +19,49 @@@
  
  package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
  
 +import java.util.List;
  import java.util.Map;
  
--import org.slf4j.Logger;
--import org.slf4j.LoggerFactory;
--
  import org.apache.isis.applib.NonRecoverableException;
- import org.apache.isis.applib.annotation.DomainObjectLayout;
+ import org.apache.isis.applib.annotation.ViewModelLayout;
 -import org.apache.isis.applib.services.eventbus.CssClassUiEvent;
 +import org.apache.isis.applib.events.ui.CssClassUiEvent;
  import org.apache.isis.applib.services.eventbus.EventBusService;
 -import org.apache.isis.core.commons.config.IsisConfiguration;
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 +import org.apache.isis.commons.internal.base._Casts;
 +import org.apache.isis.config.IsisConfiguration;
  import org.apache.isis.core.metamodel.facetapi.Facet;
  import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
  import org.apache.isis.core.metamodel.facetapi.FacetHolder;
  import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
  import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
  import org.apache.isis.core.metamodel.services.ServicesInjector;
 +import org.apache.isis.core.metamodel.spec.ManagedObject;
  import org.apache.isis.core.metamodel.util.EventUtil;
  
- public class CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent extends FacetAbstract implements
- CssClassFacet {
+ public class CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent extends FacetAbstract implements
+         CssClassFacet {
  
-     //private static final Logger LOG = LoggerFactory.getLogger(CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.class);
 -    private static final Logger LOG = LoggerFactory.getLogger(
 -            CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.class);
++    //private static final Logger LOG = LoggerFactory.getLogger(CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.class);
  
      public static Facet create(
-             final List<DomainObjectLayout> domainObjectLayouts,
 -            final ViewModelLayout viewModelLayout,
++            final List<ViewModelLayout> viewModelLayouts,
              final ServicesInjector servicesInjector,
              final IsisConfiguration configuration, final FacetHolder facetHolder) {
 -        if(viewModelLayout == null) {
 -            return null;
 -        }
 -        final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass = viewModelLayout.cssClassUiEvent();
 -
 -        if(!EventUtil.eventTypeIsPostable(
 -                cssClassUiEventClass,
 -                CssClassUiEvent.Noop.class,
 -                CssClassUiEvent.Default.class,
 -                "isis.reflector.facet.viewModelLayoutAnnotation.cssClassUiEvent.postForDefault",
 -                configuration)) {
 -            return null;
 -        }
 -
 -        final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
  
-         return domainObjectLayouts.stream()
-                 .map(DomainObjectLayout::cssClassUiEvent)
 -        return new CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent(
 -                cssClassUiEventClass, eventBusService, facetHolder);
++        return viewModelLayouts.stream()
++                .map(ViewModelLayout::cssClassUiEvent)
 +                .filter(cssClassUiEventClass -> EventUtil.eventTypeIsPostable(
 +                        cssClassUiEventClass,
 +                        CssClassUiEvent.Noop.class,
 +                        CssClassUiEvent.Default.class,
-                         "isis.reflector.facet.domainObjectLayoutAnnotation.cssClassUiEvent.postForDefault",
++                        "isis.reflector.facet.viewModelLayoutAnnotation.cssClassUiEvent.postForDefault",
 +                        configuration))
 +                .findFirst()
 +                .map(cssClassUiEventClass -> {
 +                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
-                     return new CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent(
++                    return new CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent(
 +                            cssClassUiEventClass, eventBusService, facetHolder);
 +                })
 +                .orElse(null);
- 
      }
  
      private final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass;
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
index edb4e66,5618abb..91addcd
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
@@@ -44,48 -42,66 +44,66 @@@ public class DomainObjectLayoutFacetFac
  
          FacetUtil.addFacet(
                  TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.create(
 -                        domainObjectLayout, servicesInjector, getConfiguration(), facetHolder));
 +                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
          FacetUtil.addFacet(
+                 TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.create(
 -                        viewModelLayout, servicesInjector, getConfiguration(), facetHolder));
++                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
+ 
+         FacetUtil.addFacet(
                  IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.create(
 -                        domainObjectLayout, servicesInjector, getConfiguration(), facetHolder));
 +                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
          FacetUtil.addFacet(
+                 IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.create(
 -                        viewModelLayout, servicesInjector, getConfiguration(), facetHolder));
++                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
+ 
+         FacetUtil.addFacet(
                  CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.create(
 -                        domainObjectLayout, servicesInjector, getConfiguration(), facetHolder));
 +                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
+         FacetUtil.addFacet(
+                 CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.create(
 -                        viewModelLayout, servicesInjector, getConfiguration(), facetHolder));
++                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
+ 
+         FacetUtil.addFacet(
+                 LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.create(
 -                        domainObjectLayout, servicesInjector, getConfiguration(), facetHolder));
++                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
+         FacetUtil.addFacet(
+                 LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.create(
 -                        viewModelLayout, servicesInjector, getConfiguration(), facetHolder));
++                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
  
          FacetUtil.addFacet(
 -                CssClassFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
 +                CssClassFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
          FacetUtil.addFacet(
 -                CssClassFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
 +                CssClassFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
  
          FacetUtil.addFacet(
 -                CssClassFaFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
 +                CssClassFaFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
          FacetUtil.addFacet(
 -                CssClassFaFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
 +                CssClassFaFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
  
          FacetUtil.addFacet(
 -                DescribedAsFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
 +                DescribedAsFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
          FacetUtil.addFacet(
 -                DescribedAsFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
 +                DescribedAsFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
  
          FacetUtil.addFacet(
 -                NamedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
 +                NamedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
          FacetUtil.addFacet(
 -                NamedFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
 +                NamedFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
  
          FacetUtil.addFacet(
 -                PagedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
 +                PagedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
          FacetUtil.addFacet(
 -                PagedFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
 +                PagedFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
  
          FacetUtil.addFacet(
 -                PluralFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
 +                PluralFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
          FacetUtil.addFacet(
 -                PluralFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
 +                PluralFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
  
          FacetUtil.addFacet(
 -                BookmarkPolicyFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
 +                BookmarkPolicyFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
          FacetUtil.addFacet(
 -                BookmarkPolicyFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
 +                BookmarkPolicyFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
  
          return;
      }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java
index 0000000,596f2d8..abe591f
mode 000000,100644..100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java
@@@ -1,0 -1,122 +1,120 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ 
+ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
+ 
++import java.util.List;
+ import java.util.Map;
+ 
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
 -
+ import org.apache.isis.applib.NonRecoverableException;
+ import org.apache.isis.applib.annotation.ViewModelLayout;
++import org.apache.isis.applib.events.ui.IconUiEvent;
+ import org.apache.isis.applib.services.eventbus.EventBusService;
 -import org.apache.isis.applib.services.eventbus.IconUiEvent;
 -import org.apache.isis.core.commons.config.IsisConfiguration;
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
++import org.apache.isis.commons.internal.base._Casts;
++import org.apache.isis.config.IsisConfiguration;
+ import org.apache.isis.core.metamodel.facetapi.Facet;
+ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+ import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
+ import org.apache.isis.core.metamodel.facets.object.icon.IconFacetAbstract;
+ import org.apache.isis.core.metamodel.services.ServicesInjector;
++import org.apache.isis.core.metamodel.spec.ManagedObject;
+ import org.apache.isis.core.metamodel.util.EventUtil;
+ 
+ public class IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent extends IconFacetAbstract {
+ 
 -    private static final Logger LOG = LoggerFactory.getLogger(
 -            IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.class);
++    //private static final Logger LOG = LoggerFactory.getLogger(IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.class);
+ 
+     public static Facet create(
 -            final ViewModelLayout viewModelLayout,
++            final List<ViewModelLayout> viewModelLayouts,
+             final ServicesInjector servicesInjector,
+             final IsisConfiguration configuration, final FacetHolder facetHolder) {
 -        if(viewModelLayout == null) {
 -            return null;
 -        }
 -        final Class<? extends IconUiEvent<?>> iconUiEventClass = viewModelLayout.iconUiEvent();
 -
 -        if(!EventUtil.eventTypeIsPostable(
 -                iconUiEventClass,
 -                IconUiEvent.Noop.class,
 -                IconUiEvent.Default.class,
 -                "isis.reflector.facet.viewModelLayoutAnnotation.iconUiEvent.postForDefault",
 -                configuration)) {
 -            return null;
 -        }
 -
 -        final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
+ 
 -        return new IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent(
 -                iconUiEventClass, eventBusService, facetHolder);
++        return viewModelLayouts.stream()
++                .map(ViewModelLayout::iconUiEvent)
++                .filter(iconUiEvent -> EventUtil.eventTypeIsPostable(
++                        iconUiEvent,
++                        IconUiEvent.Noop.class,
++                        IconUiEvent.Default.class,
++                        "isis.reflector.facet.viewModelLayoutAnnotation.iconUiEvent.postForDefault",
++                        configuration))
++                .findFirst()
++                .map(iconUiEvent -> {
++
++                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
++
++                    return new IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent(
++                            iconUiEvent, eventBusService, facetHolder);
++                })
++                .orElse(null);
+     }
+ 
+     private final Class<? extends IconUiEvent<?>> iconUiEventClass;
+     private final EventBusService eventBusService;
+ 
+     public IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent(
+             final Class<? extends IconUiEvent<?>> iconUiEventClass,
+             final EventBusService eventBusService,
+             final FacetHolder holder) {
+         super(holder);
+         this.iconUiEventClass = iconUiEventClass;
+         this.eventBusService = eventBusService;
+     }
+ 
+     @Override
 -    public String iconName(final ObjectAdapter owningAdapter) {
++    public String iconName(final ManagedObject owningAdapter) {
+ 
+         final IconUiEvent<Object> iconUiEvent = newIconUiEvent(owningAdapter);
+ 
+         eventBusService.post(iconUiEvent);
+ 
+         final String iconName = iconUiEvent.getIconName();
+ 
+         if(iconName == null) {
+             // ie no subscribers out there...
+             final Facet underlyingFacet = getUnderlyingFacet();
+             if(underlyingFacet instanceof IconFacet) {
+                 final IconFacet underlyingIconFacet = (IconFacet) underlyingFacet;
+                 return underlyingIconFacet.iconName(owningAdapter);
+             }
+         }
+ 
+         return iconName; // could be null
+     }
+ 
 -    private IconUiEvent<Object> newIconUiEvent(final ObjectAdapter owningAdapter) {
 -        final Object domainObject = owningAdapter.getObject();
 -        return newIconUiEvent(domainObject);
++    private IconUiEvent<Object> newIconUiEvent(final ManagedObject owningAdapter) {
++        final Object domainObject = owningAdapter.getPojo();
++        return newIconUiEventForPojo(domainObject);
+     }
+ 
 -    private IconUiEvent<Object> newIconUiEvent(final Object domainObject) {
++    private IconUiEvent<Object> newIconUiEventForPojo(final Object domainObject) {
+         try {
 -            final IconUiEvent<Object> iconUiEvent = (IconUiEvent<Object>) iconUiEventClass.newInstance();
++            final IconUiEvent<Object> iconUiEvent = _Casts.uncheckedCast(iconUiEventClass.newInstance());
+             iconUiEvent.setSource(domainObject);
+             return iconUiEvent;
+         } catch (InstantiationException | IllegalAccessException ex) {
+             throw new NonRecoverableException(ex);
+         }
+     }
+ 
+     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+         super.appendAttributesTo(attributeMap);
+         attributeMap.put("iconUiEventClass", iconUiEventClass);
+     }
+ 
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java
index 8337fa0,b2bd9bd..2e79d11
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java
@@@ -19,98 -19,98 +19,94 @@@
  
  package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
  
 +import java.util.List;
  import java.util.Map;
  
--import org.slf4j.Logger;
--import org.slf4j.LoggerFactory;
--
  import org.apache.isis.applib.NonRecoverableException;
  import org.apache.isis.applib.annotation.DomainObjectLayout;
- import org.apache.isis.applib.events.ui.CssClassUiEvent;
  import org.apache.isis.applib.services.eventbus.EventBusService;
- import org.apache.isis.commons.internal.base._Casts;
+ import org.apache.isis.applib.services.eventbus.LayoutUiEvent;
 -import org.apache.isis.core.commons.config.IsisConfiguration;
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 +import org.apache.isis.config.IsisConfiguration;
  import org.apache.isis.core.metamodel.facetapi.Facet;
--import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
  import org.apache.isis.core.metamodel.facetapi.FacetHolder;
- import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
- import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetAbstract;
  import org.apache.isis.core.metamodel.services.ServicesInjector;
 +import org.apache.isis.core.metamodel.spec.ManagedObject;
  import org.apache.isis.core.metamodel.util.EventUtil;
  
- public class CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent extends FacetAbstract implements
- CssClassFacet {
 -public class LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent extends FacetAbstract implements
++public class LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent extends LayoutFacetAbstract implements
+         LayoutFacet {
  
-     //private static final Logger LOG = LoggerFactory.getLogger(CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.class);
 -    private static final Logger LOG = LoggerFactory.getLogger(
 -            LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.class);
++    //private static final Logger LOG = LoggerFactory.getLogger(LayoutFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.class);
  
      public static Facet create(
 -            final DomainObjectLayout domainObjectLayout,
 +            final List<DomainObjectLayout> domainObjectLayouts,
              final ServicesInjector servicesInjector,
              final IsisConfiguration configuration, final FacetHolder facetHolder) {
 -        if(domainObjectLayout == null) {
 -            return null;
 -        }
 -        final Class<? extends LayoutUiEvent<?>> layoutUiEventClass = domainObjectLayout.layoutUiEvent();
 -
 -        if(!EventUtil.eventTypeIsPostable(
 -                layoutUiEventClass,
 -                LayoutUiEvent.Noop.class,
 -                LayoutUiEvent.Default.class,
 -                "isis.reflector.facet.domainObjectLayoutAnnotation.layoutUiEvent.postForDefault",
 -                configuration)) {
 -            return null;
 -        }
 -
 -        final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
  
 -        return new LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
 -                layoutUiEventClass, eventBusService, facetHolder);
 +        return domainObjectLayouts.stream()
-                 .map(DomainObjectLayout::cssClassUiEvent)
-                 .filter(cssClassUiEventClass -> EventUtil.eventTypeIsPostable(
-                         cssClassUiEventClass,
-                         CssClassUiEvent.Noop.class,
-                         CssClassUiEvent.Default.class,
-                         "isis.reflector.facet.domainObjectLayoutAnnotation.cssClassUiEvent.postForDefault",
++                .map(DomainObjectLayout::layoutUiEvent)
++                .filter(layoutUiEvent -> EventUtil.eventTypeIsPostable(
++                        layoutUiEvent,
++                        LayoutUiEvent.Noop.class,
++                        LayoutUiEvent.Default.class,
++                        "isis.reflector.facet.domainObjectLayoutAnnotation.layoutUiEvent.postForDefault",
 +                        configuration))
 +                .findFirst()
-                 .map(cssClassUiEventClass -> {
++                .map(layoutUiEvent -> {
++
 +                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
-                     return new CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent(
-                             cssClassUiEventClass, eventBusService, facetHolder);
++
++                    return new LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
++                            layoutUiEvent, eventBusService, facetHolder);
 +                })
 +                .orElse(null);
- 
      }
  
-     private final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass;
+     private final Class<? extends LayoutUiEvent<?>> layoutUiEventClass;
      private final EventBusService eventBusService;
  
-     public CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent(
-             final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass,
-                     final EventBusService eventBusService,
-                     final FacetHolder holder) {
-         super(CssClassFacetAbstract.type(), holder, Derivation.NOT_DERIVED);
-         this.cssClassUiEventClass = cssClassUiEventClass;
+     public LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
+             final Class<? extends LayoutUiEvent<?>> layoutUiEventClass,
+             final EventBusService eventBusService,
+             final FacetHolder holder) {
 -        super(LayoutFacetAbstract.type(), holder, Derivation.NOT_DERIVED);
++        super(holder);
+         this.layoutUiEventClass = layoutUiEventClass;
          this.eventBusService = eventBusService;
      }
  
      @Override
-     public String cssClass(final ManagedObject owningAdapter) {
 -    public String layout(final ObjectAdapter owningAdapter) {
++    public String layout(final ManagedObject owningAdapter) {
  
-         final CssClassUiEvent<Object> cssClassUiEvent = newCssClassUiEvent(owningAdapter);
+         final LayoutUiEvent<Object> layoutUiEvent = newLayoutUiEvent(owningAdapter);
  
-         eventBusService.post(cssClassUiEvent);
+         eventBusService.post(layoutUiEvent);
  
-         final String cssClass = cssClassUiEvent.getCssClass();
+         final String layout = layoutUiEvent.getLayout();
  
-         if(cssClass == null) {
+         if(layout == null) {
              // ie no subscribers out there...
              final Facet underlyingFacet = getUnderlyingFacet();
-             if(underlyingFacet instanceof CssClassFacet) {
-                 final CssClassFacet underlyingCssClassFacet = (CssClassFacet) underlyingFacet;
-                 return underlyingCssClassFacet.cssClass(owningAdapter);
+             if(underlyingFacet instanceof LayoutFacet) {
+                 final LayoutFacet underlyingLayoutFacet = (LayoutFacet) underlyingFacet;
+                 return underlyingLayoutFacet.layout(owningAdapter);
              }
          }
  
-         return cssClass;
+         return layout;
      }
  
-     private CssClassUiEvent<Object> newCssClassUiEvent(final ManagedObject owningAdapter) {
 -    private LayoutUiEvent<Object> newLayoutUiEvent(final ObjectAdapter owningAdapter) {
 -        final Object domainObject = owningAdapter.getObject();
++    private LayoutUiEvent<Object> newLayoutUiEvent(final ManagedObject owningAdapter) {
 +        final Object domainObject = owningAdapter.getPojo();
-         return newCssClassUiEventForPojo(domainObject);
+         return newLayoutUiEvent(domainObject);
      }
  
-     private CssClassUiEvent<Object> newCssClassUiEventForPojo(final Object domainObject) {
+     private LayoutUiEvent<Object> newLayoutUiEvent(final Object domainObject) {
          try {
-             final CssClassUiEvent<Object> cssClassUiEvent = _Casts.uncheckedCast(cssClassUiEventClass.newInstance());
-             cssClassUiEvent.setSource(domainObject);
-             return cssClassUiEvent;
+             final LayoutUiEvent<Object> layoutUiEvent = (LayoutUiEvent<Object>) layoutUiEventClass.newInstance();
+             layoutUiEvent.setSource(domainObject);
+             return layoutUiEvent;
          } catch (InstantiationException | IllegalAccessException ex) {
              throw new NonRecoverableException(ex);
          }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
index 0000000,a2c17b8..733b3e3
mode 000000,100644..100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
@@@ -1,0 -1,123 +1,119 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ 
+ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
+ 
++import java.util.List;
+ import java.util.Map;
+ 
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
 -
+ import org.apache.isis.applib.NonRecoverableException;
+ import org.apache.isis.applib.annotation.ViewModelLayout;
+ import org.apache.isis.applib.services.eventbus.EventBusService;
+ import org.apache.isis.applib.services.eventbus.LayoutUiEvent;
 -import org.apache.isis.core.commons.config.IsisConfiguration;
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
++import org.apache.isis.config.IsisConfiguration;
+ import org.apache.isis.core.metamodel.facetapi.Facet;
 -import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetAbstract;
+ import org.apache.isis.core.metamodel.services.ServicesInjector;
++import org.apache.isis.core.metamodel.spec.ManagedObject;
+ import org.apache.isis.core.metamodel.util.EventUtil;
+ 
 -public class LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent extends FacetAbstract implements
++public class LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent extends LayoutFacetAbstract implements
+         LayoutFacet {
+ 
 -    private static final Logger LOG = LoggerFactory.getLogger(
 -            LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.class);
++    //private static final Logger LOG = LoggerFactory.getLogger(LayoutFacetViaViewModelLayoutAnnotationUsingIconUiEvent.class);
+ 
+     public static Facet create(
 -            final ViewModelLayout viewModelLayout,
++            final List<ViewModelLayout> viewModelLayouts,
+             final ServicesInjector servicesInjector,
+             final IsisConfiguration configuration, final FacetHolder facetHolder) {
 -        if(viewModelLayout == null) {
 -            return null;
 -        }
 -        final Class<? extends LayoutUiEvent<?>> layoutUiEventClass = viewModelLayout.layoutUiEvent();
 -
 -        if(!EventUtil.eventTypeIsPostable(
 -                layoutUiEventClass,
 -                LayoutUiEvent.Noop.class,
 -                LayoutUiEvent.Default.class,
 -                "isis.reflector.facet.viewModelLayoutAnnotation.layoutUiEvent.postForDefault",
 -                configuration)) {
 -            return null;
 -        }
 -
 -        final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
+ 
 -        return new LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent(
 -                layoutUiEventClass, eventBusService, facetHolder);
++        return viewModelLayouts.stream()
++                .map(ViewModelLayout::layoutUiEvent)
++                .filter(layoutUiEvent -> EventUtil.eventTypeIsPostable(
++                        layoutUiEvent,
++                        LayoutUiEvent.Noop.class,
++                        LayoutUiEvent.Default.class,
++                        "isis.reflector.facet.viewModelLayoutAnnotation.layoutUiEvent.postForDefault",
++                        configuration))
++                .findFirst()
++                .map(layoutUiEvent -> {
++
++                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
++
++                    return new LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
++                            layoutUiEvent, eventBusService, facetHolder);
++                })
++                .orElse(null);
+     }
+ 
+     private final Class<? extends LayoutUiEvent<?>> layoutUiEventClass;
+     private final EventBusService eventBusService;
+ 
+     public LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent(
+             final Class<? extends LayoutUiEvent<?>> layoutUiEventClass,
+             final EventBusService eventBusService,
+             final FacetHolder holder) {
 -        super(LayoutFacetAbstract.type(), holder, Derivation.NOT_DERIVED);
++        super(holder);
+         this.layoutUiEventClass = layoutUiEventClass;
+         this.eventBusService = eventBusService;
+     }
+ 
+     @Override
 -    public String layout(final ObjectAdapter owningAdapter) {
++    public String layout(final ManagedObject owningAdapter) {
+ 
+         final LayoutUiEvent<Object> layoutUiEvent = newLayoutUiEvent(owningAdapter);
+ 
+         eventBusService.post(layoutUiEvent);
+ 
+         final String layout = layoutUiEvent.getLayout();
+ 
+         if(layout == null) {
+             // ie no subscribers out there...
+             final Facet underlyingFacet = getUnderlyingFacet();
+             if(underlyingFacet instanceof LayoutFacet) {
+                 final LayoutFacet underlyingLayoutFacet = (LayoutFacet) underlyingFacet;
+                 return underlyingLayoutFacet.layout(owningAdapter);
+             }
+         }
+ 
+         return layout;
+     }
+ 
 -    private LayoutUiEvent<Object> newLayoutUiEvent(final ObjectAdapter owningAdapter) {
 -        final Object domainObject = owningAdapter.getObject();
++    private LayoutUiEvent<Object> newLayoutUiEvent(final ManagedObject owningAdapter) {
++        final Object domainObject = owningAdapter.getPojo();
+         return newLayoutUiEvent(domainObject);
+     }
+ 
+     private LayoutUiEvent<Object> newLayoutUiEvent(final Object domainObject) {
+         try {
+             final LayoutUiEvent<Object> layoutUiEvent = (LayoutUiEvent<Object>) layoutUiEventClass.newInstance();
+             layoutUiEvent.setSource(domainObject);
+             return layoutUiEvent;
+         } catch (InstantiationException | IllegalAccessException ex) {
+             throw new NonRecoverableException(ex);
+         }
+     }
+ 
+     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+         super.appendAttributesTo(attributeMap);
+         attributeMap.put("layoutUiEventClass", layoutUiEventClass);
+     }
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java
index 0000000,e16b058..dcb67e7
mode 000000,100644..100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java
@@@ -1,0 -1,136 +1,141 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ 
+ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
+ 
++import java.util.List;
+ import java.util.Map;
+ 
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
+ 
+ import org.apache.isis.applib.NonRecoverableException;
+ import org.apache.isis.applib.annotation.ViewModelLayout;
++import org.apache.isis.applib.events.ui.TitleUiEvent;
+ import org.apache.isis.applib.services.eventbus.EventBusService;
 -import org.apache.isis.applib.services.eventbus.TitleUiEvent;
+ import org.apache.isis.applib.services.i18n.TranslatableString;
+ import org.apache.isis.applib.services.i18n.TranslationService;
 -import org.apache.isis.core.commons.config.IsisConfiguration;
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
++import org.apache.isis.commons.internal.base._Casts;
++import org.apache.isis.config.IsisConfiguration;
+ import org.apache.isis.core.metamodel.facetapi.Facet;
+ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+ import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
+ import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
+ import org.apache.isis.core.metamodel.services.ServicesInjector;
++import org.apache.isis.core.metamodel.spec.ManagedObject;
+ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+ import org.apache.isis.core.metamodel.util.EventUtil;
+ 
+ public class TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent extends TitleFacetAbstract {
+ 
 -    private static final Logger LOG = LoggerFactory.getLogger(
 -            TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.class);
++    //private static final Logger LOG = LoggerFactory.getLogger(TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.class);
+ 
+     public static Facet create(
 -            final ViewModelLayout viewModelLayout,
++            final List<ViewModelLayout> viewModelLayouts,
+             final ServicesInjector servicesInjector,
+             final IsisConfiguration configuration, final FacetHolder facetHolder) {
 -        if(viewModelLayout == null) {
 -            return null;
 -        }
 -        final Class<? extends TitleUiEvent<?>> titleUiEventClass = viewModelLayout.titleUiEvent();
 -
 -        if(!EventUtil.eventTypeIsPostable(
 -                titleUiEventClass,
 -                TitleUiEvent.Noop.class,
 -                TitleUiEvent.Default.class,
 -                "isis.reflector.facet.viewModelLayoutAnnotation.titleUiEvent.postForDefault",
 -                configuration)) {
 -            return null;
 -        }
 -
 -        final TranslationService translationService = servicesInjector.lookupService(TranslationService.class);
 -        final ObjectSpecification facetHolderAsSpec = (ObjectSpecification) facetHolder; // bit naughty...
 -        final String translationContext = facetHolderAsSpec.getCorrespondingClass().getCanonicalName();
 -        final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
+ 
 -        return new TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent(
 -                titleUiEventClass, translationService, translationContext, eventBusService, facetHolder);
++        return viewModelLayouts.stream()
++                .map(ViewModelLayout::titleUiEvent)
++                .filter(titleUiEvent -> EventUtil.eventTypeIsPostable(
++                        titleUiEvent,
++                        TitleUiEvent.Noop.class,
++                        TitleUiEvent.Default.class,
++                        "isis.reflector.facet.viewModelLayoutAnnotation.titleUiEvent.postForDefault",
++                        configuration))
++                .findFirst()
++                .map(titleUiEventClass -> {
++                    final TranslationService translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);
++
++                    final String translationContext;
++                    if(facetHolder instanceof ObjectSpecification) {
++                        final ObjectSpecification facetHolderAsSpec = (ObjectSpecification) facetHolder; // bit naughty...
++                        translationContext = facetHolderAsSpec.getCorrespondingClass().getCanonicalName();
++                    } else {
++                        translationContext = null;
++                    }
++
++                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
++
++                    return new TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent(
++                            titleUiEventClass, translationService, translationContext, eventBusService, facetHolder);
++                })
++                .orElse(null);
+     }
+ 
+     private final Class<? extends TitleUiEvent<?>> titleUiEventClass;
+     private final TranslationService translationService;
+     private final String translationContext;
+     private final EventBusService eventBusService;
+ 
+     public TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent(
+             final Class<? extends TitleUiEvent<?>> titleUiEventClass,
+             final TranslationService translationService,
+             final String translationContext,
+             final EventBusService eventBusService,
+             final FacetHolder holder) {
+         super(holder);
+         this.titleUiEventClass = titleUiEventClass;
+         this.translationService = translationService;
+         this.translationContext = translationContext;
+         this.eventBusService = eventBusService;
+     }
+ 
+     @Override
 -    public String title(final ObjectAdapter owningAdapter) {
++    public String title(final ManagedObject owningAdapter) {
+ 
+         final TitleUiEvent<Object> titleUiEvent = newTitleUiEvent(owningAdapter);
+ 
+         eventBusService.post(titleUiEvent);
+ 
+         final TranslatableString translatedTitle = titleUiEvent.getTranslatableTitle();
+         if(translatedTitle != null) {
+             return translatedTitle.translate(translationService, translationContext);
+         }
+         final String title = titleUiEvent.getTitle();
+ 
+         if(title == null) {
+             // ie no subscribers out there...
+             final Facet underlyingFacet = getUnderlyingFacet();
+             if(underlyingFacet instanceof TitleFacet) {
+                 final TitleFacet underlyingTitleFacet = (TitleFacet) underlyingFacet;
+                 return underlyingTitleFacet.title(owningAdapter);
+             }
+         }
+         return title;
+     }
+ 
 -    private TitleUiEvent<Object> newTitleUiEvent(final ObjectAdapter owningAdapter) {
 -        final Object domainObject = owningAdapter.getObject();
++    private TitleUiEvent<Object> newTitleUiEvent(final ManagedObject owningAdapter) {
++        final Object domainObject = owningAdapter.getPojo();
+         return newTitleUiEvent(domainObject);
+     }
+ 
+     private TitleUiEvent<Object> newTitleUiEvent(final Object domainObject) {
+         try {
 -            final TitleUiEvent<Object> titleUiEvent = (TitleUiEvent<Object>) titleUiEventClass.newInstance();
++            final TitleUiEvent<Object> titleUiEvent = _Casts.uncheckedCast(titleUiEventClass.newInstance());
+             titleUiEvent.setSource(domainObject);
+             return titleUiEvent;
+         } catch (InstantiationException | IllegalAccessException ex) {
+             throw new NonRecoverableException(ex);
+         }
+     }
+ 
+     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+         super.appendAttributesTo(attributeMap);
+         attributeMap.put("titleUiEventClass", titleUiEventClass);
+     }
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacet.java
index 11ce9ad,9930ea0..1363bab
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacet.java
@@@ -21,7 -21,8 +21,8 @@@ package org.apache.isis.core.metamodel.
  import org.apache.isis.applib.layout.grid.Grid;
  import org.apache.isis.applib.services.grid.GridSystemService;
  import org.apache.isis.applib.services.layout.LayoutService;
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
  import org.apache.isis.core.metamodel.facetapi.Facet;
++import org.apache.isis.core.metamodel.spec.ManagedObject;
  
  /**
   * Obtain the current grid, derived either from a <code>.layout.xml</code> file, and normalized, or synthesized from
@@@ -34,7 -35,7 +35,7 @@@
   */
  public interface GridFacet extends Facet {
  
-     Grid getGrid();
 -    Grid getGrid(final ObjectAdapter objectAdapter);
++    Grid getGrid(final ManagedObject objectAdapter);
  
  
  }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
index 0a953ce,b36de92..b451469
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
@@@ -18,11 -18,16 +18,13 @@@
   */
  package org.apache.isis.core.metamodel.facets.object.grid;
  
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
 -
  import org.apache.isis.applib.layout.grid.Grid;
- import org.apache.isis.applib.services.grid.GridService;
+ import org.apache.isis.applib.services.grid.GridService2;
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
  import org.apache.isis.core.metamodel.facetapi.Facet;
  import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
  import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
++import org.apache.isis.core.metamodel.spec.ManagedObject;
  import org.apache.isis.core.metamodel.spec.ObjectSpecification;
  
  public class GridFacetDefault
@@@ -53,8 -59,7 +55,7 @@@ implements GridFacet 
          this.gridService = gridService;
      }
  
-     @Override
-     public Grid getGrid() {
 -    public Grid getGrid(final ObjectAdapter objectAdapterIfAny) {
++    public Grid getGrid(final ManagedObject objectAdapterIfAny) {
          if (!gridService.supportsReloading() && this.grid != null) {
              return this.grid;
          }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
index e684a7d,a6d74a3..491b8aa
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
@@@ -16,7 -16,10 +16,7 @@@
   * under the License. */
  package org.apache.isis.core.metamodel.facets.object.grid;
  
- import org.apache.isis.applib.services.grid.GridService;
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
 -
+ import org.apache.isis.applib.services.grid.GridService2;
  import org.apache.isis.core.metamodel.facetapi.FacetHolder;
  import org.apache.isis.core.metamodel.facetapi.FacetUtil;
  import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@@ -34,7 -37,7 +34,7 @@@ public class GridFacetFactory extends F
      public void process(final ProcessClassContext processClassContext) {
          final FacetHolder facetHolder = processClassContext.getFacetHolder();
  
-         final GridService gridService = servicesInjector.lookupServiceElseFail(GridService.class);
 -        final GridService2 gridService = servicesInjector.lookupService(GridService2.class);
++        final GridService2 gridService = servicesInjector.lookupServiceElseFail(GridService2.class);
  
          FacetUtil.addFacet(GridFacetDefault.create(facetHolder, gridService));
      }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java
index 11ce9ad,31d8627..1e661d1
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacet.java
@@@ -16,25 -16,22 +16,22 @@@
   *  specific language governing permissions and limitations
   *  under the License.
   */
- package org.apache.isis.core.metamodel.facets.object.grid;
  
- import org.apache.isis.applib.layout.grid.Grid;
- import org.apache.isis.applib.services.grid.GridSystemService;
- import org.apache.isis.applib.services.layout.LayoutService;
+ package org.apache.isis.core.metamodel.facets.object.layout;
+ 
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
  import org.apache.isis.core.metamodel.facetapi.Facet;
++import org.apache.isis.core.metamodel.spec.ManagedObject;
  
- /**
-  * Obtain the current grid, derived either from a <code>.layout.xml</code> file, and normalized, or synthesized from
-  * existing layout metadata (annotations or <code>layout.json</code>).
-  *
+ /*
+  * Layout for an object.
+  * 
   * <p>
-  *     Most of the heavy lifting is done by delegating to the {@link LayoutService} and {@link GridSystemService}
-  *     services.
-  * </p>
+  * In the standard Apache Isis Programming Model, typically corresponds to a method named <tt>layout</tt>.
+  * 
+  * @see TitleFacet
+  * @see IconFacet
   */
- public interface GridFacet extends Facet {
- 
-     Grid getGrid();
- 
+ public interface LayoutFacet extends Facet {
  
- }
 -    public String layout(final ObjectAdapter objectAdapterIfAny);
++    public String layout(final ManagedObject objectAdapterIfAny);
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
index c57f5fc,3f09631..57036ec
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
@@@ -34,30 -41,90 +34,96 @@@ import org.apache.isis.applib.annotatio
  import org.apache.isis.applib.annotation.NatureOfService;
  import org.apache.isis.applib.annotation.Programmatic;
  import org.apache.isis.applib.layout.grid.Grid;
- import org.apache.isis.applib.services.grid.GridLoaderService;
+ import org.apache.isis.applib.services.grid.GridLoaderService2;
  import org.apache.isis.applib.services.grid.GridSystemService;
  import org.apache.isis.applib.services.jaxb.JaxbService;
 -import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
 +import org.apache.isis.applib.services.message.MessageService;
 +import org.apache.isis.commons.internal.base._NullSafe;
 +import org.apache.isis.commons.internal.collections._Arrays;
++import org.apache.isis.commons.internal.collections._Lists;
 +import org.apache.isis.commons.internal.collections._Maps;
 +import org.apache.isis.commons.internal.context._Context;
 +import org.apache.isis.commons.internal.resources._Resources;
  
  @DomainService(
          nature = NatureOfService.DOMAIN,
          menuOrder = "" + Integer.MAX_VALUE
 -)
 +        )
- public class GridLoaderServiceDefault implements GridLoaderService {
+ public class GridLoaderServiceDefault implements GridLoaderService2 {
  
      private static final Logger LOG = LoggerFactory.getLogger(GridLoaderServiceDefault.class);
  
  
+     static class DomainClassAndLayout {
+         private final Class<?> domainClass;
+         private final String layoutIfAny;
+ 
+         DomainClassAndLayout(final Class<?> domainClass, final String layoutIfAny) {
+             this.domainClass = domainClass;
+             this.layoutIfAny = layoutIfAny;
+         }
+ 
+         @Override public boolean equals(final Object o) {
+             if (this == o)
+                 return true;
+             if (o == null || getClass() != o.getClass())
+                 return false;
+ 
+             final DomainClassAndLayout that = (DomainClassAndLayout) o;
+ 
+             if (domainClass != null ? !domainClass.equals(that.domainClass) : that.domainClass != null)
+                 return false;
+             return layoutIfAny != null ? layoutIfAny.equals(that.layoutIfAny) : that.layoutIfAny == null;
+         }
+ 
+         @Override public int hashCode() {
+             int result = domainClass != null ? domainClass.hashCode() : 0;
+             result = 31 * result + (layoutIfAny != null ? layoutIfAny.hashCode() : 0);
+             return result;
+         }
+ 
+         @Override public String toString() {
+             return "domainClass=" + domainClass +
+                     ", layout='" + layoutIfAny + '\'';
+         }
+     }
+ 
      // for better logging messages (used only in prototyping mode)
-     private final Map<Class<?>, String> badXmlByClass = _Maps.newHashMap();
 -    private final Map<DomainClassAndLayout, String> badXmlByDomainClassAndLayout = Maps.newHashMap();
++    private final Map<DomainClassAndLayout, String> badXmlByDomainClassAndLayout = _Maps.newHashMap();
+ 
+     static class DomainClassAndLayoutAndXml {
+         private final DomainClassAndLayout domainClassAndLayout;
+         private final String xml;
+ 
+         @Override public boolean equals(final Object o) {
+             if (this == o)
+                 return true;
+             if (o == null || getClass() != o.getClass())
+                 return false;
+ 
+             final DomainClassAndLayoutAndXml that = (DomainClassAndLayoutAndXml) o;
+ 
+             if (domainClassAndLayout != null ?
+                     !domainClassAndLayout.equals(that.domainClassAndLayout) :
+                     that.domainClassAndLayout != null)
+                 return false;
+             return xml != null ? xml.equals(that.xml) : that.xml == null;
+         }
+ 
+         @Override public int hashCode() {
+             int result = domainClassAndLayout != null ? domainClassAndLayout.hashCode() : 0;
+             result = 31 * result + (xml != null ? xml.hashCode() : 0);
+             return result;
+         }
+ 
+         DomainClassAndLayoutAndXml(final DomainClassAndLayout domainClassAndLayout, final String xml) {
+             this.domainClassAndLayout = domainClassAndLayout;
+             this.xml = xml;
+         }
+     }
  
      // cache (used only in prototyping mode)
-     private final Map<String, Grid> gridByXml = _Maps.newHashMap();
 -    private final Map<DomainClassAndLayoutAndXml, Grid> gridByDomainClassAndLayoutAndXml = Maps.newHashMap();
++    private final Map<DomainClassAndLayoutAndXml, Grid> gridByDomainClassAndLayoutAndXml = _Maps.newHashMap();
  
      private JAXBContext jaxbContext;
  
@@@ -146,10 -225,10 +215,10 @@@
  
              // note that we don't blacklist if the file exists but couldn't be parsed;
              // the developer might fix so we will want to retry.
-             final String resourceName = resourceNameFor(domainClass);
+             final String resourceName = resourceNameFor(dcal);
              final String message = "Failed to parse " + resourceName + " file (" + ex.getMessage() + ")";
              if(supportsReloading()) {
 -                container.warnUser(message);
 +                messageService.warnUser(message);
              }
              LOG.warn(message);
  
@@@ -173,15 -258,24 +248,23 @@@
          }
      }
  
-     private static String resourceContentOf(final Class<?> cls, final String resourceName) throws IOException {
-         return _Resources.loadAsString(cls, resourceName, Charset.defaultCharset());
+     private static String resourceContentOf(final DomainClassAndLayout dcal, final String resourceName) throws IOException {
 -        final URL url = Resources.getResource(dcal.domainClass, resourceName);
 -        return Resources.toString(url, Charset.defaultCharset());
++        return _Resources.loadAsString(dcal.domainClass, resourceName, Charset.defaultCharset());
      }
  
-     String resourceNameFor(final Class<?> domainClass) {
-         for (final Type type : Type.values()) {
-             final String candidateResourceName = resourceNameFor(domainClass, type);
+     String resourceNameFor(final DomainClassAndLayout dcal) {
 -        final List<String> candidateResourceNames = Lists.newArrayList();
++        final List<String> candidateResourceNames = _Lists.newArrayList();
+         if(dcal.layoutIfAny != null) {
+             candidateResourceNames.add(
+                     String.format("%s-%s.layout.xml", dcal.domainClass.getSimpleName(), dcal.layoutIfAny));
+         }
+         candidateResourceNames.add(
+                 String.format("%s.layout.xml", dcal.domainClass.getSimpleName()));
+         candidateResourceNames.add(
+                 String.format("%s.layout.fallback.xml", dcal.domainClass.getSimpleName()));
+         for (final String candidateResourceName : candidateResourceNames) {
              try {
-                 final URL resource = _Resources.getResourceUrl(domainClass, candidateResourceName); 
 -                final URL resource = Resources.getResource(dcal.domainClass, candidateResourceName);
++                final URL resource = _Resources.getResourceUrl(dcal.domainClass, candidateResourceName);
                  if (resource != null) {
                      return candidateResourceName;
                  }
@@@ -192,38 -286,14 +275,11 @@@
          return null;
      }
  
-     enum Type {
-         DEFAULT {
-             @Override
-             protected String suffix() {
-                 return ".layout.xml";
-             }
-         },
-         FALLBACK {
-             @Override
-             protected String suffix() {
-                 return ".layout.fallback.xml";
-             }
-         };
- 
-         private String resourceNameFor(final Class<?> domainClass) {
-             return domainClass.getSimpleName() + suffix();
-         }
- 
-         protected abstract String suffix();
-     }
- 
-     private String resourceNameFor(
-             final Class<?> domainClass,
-             final Type type) {
-         return type.resourceNameFor(domainClass);
-     }
- 
  
 -    //region > injected dependencies
 +    // -- injected dependencies
  
      @javax.inject.Inject
 -    DeploymentCategoryProvider deploymentCategoryProvider;
 -
 -    @javax.inject.Inject
 -    DomainObjectContainer container;
 +    MessageService messageService;
  
      @javax.inject.Inject
      JaxbService jaxbService;
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
index f2f4c93,323c26b..4659492
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
@@@ -23,20 -32,17 +23,20 @@@ import org.apache.isis.applib.annotatio
  import org.apache.isis.applib.annotation.NatureOfService;
  import org.apache.isis.applib.annotation.Programmatic;
  import org.apache.isis.applib.layout.grid.Grid;
- import org.apache.isis.applib.services.grid.GridLoaderService;
- import org.apache.isis.applib.services.grid.GridService;
+ import org.apache.isis.applib.services.grid.GridLoaderService2;
+ import org.apache.isis.applib.services.grid.GridService2;
  import org.apache.isis.applib.services.grid.GridSystemService;
 +import org.apache.isis.commons.internal.base._Casts;
 +import org.apache.isis.commons.internal.base._NullSafe;
 +import org.apache.isis.commons.internal.collections._Lists;
  
  @DomainService(
          nature = NatureOfService.DOMAIN,
          menuOrder = "" + Integer.MAX_VALUE
 -)
 +        )
- public class GridServiceDefault implements GridService {
+ public class GridServiceDefault implements GridService2 {
  
 -    private static final Logger LOG = LoggerFactory.getLogger(GridServiceDefault.class);
 +    //private static final Logger LOG = LoggerFactory.getLogger(GridServiceDefault.class);
  
      public static final String COMPONENT_TNS = "http://isis.apache.org/applib/layout/component";
      public static final String COMPONENT_SCHEMA_LOCATION = "http://isis.apache.org/applib/layout/component/component.xsd";
@@@ -193,9 -206,9 +199,9 @@@
  
  
      @javax.inject.Inject
-     GridLoaderService gridLoaderService;
+     GridLoaderService2 gridLoaderService;
  
      @javax.inject.Inject
 -    List<GridSystemService> gridSystemServices;
 +    List<GridSystemService<?>> gridSystemServices;
  
  }
diff --cc core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 1043378,8fa2683..61abf8c
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@@ -78,13 -102,29 +78,14 @@@ import org.apache.isis.core.metamodel.f
  import org.apache.isis.core.metamodel.facets.object.ignore.javalang.RemoveMethodsFacetFactory;
  import org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoEnhancementTypesFacetFactory;
  import org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoPrefixedMethodsFacetFactory;
 -import org.apache.isis.core.metamodel.facets.object.immutable.immutablemarkerifc.ImmutableFacetMarkerInterfaceFactory;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetFactory;
 -import org.apache.isis.core.metamodel.facets.object.mask.annotation.MaskFacetOnTypeAnnotationFactory;
 -import org.apache.isis.core.metamodel.facets.object.maxlen.annotation.MaxLengthFacetOnTypeAnnotationFactory;
 -import org.apache.isis.core.metamodel.facets.object.membergroups.annotprop.MemberGroupLayoutFacetFactory;
  import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForMixinAnnotationFactory;
 -import org.apache.isis.core.metamodel.facets.object.multiline.annotation.MultiLineFacetOnTypeAnnotationFactory;
 -import org.apache.isis.core.metamodel.facets.object.named.annotation.NamedFacetOnTypeAnnotationFactory;
 -import org.apache.isis.core.metamodel.facets.object.notpersistable.notpersistableannot.NotPersistableFacetAnnotationFactory;
 -import org.apache.isis.core.metamodel.facets.object.notpersistable.notpersistablemarkerifc.NotPersistableFacetMarkerInterfaceFactory;
 +import org.apache.isis.core.metamodel.facets.object.navparent.annotation.NavigableParentAnnotationFacetFactory;
  import org.apache.isis.core.metamodel.facets.object.objectspecid.classname.ObjectSpecIdFacetDerivedFromClassNameFactory;
  import org.apache.isis.core.metamodel.facets.object.objectvalidprops.impl.ObjectValidPropertiesFacetImplFactory;
 -import org.apache.isis.core.metamodel.facets.object.paged.annotation.PagedFacetOnTypeAnnotationFactory;
 -import org.apache.isis.core.metamodel.facets.object.parented.aggregated.AggregatedAnnotationFactory;
 -import org.apache.isis.core.metamodel.facets.object.parseable.annotcfg.ParseableFacetAnnotationElseConfigurationFactory;
 -import org.apache.isis.core.metamodel.facets.object.plural.annotation.PluralAnnotationFacetFactory;
 -import org.apache.isis.core.metamodel.facets.object.plural.staticmethod.PluralFacetStaticMethodFactory;
  import org.apache.isis.core.metamodel.facets.object.recreatable.RecreatableObjectFacetFactory;
 -import org.apache.isis.core.metamodel.facets.object.regex.annotation.RegExFacetOnTypeAnnotationFactory;
  import org.apache.isis.core.metamodel.facets.object.title.annotation.TitleAnnotationFacetFactory;
  import org.apache.isis.core.metamodel.facets.object.title.methods.TitleFacetViaMethodsFactory;
 -import org.apache.isis.core.metamodel.facets.object.typicallen.annotation.TypicalLengthFacetOnTypeAnnotationFactory;
 -import org.apache.isis.core.metamodel.facets.object.validating.mustsatisfyspec.MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacetFactory;
  import org.apache.isis.core.metamodel.facets.object.validating.validateobject.method.ValidateObjectFacetMethodFactory;
  import org.apache.isis.core.metamodel.facets.object.value.annotcfg.ValueFacetAnnotationOrConfigurationFactory;
  import org.apache.isis.core.metamodel.facets.param.autocomplete.method.ActionParameterAutoCompleteFacetViaMethodFactory;
@@@ -306,12 -409,12 +307,13 @@@ public final class ProgrammingModelFace
          addFactory(new TitleAnnotationFacetFactory());
          addFactory(new TitleFacetViaMethodsFactory());
          addFactory(new IconFacetMethodFactory());
 +        addFactory(new NavigableParentAnnotationFacetFactory());
          addFactory(new CssClassFacetMethodFactory());
+         addFactory(new LayoutFacetFactory());
  
 -
          addFactory(new DomainServiceLayoutFacetFactory());
          addFactory(new DomainObjectLayoutFacetFactory());
 +
          // must come after MultiLine
          addFactory(new PropertyLayoutFacetFactory());
          addFactory(new ParameterLayoutFacetFactory());
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index 0a6e226,d796a9e..e7d0add
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@@ -182,26 -168,9 +183,28 @@@ extends PanelAbstract<EntityCollectionM
              // the facet should always exist, in fact
              // just enough to ask for the metadata.
              // This will cause the current ObjectSpec to be updated as a side effect.
-             final Grid grid = gridFacet.getGrid();
-             
+             final EntityModel entityModel = getModel().getEntityModel();
+             final ObjectAdapter objectAdapterIfAny = entityModel != null ? entityModel.getObject() : null;
 -            final Grid unused = gridFacet.getGrid(objectAdapterIfAny);
++            final Grid grid = gridFacet.getGrid(objectAdapterIfAny);
++
 +            
 +            final Map<String, Integer> propertyIdOrderWithinGrid = new HashMap<>();
 +            grid.getAllPropertiesById().forEach((propertyId, __)->{
 +                propertyIdOrderWithinGrid.put(propertyId, propertyIdOrderWithinGrid.size());
 +            });
 +
 +            // if propertyId is mentioned within grid, put into first 'half' ordered by 
 +            // occurrence within grid
 +            // if propertyId is not mentioned within grid, put into second 'half' ordered by
 +            // propertyId (String) in natural order
 +            propertyIdComparator = Comparator
 +                    .<String>comparingInt(propertyId->
 +                        propertyIdOrderWithinGrid.getOrDefault(propertyId, Integer.MAX_VALUE))
 +                    .thenComparing(Comparator.naturalOrder());
 +            
 +            
 +        } else {
 +            propertyIdComparator = null;
          }
  
          final Where whereContext =
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
index 1d5f323,fa1b89d..60d962e
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
@@@ -26,14 -31,19 +26,12 @@@ import org.apache.wicket.markup.html.We
  import org.apache.wicket.markup.html.basic.Label;
  import org.apache.wicket.model.Model;
  
 -import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
  import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 -import org.apache.isis.viewer.wicket.model.common.OnSelectionHandler;
 -import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
  import org.apache.isis.viewer.wicket.model.models.ActionModel;
- import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
  import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
  import org.apache.isis.viewer.wicket.ui.ComponentFactory;
  import org.apache.isis.viewer.wicket.ui.ComponentType;
  import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
- import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptModalWindow;
 -import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
 -import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsHelper;
 -import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsLinkFactory;
 -import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsProvider;
  import org.apache.isis.viewer.wicket.ui.components.collection.count.CollectionCountProvider;
  import org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorHelper;
  import org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorPanel;
@@@ -43,19 -54,22 +41,17 @@@ import org.apache.isis.viewer.wicket.ui
  import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
  
  public class StandaloneCollectionPanel extends PanelAbstract<EntityCollectionModel>
- implements CollectionCountProvider, CollectionSelectorProvider, ActionPromptProvider {
 -        implements CollectionCountProvider, CollectionSelectorProvider, BulkActionsProvider {
++implements CollectionCountProvider, CollectionSelectorProvider {
  
      private static final long serialVersionUID = 1L;
  
      private static final String ID_STANDALONE_COLLECTION = "standaloneCollection";
      private static final String ID_ACTION_NAME = "actionName";
  
-     private static final String ID_ACTION_PROMPT_MODAL_WINDOW = "actionPromptModalWindow";
 -    private static final String ID_ADDITIONAL_LINKS = "additionalLinks";
 -    private static final String ID_ADDITIONAL_LINK = "additionalLink";
 -
      private static final String ID_SELECTOR_DROPDOWN = "selectorDropdown";
  
-     private final ActionPromptModalWindow actionPromptModalWindow;
      private final CollectionSelectorPanel selectorDropdownPanel;
 -    private final BulkActionsHelper bulkActionsHelper;
  
 -    private boolean additionalLinksAdded;
  
      private MarkupContainer outerDiv = this;
  
@@@ -105,17 -118,76 +97,10 @@@
  
          final ComponentFactoryRegistry componentFactoryRegistry = getComponentFactoryRegistry();
          componentFactoryRegistry.addOrReplaceComponent(outerDiv, ComponentType.COLLECTION_CONTENTS, entityCollectionModel);
 -
 -        bulkActionsHelper = new BulkActionsHelper(entityCollectionModel);
      }
  
-     // -- ActionPromptModalWindowProvider
- 
-     @Override
-     public ActionPromptModalWindow getActionPrompt() {
-         return actionPromptModalWindow;
-     }
- 
  
 -    //region > BulkActionsProvider
 -
 -    ObjectAdapterToggleboxColumn toggleboxColumn;
 -
 -    @Override
 -    public ObjectAdapterToggleboxColumn getToggleboxColumn() {
 -
 -        if (toggleboxColumn == null) {
 -            final List<ObjectAction> bulkActions = bulkActionsHelper.getBulkActions(getIsisSessionFactory());
 -
 -            final EntityCollectionModel entityCollectionModel = getModel();
 -            if(bulkActions.isEmpty() || entityCollectionModel.isParented()) {
 -                return null;
 -            }
 -
 -            toggleboxColumn = new ObjectAdapterToggleboxColumn();
 -            final OnSelectionHandler handler = new OnSelectionHandler() {
 -
 -                private static final long serialVersionUID = 1L;
 -
 -                @Override
 -                public void onSelected(
 -                        final Component context,
 -                        final ObjectAdapter selectedAdapter,
 -                        final AjaxRequestTarget ajaxRequestTarget) {
 -                    getModel().toggleSelectionOn(selectedAdapter);
 -                }
 -
 -            };
 -            toggleboxColumn.setOnSelectionHandler(handler);
 -        }
 -
 -        return toggleboxColumn;
 -    }
 -
 -    @Override
 -    public void configureBulkActions(final ObjectAdapterToggleboxColumn toggleboxColumn) {
 -
 -        if(additionalLinksAdded) {
 -            return;
 -        }
 -        final BulkActionsLinkFactory linkFactory =
 -                new BulkActionsLinkFactory(getModel(), toggleboxColumn);
 -
 -        final List<ObjectAction> bulkActions = bulkActionsHelper.getBulkActions(getIsisSessionFactory());
 -
 -        List<LinkAndLabel> linkAndLabels = Lists.transform(bulkActions, new Function<ObjectAction, LinkAndLabel>(){
 -            @Override
 -            public LinkAndLabel apply(ObjectAction objectAction) {
 -                return linkFactory.newLink(objectAction, ID_ADDITIONAL_LINK, null);
 -            }
 -        });
 -
 -        AdditionalLinksPanel.addAdditionalLinks(
 -                outerDiv, ID_ADDITIONAL_LINKS, linkAndLabels, AdditionalLinksPanel.Style.INLINE_LIST);
 -        additionalLinksAdded = true;
 -
 -    }
 -
 -    //endregion
 -
 -
 -
 -
 -    //region > CollectionSelectorProvider
 +    // -- CollectionSelectorProvider
  
      @Override
      public CollectionSelectorPanel getSelectorDropdownPanel() {
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index eee3835,ffef9e0..479991c
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@@ -61,10 -61,12 +62,11 @@@ import org.apache.wicket.request.resour
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
+ import org.apache.isis.applib.annotation.PromptStyle;
  import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
  import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 -import org.apache.isis.core.commons.authentication.AuthenticationSession;
 -import org.apache.isis.core.commons.config.ConfigPropertyEnum;
 -import org.apache.isis.core.commons.config.IsisConfiguration;
 +import org.apache.isis.config.IsisConfiguration;
 +import org.apache.isis.config.property.ConfigPropertyEnum;
  import org.apache.isis.core.metamodel.services.ServicesInjector;
  import org.apache.isis.core.runtime.system.context.IsisContext;
  import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
@@@ -476,8 -487,14 +488,14 @@@ public abstract class PageAbstract exte
          }
      }
  
+     @Override
+     public void closePrompt(final AjaxRequestTarget target) {
+         actionPromptSidebar.closePrompt(target);
+         actionPromptModalWindow.closePrompt(target);
+     }
+ 
      private void addActionPromptModalWindow(final MarkupContainer parent) {
 -        actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW); 
 +        actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW);
          parent.addOrReplace(actionPromptModalWindow);
      }
  
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index a21d695,6e52696..e0ec0e2
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@@ -172,7 -159,7 +172,7 @@@ public class EntityPage extends PageAbs
              // the facet should always exist, in fact
              // just enough to ask for the metadata.
              // This will cause the current ObjectSpec to be updated as a side effect.
-             gridFacet.getGrid();
 -            final Grid unused = gridFacet.getGrid(objectAdapter);
++            gridFacet.getGrid(objectAdapter);
          }
  
          if(titleString == null) {
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index 0cb434a,6ccd458..ee5c868
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@@ -43,10 -43,12 +43,11 @@@ import org.apache.isis.applib.services.
  import org.apache.isis.applib.services.guice.GuiceBeanProvider;
  import org.apache.isis.applib.services.hint.HintStore;
  import org.apache.isis.applib.services.message.MessageService;
 -import org.apache.isis.core.commons.authentication.AuthenticationSession;
 -import org.apache.isis.core.commons.authentication.MessageBroker;
 +import org.apache.isis.commons.internal.collections._Lists;
  import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 -import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 +import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
  import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
+ import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacet;
  import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
  import org.apache.isis.core.metamodel.services.ServicesInjector;
  import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@@ -55,10 -57,9 +56,11 @@@ import org.apache.isis.core.runtime.sys
  import org.apache.isis.core.runtime.system.session.IsisSession;
  import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
  import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 +import org.apache.isis.core.security.authentication.AuthenticationSession;
 +import org.apache.isis.core.security.authentication.MessageBroker;
  import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
  import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+ import org.apache.isis.viewer.wicket.model.models.ActionModel;
  import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
  import org.apache.isis.viewer.wicket.model.models.EntityModel;
  import org.apache.isis.viewer.wicket.model.models.FormExecutor;
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
index ef054ab,fcc531f..f74d13f
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
@@@ -20,22 -20,8 +20,6 @@@ package org.apache.isis.viewer.wicket.u
  
  import java.util.List;
  
- import org.apache.isis.commons.internal.exceptions._Exceptions.FluentException;
- import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
- import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
- import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
- import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
- import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
- import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
- import org.apache.isis.viewer.wicket.model.models.FormExecutor;
- import org.apache.isis.viewer.wicket.model.models.FormExecutorContext;
- import org.apache.isis.viewer.wicket.model.models.ParentEntityModelProvider;
- import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber2;
- import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
- import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormFeedbackPanel;
- import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
- import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
- import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 -import com.google.common.collect.Lists;
 -
  import org.apache.wicket.Component;
  import org.apache.wicket.MarkupContainer;
  import org.apache.wicket.Page;
@@@ -54,16 -40,27 +38,31 @@@ import org.apache.wicket.model.IModel
  import org.apache.wicket.model.ResourceModel;
  import org.apache.wicket.util.string.AppendingStringBuffer;
  
 +import org.apache.isis.commons.internal.collections._Lists;
++import org.apache.isis.commons.internal.exceptions._Exceptions.FluentException;
+ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+ import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
+ import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+ import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
+ import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
+ import org.apache.isis.viewer.wicket.model.models.FormExecutor;
+ import org.apache.isis.viewer.wicket.model.models.FormExecutorContext;
+ import org.apache.isis.viewer.wicket.model.models.ParentEntityModelProvider;
+ import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber2;
+ import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
+ import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormFeedbackPanel;
+ import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
+ import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
+ import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
  
  public abstract class PromptFormAbstract<T extends BookmarkableModel<ObjectAdapter>
 -                                                    & ParentEntityModelProvider
 -                                                    & IModel<ObjectAdapter>
 -                                                    & FormExecutorContext>
 -        extends FormAbstract<ObjectAdapter>
 -        implements ScalarModelSubscriber2 {
 +& ParentEntityModelProvider
 +& IModel<ObjectAdapter>
 +& FormExecutorContext>
 +extends FormAbstract<ObjectAdapter>
 +implements ScalarModelSubscriber2 {
 +
 +    private static final long serialVersionUID = 1L;
  
      private static final String ID_OK_BUTTON = "okButton";
      public static final String ID_CANCEL_BUTTON = "cancelButton";


[isis] 01/04: ISIS-2082: updates download.adoc, parameterize using __versions.adoc[].

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

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

commit 4573d5b5d2b2610e46b7b8a5656aa66e8d5ac458
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Jan 10 06:53:46 2019 +0100

    ISIS-2082: updates download.adoc, parameterize using __versions.adoc[].
---
 adocs/documentation/src/main/asciidoc/downloads.adoc | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/adocs/documentation/src/main/asciidoc/downloads.adoc b/adocs/documentation/src/main/asciidoc/downloads.adoc
index f9cd2cc..87c8f9d 100644
--- a/adocs/documentation/src/main/asciidoc/downloads.adoc
+++ b/adocs/documentation/src/main/asciidoc/downloads.adoc
@@ -4,6 +4,7 @@
 :_basedir: ./
 :_imagesdir: images/
 :toc: right
+include::__versions.adoc[]
 
 
 Apache Isis&trade; software is a framework for rapidly developing domain-driven apps in Java.
@@ -25,15 +26,15 @@ If you want to build Apache Isis from formally released source tarballs, you can
 
 Core:
 
-* https://www.apache.org/dyn/closer.cgi/isis/isis-core/isis-1.17.0-source-release.zip[isis-1.17.0] (https://www.apache.org/dist/isis/isis-core/isis-1.17.0-source-release.zip.asc[asc], https://www.apache.org/dist/isis/isis-core/isis-1.17.0-source-release.zip.md5[md5])
+* https://www.apache.org/dyn/closer.cgi/isis/isis-core/isis-{isiscurr}-source-release.zip[isis-{isiscurr}] (https://www.apache.org/dist/isis/isis-core/isis-{isiscurr}-source-release.zip.asc[asc], https://www.apache.org/dist/isis/isis-core/isis-{isiscurr}-source-release.zip.md5[md5])
 
 HelloWorld Archetype:
 
-* https://www.apache.org/dyn/closer.cgi/isis/archetype/helloworld-archetype/helloworld-archetype-1.17.0-source-release.zip[helloworld-archetype-1.17.0] (https://www.apache.org/dist/isis/archetype/helloworld-archetype/helloworld-archetype-1.17.0-source-release.zip.asc[asc], https://www.apache.org/dist/isis/archetype/helloworld-archetype/helloworld-archetype-1.17.0-source-release.zip.md5[md5])
+* https://www.apache.org/dyn/closer.cgi/isis/archetype/helloworld-archetype/helloworld-archetype-{isiscurr}-source-release.zip[helloworld-archetype-{isiscurr}] (https://www.apache.org/dist/isis/archetype/helloworld-archetype/helloworld-archetype-{isiscurr}-source-release.zip.asc[asc], https://www.apache.org/dist/isis/archetype/helloworld-archetype/helloworld-archetype-{isiscurr}-source-release.zip.md5[md5])
 
 SimpleApp Archetype:
 
-* https://www.apache.org/dyn/closer.cgi/isis/archetype/simpleapp-archetype/simpleapp-archetype-1.17.0-source-release.zip[simpleapp-archetype-1.17.0] (https://www.apache.org/dist/isis/archetype/simpleapp-archetype/simpleapp-archetype-1.17.0-source-release.zip.asc[asc], https://www.apache.org/dist/isis/archetype/simpleapp-archetype/simpleapp-archetype-1.17.0-source-release.zip.md5[md5])
+* https://www.apache.org/dyn/closer.cgi/isis/archetype/simpleapp-archetype/simpleapp-archetype-{isiscurr}-source-release.zip[simpleapp-archetype-{isiscurr}] (https://www.apache.org/dist/isis/archetype/simpleapp-archetype/simpleapp-archetype-{isiscurr}-source-release.zip.asc[asc], https://www.apache.org/dist/isis/archetype/simpleapp-archetype/simpleapp-archetype-{isiscurr}-source-release.zip.md5[md5])
 
 
 
@@ -47,26 +48,26 @@ Make sure you get these files from the http://www.apache.org/dist/isis/[main dis
 
 Then verify the signatures using a command such as:
 
-[source,bash]
+[source,bash,subs="attributes+"]
 ----
 pgpk -a KEYS
-pgpv isis-1.17.0-source-release.zip.asc isis-1.17.0-source-release.zip
+pgpv isis-{isiscurr}-source-release.zip.asc isis-{isiscurr}-source-release.zip
 ----
 
 or
 
-[source,bash]
+[source,bash,subs="attributes+"]
 ----
 pgp -ka KEYS
-pgp isis-1.17.0-source-release.zip.asc isis-1.17.0-source-release.zip
+pgp isis-{isiscurr}-source-release.zip.asc isis-{isiscurr}-source-release.zip
 ----
 
 or
 
-[source,bash]
+[source,bash,subs="attributes+"]
 ----
 gpg –import KEYS
-gpg -verify isis-1.17.0-source-release.zip.asc isis-1.17.0-source-release.zip
+gpg -verify isis-{isiscurr}-source-release.zip.asc isis-{isiscurr}-source-release.zip
 ----
 
 


[isis] 04/04: ISIS-2067: adds TODO to the migration-notes.adoc

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

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

commit ce5527079a27ca54a48539b21578368c5426da68
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Jan 10 08:08:36 2019 +0100

    ISIS-2067: adds TODO to the migration-notes.adoc
---
 migration-notes.adoc | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/migration-notes.adoc b/migration-notes.adoc
index c96afac..bdd133b 100644
--- a/migration-notes.adoc
+++ b/migration-notes.adoc
@@ -595,3 +595,13 @@ public abstract class MyIntegTestAbstract extends IntegrationTestJupiter {
 ----
 
 
+=== Reworked o.a.i.WebServer (ISIS-1067)
+
+Changed parameter flags:
+
+* `-m`, `--manifest`, `--appManifest`
+* `-d`, `--dev`, `--prototype`
+* `-p`, `--port`
+
+Not other flags supported.
+


[isis] 03/04: fixes compile/unit test errors from merge.

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

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

commit 17ce576a3e386b6d5a7ba3c5b2d5bb22dbe1686d
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Jan 10 08:08:20 2019 +0100

    fixes compile/unit test errors from merge.
---
 .../facets/actions/layout/ActionLayoutFacetFactory.java    |  2 +-
 .../layout/RedirectFacetFromActionLayoutAnnotation.java    | 14 ++++++++------
 .../facets/object/layout/LayoutFacetFallback.java          |  4 ++--
 .../metamodel/facets/object/layout/LayoutFacetMethod.java  |  3 ++-
 .../domainobjectlayout/DomainObjectLayoutFactoryTest.java  |  2 +-
 .../facets/object/ident/layout/LayoutFacetMethodTest.java  |  2 +-
 .../specloader/SpecificationLoaderTestAbstract.java        |  4 ++--
 7 files changed, 17 insertions(+), 14 deletions(-)

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 719cfa8..ed8bd2c 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
@@ -105,7 +105,7 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
 
 
         // redirectPolicy
-        RedirectFacet redirectFacet = RedirectFacetFromActionLayoutAnnotation.create(actionLayout, holder);
+        RedirectFacet redirectFacet = RedirectFacetFromActionLayoutAnnotation.create(actionLayouts, holder);
         if(redirectFacet == null) {
             redirectFacet = new RedirectFacetFallback(holder);
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionLayoutAnnotation.java
index 65fb7e8..957d1f6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/RedirectFacetFromActionLayoutAnnotation.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.Redirect;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +29,12 @@ import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacetAbstr
 
 public class RedirectFacetFromActionLayoutAnnotation extends RedirectFacetAbstract {
 
-    public static RedirectFacet create(final ActionLayout actionLayout, final FacetHolder holder) {
-        if(actionLayout == null) {
-            return null;
-        }
-        final Redirect redirect = actionLayout.redirectPolicy();
-        return redirect != null ? new RedirectFacetFromActionLayoutAnnotation(redirect, holder) : null;
+    public static RedirectFacet create(final List<ActionLayout> actionLayouts, final FacetHolder holder) {
+        return actionLayouts.stream()
+                .map(ActionLayout::redirectPolicy)
+                .map(redirect ->  new RedirectFacetFromActionLayoutAnnotation(redirect, holder))
+                .findFirst()
+                .orElse(null);
     }
 
     public RedirectFacetFromActionLayoutAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
index 863b1e7..54899fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFallback.java
@@ -21,8 +21,8 @@ package org.apache.isis.core.metamodel.facets.object.layout;
 
 import java.util.Map;
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 public class LayoutFacetFallback extends LayoutFacetAbstract {
 
@@ -31,7 +31,7 @@ public class LayoutFacetFallback extends LayoutFacetAbstract {
     }
 
     @Override
-    public String layout(final ObjectAdapter objectAdapterIfAny) {
+    public String layout(final ManagedObject objectAdapterIfAny) {
         return null;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
index f4c3d2b..2b3a4e0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
@@ -24,6 +24,7 @@ import java.util.Map;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 public class LayoutFacetMethod extends LayoutFacetAbstract {
 
@@ -35,7 +36,7 @@ public class LayoutFacetMethod extends LayoutFacetAbstract {
     }
 
     @Override
-    public String layout(final ObjectAdapter objectAdapterIfAny) {
+    public String layout(final ManagedObject objectAdapterIfAny) {
         if(objectAdapterIfAny == null) {
             return null;
         }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
index 60125cc..7eb15fc 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
@@ -263,7 +263,7 @@ public class DomainObjectLayoutFactoryTest extends AbstractFacetFactoryJUnit4Tes
                 facetFactory.process(new FacetFactory.ProcessClassContext(cls, mockMethodRemover, facetHolder));
 
                 final Facet facet = facetHolder.getFacet(CssClassFacet.class);
-                assertNull(facet);
+                assertNotNull(facet);
 
                 expectNoMethodsRemoved();
             }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
index e54da19..34988c3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
@@ -64,7 +64,7 @@ public class LayoutFacetMethodTest {
 
         mockery.checking(new Expectations() {
             {
-                allowing(mockOwningAdapter).getObject();
+                allowing(mockOwningAdapter).getPojo();
                 will(returnValue(pojo));
             }
         });
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
index d711cc3..cabd4be 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -32,7 +32,7 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
 import org.apache.isis.applib.AppManifest;
-import org.apache.isis.applib.services.grid.GridService;
+import org.apache.isis.applib.services.grid.GridService2;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.commons.internal.collections._Sets;
@@ -63,7 +63,7 @@ public abstract class SpecificationLoaderTestAbstract {
     @Mock
     private AuthenticationSessionProvider mockAuthenticationSessionProvider;
     @Mock
-    private GridService mockGridService;
+    private GridService2 mockGridService;
     @Mock
     private PersistenceSessionServiceInternal mockPersistenceSessionServiceInternal;
     @Mock