You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/03/06 09:07:47 UTC

[causeway] branch master updated: CAUSEWAY-3310: [Demo] Action Layout Annotation - add VM stubs

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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new d2b5b82a63 CAUSEWAY-3310: [Demo] Action Layout Annotation - add VM stubs
d2b5b82a63 is described below

commit d2b5b82a63190a45890e4db43760238a5c9dead9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Mar 6 10:07:27 2023 +0100

    CAUSEWAY-3310: [Demo] Action Layout Annotation - add VM stubs
---
 .../actions/ActionLayout/ActionLayoutMenu.java     | 133 +++++++++++----------
 .../ActionLayoutAssociateWithVm-description.adoc   |  12 ++
 .../associateWith/ActionLayoutAssociateWithVm.java |  56 +++++++++
 .../ActionLayoutAssociateWithVm.layout.xml         |  67 +++++++++++
 .../actions/ActionLayout/bookmarking/.gitkeep      |   0
 .../ActionLayoutBookmarkingVm-description.adoc     |   9 ++
 .../bookmarking/ActionLayoutBookmarkingVm.java     |  57 +++++++++
 .../ActionLayoutBookmarkingVm.layout.xml           |  67 +++++++++++
 .../domain/actions/ActionLayout/cssClass/.gitkeep  |   0
 .../ActionLayoutCssClassVm-description.adoc        |   7 ++
 .../cssClass/ActionLayoutCssClassVm.java           |  56 +++++++++
 .../cssClass/ActionLayoutCssClassVm.layout.xml     |  67 +++++++++++
 .../actions/ActionLayout/cssClassFa/.gitkeep       |   0
 .../ActionLayoutCssClassFaVm-description.adoc      |  12 ++
 .../cssClassFa/ActionLayoutCssClassFaVm.java       |  58 +++++++++
 .../cssClassFa/ActionLayoutCssClassFaVm.layout.xml |  67 +++++++++++
 .../ActionLayoutDescribedAsVm-description.adoc     |   6 +
 .../describedAs/ActionLayoutDescribedAsVm.java     |  56 +++++++++
 .../ActionLayoutDescribedAsVm.layout.xml           |  67 +++++++++++
 .../ActionLayoutFieldSetVm-description.adoc        |  13 ++
 .../fieldSet/ActionLayoutFieldSetVm.java           |  57 +++++++++
 .../fieldSet/ActionLayoutFieldSetVm.layout.xml     |  67 +++++++++++
 .../domain/actions/ActionLayout/hidden/.gitkeep    |   0
 .../hidden/ActionLayoutHiddenVm-description.adoc   |   6 +
 .../ActionLayout/hidden/ActionLayoutHiddenVm.java  |  57 +++++++++
 .../hidden/ActionLayoutHiddenVm.layout.xml         |  67 +++++++++++
 .../dom/domain/actions/ActionLayout/named/.gitkeep |   0
 .../named/ActionLayoutNamedVm-description.adoc     |   7 ++
 .../ActionLayout/named/ActionLayoutNamedVm.java    |  56 +++++++++
 .../named/ActionLayoutNamedVm.layout.xml           |  67 +++++++++++
 .../actions/ActionLayout/redirectPolicy/.gitkeep   |   0
 .../ActionLayoutRedirectPolicyVm-description.adoc  |   8 ++
 .../ActionLayoutRedirectPolicyVm.java              |  57 +++++++++
 .../ActionLayoutRedirectPolicyVm.layout.xml        |  67 +++++++++++
 .../ActionLayoutSequenceVm-description.adoc        |   7 ++
 .../sequence/ActionLayoutSequenceVm.java           |  56 +++++++++
 .../sequence/ActionLayoutSequenceVm.layout.xml     |  67 +++++++++++
 .../domain/collections/Collection/hidden/.gitkeep  |   0
 .../domain/collections/Collection/typeOf/.gitkeep  |   0
 .../collections/CollectionLayout/cssClass/.gitkeep |   0
 .../CollectionLayout/defaultView/.gitkeep          |   0
 .../CollectionLayout/describedAs/.gitkeep          |   0
 .../collections/CollectionLayout/hidden/.gitkeep   |   0
 .../collections/CollectionLayout/named/.gitkeep    |   0
 .../collections/CollectionLayout/paged/.gitkeep    |   0
 .../collections/CollectionLayout/sortedBy/.gitkeep |   0
 .../objects/DomainObject/autoComplete/.gitkeep     |   0
 .../domain/objects/DomainObject/bounded/.gitkeep   |   0
 .../domain/objects/DomainObject/editing/.gitkeep   |   0
 .../objects/DomainObject/mixinMethod/.gitkeep      |   0
 .../objects/DomainObject/xxxDomainEvent/.gitkeep   |   0
 .../DomainObject/xxxLifecycleEvent/.gitkeep        |   0
 .../DomainObjectLayout/bookmarking/.gitkeep        |   0
 .../objects/DomainObjectLayout/cssClass/.gitkeep   |   0
 .../objects/DomainObjectLayout/cssClassFa/.gitkeep |   0
 .../DomainObjectLayout/describedAs/.gitkeep        |   0
 .../objects/DomainObjectLayout/named/.gitkeep      |   0
 .../objects/DomainObjectLayout/paged/.gitkeep      |   0
 .../objects/DomainObjectLayout/xxxUiEvent/.gitkeep |   0
 .../domain/properties/Property/projecting/.gitkeep |   0
 .../src/main/java/demoapp/dom/menubars.layout.xml  |   3 +
 61 files changed, 1394 insertions(+), 65 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/ActionLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/ActionLayoutMenu.java
index e9dc451354..7943a29650 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/ActionLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/ActionLayoutMenu.java
@@ -23,11 +23,23 @@ import javax.inject.Named;
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.MemberSupport;
 import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
+import demoapp.dom.domain.actions.ActionLayout.associateWith.ActionLayoutAssociateWithVm;
+import demoapp.dom.domain.actions.ActionLayout.bookmarking.ActionLayoutBookmarkingVm;
+import demoapp.dom.domain.actions.ActionLayout.cssClass.ActionLayoutCssClassVm;
+import demoapp.dom.domain.actions.ActionLayout.cssClassFa.ActionLayoutCssClassFaVm;
+import demoapp.dom.domain.actions.ActionLayout.describedAs.ActionLayoutDescribedAsVm;
+import demoapp.dom.domain.actions.ActionLayout.fieldSet.ActionLayoutFieldSetVm;
+import demoapp.dom.domain.actions.ActionLayout.hidden.ActionLayoutHiddenVm;
+import demoapp.dom.domain.actions.ActionLayout.named.ActionLayoutNamedVm;
+import demoapp.dom.domain.actions.ActionLayout.position.ActionLayoutPositionVm;
+import demoapp.dom.domain.actions.ActionLayout.promptStyle.ActionLayoutPromptStyleVm;
+import demoapp.dom.domain.actions.ActionLayout.redirectPolicy.ActionLayoutRedirectPolicyVm;
+import demoapp.dom.domain.actions.ActionLayout.sequence.ActionLayoutSequenceVm;
+
 @DomainService(nature=NatureOfService.VIEW)
 @Named("demo.ActionLayoutMenu")
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
@@ -35,97 +47,88 @@ import org.apache.causeway.applib.annotation.SemanticsOf;
 public class ActionLayoutMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-bookmark", describedAs = "Add link to action prompt as a bookmark"
-    )
-    public void bookmarking(){
-    }
-    @MemberSupport public String disableBookmarking(){
-        return "Add link to action prompt as a bookmark" +
-                " (not supported by Wicket viewer)";
+    @ActionLayout(cssClassFa="fa-solid fa-arrows-left-right",
+        describedAs = "Associate an action with a property or collection, specifying its id")
+    public ActionLayoutAssociateWithVm associateWith(){
+        return new ActionLayoutAssociateWithVm();
     }
 
-
-
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-pen-nib", describedAs = "CSS class to wrap the UI component representing this action")
-    public void cssClass(){
+    @ActionLayout(cssClassFa="fa-bookmark",
+        describedAs = "Add link to action prompt as a bookmark")
+    public ActionLayoutBookmarkingVm bookmarking(){
+        return new ActionLayoutBookmarkingVm();
     }
-    @MemberSupport public String disableCssClass(){
-        return "CSS class to wrap the UI component representing this action" +
-                " (not yet implemented in demo)";
-    }
-
-
 
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-font-awesome-flag", describedAs = "Font awesome icon to represent action")
-    public void cssClassFa(){
-    }
-    @MemberSupport public String disableCssClassFa(){
-        return "Font awesome icon to represent action" +
-                " (not yet implemented in demo)";
+    @ActionLayout(cssClassFa="fa-pen-nib",
+        describedAs = "CSS class to wrap the UI component representing this action")
+    public ActionLayoutCssClassVm cssClass(){
+        return new ActionLayoutCssClassVm();
     }
 
-
-
-
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-comment", describedAs = "Description of the action, shown as a tooltip")
-    public void describedAs(){
-    }
-    @MemberSupport public String disableDescribedAs(){
-        return "Description of the action, shown as a tooltip" +
-                " (not yet implemented in demo)";
+    @ActionLayout(cssClassFa="fa-font-awesome-flag",
+        describedAs = "Font awesome icon to represent action")
+    public ActionLayoutCssClassFaVm cssClassFa(){
+        return new ActionLayoutCssClassFaVm();
     }
 
-
-
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-glasses", describedAs = "Visibility of the action in different contexts")
-    public void hidden(){
-    }
-    @MemberSupport public String disableHidden(){
-        return "Visibility of the action in different contexts" +
-                " (not yet implemented in demo)";
+    @ActionLayout(cssClassFa="fa-comment",
+        describedAs = "Description of the action, shown as a tooltip")
+    public ActionLayoutDescribedAsVm describedAs(){
+        return new ActionLayoutDescribedAsVm();
     }
 
-
-
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-signature", describedAs = "Custom text for the action's label")
-    public void named(){
+    @ActionLayout(cssClassFa="fa-solid fa-vector-square",
+        //TODO[CAUSEWAY-3310] missing description - need to double check how this behaves or should behave
+        describedAs = "todo - how does this behave?")
+    public ActionLayoutFieldSetVm fieldSet(){
+        return new ActionLayoutFieldSetVm();
     }
-    @MemberSupport public String disableNamed(){
-        return "Custom text for the action's label" +
-                " (not yet implemented in demo)";
-    }
-
-
 
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-map-pin", describedAs = "Position of action buttons")
-    public demoapp.dom.domain.actions.ActionLayout.position.ActionLayoutPositionVm position(){
-        return new demoapp.dom.domain.actions.ActionLayout.position.ActionLayoutPositionVm();
+    @ActionLayout(cssClassFa="fa-glasses",
+        describedAs = "Visibility of the action in different contexts")
+    public ActionLayoutHiddenVm hidden(){
+        return new ActionLayoutHiddenVm();
     }
 
-
-
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-question-circle", describedAs = "Location and style of action's prompt dialog")
-    public demoapp.dom.domain.actions.ActionLayout.promptStyle.ActionLayoutPromptStyleVm promptStyle(){
-        return new demoapp.dom.domain.actions.ActionLayout.promptStyle.ActionLayoutPromptStyleVm();
+    @ActionLayout(cssClassFa="fa-signature",
+        describedAs = "Custom text for the action's label")
+    public ActionLayoutNamedVm named(){
+        return new ActionLayoutNamedVm();
     }
 
-
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-map-pin",
+        describedAs = "Position of action buttons")
+    public ActionLayoutPositionVm position(){
+        return new ActionLayoutPositionVm();
+    }
 
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-random", describedAs = "Whether to redraw page if action returns same object")
-    public void redirectPolicy(){
+    @ActionLayout(cssClassFa="fa-question-circle",
+        describedAs = "Location and style of action's prompt dialog")
+    public ActionLayoutPromptStyleVm promptStyle(){
+        return new ActionLayoutPromptStyleVm();
     }
-    @MemberSupport public String disableRedirectPolicy(){
-        return "Whether to redraw page if action returns same object" +
-                " (not yet implemented in demo)";
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-random",
+        describedAs = "Whether to redraw page if action returns same object")
+    public ActionLayoutRedirectPolicyVm redirectPolicy(){
+        return new ActionLayoutRedirectPolicyVm();
     }
 
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-sharp fa-solid fa-sort",
+        describedAs = "Order an action relative to other members in the same (layout) group.")
+    public ActionLayoutSequenceVm sequence(){
+        return new ActionLayoutSequenceVm();
+    }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/associateWith/ActionLayoutAssociateWithVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/associateWith/ActionLayoutAssociateWithVm-description.adoc
new file mode 100644
index 0000000000..be75119844
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/associateWith/ActionLayoutAssociateWithVm-description.adoc
@@ -0,0 +1,12 @@
+:Notice: 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 ag [...]
+
+The `associateWith` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Associates this action with a property or collection, specifying its id.
+To specify the layout order use ActionLayout#sequence() .
+For example @ActionLayout(associateWith="items") @ActionLayout(sequence="2.1")
+Note that it is also possible to associate an action with a collection using Action#choicesFrom() (which has the additional semantic of the rows of the element being used as choices for that action’s collection parameter of the same type as the elements of the collection).
+
+
+
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/associateWith/ActionLayoutAssociateWithVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/associateWith/ActionLayoutAssociateWithVm.java
new file mode 100644
index 0000000000..54a6cf4ff6
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/associateWith/ActionLayoutAssociateWithVm.java
@@ -0,0 +1,56 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.associateWith;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutAssociateWithVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutAssociateWithVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#associateWith";
+    }
+
+    @Action
+    @ActionLayout(
+            associateWith = "xxx")
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/associateWith/ActionLayoutAssociateWithVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/associateWith/ActionLayoutAssociateWithVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/associateWith/ActionLayoutAssociateWithVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/ActionLayoutBookmarkingVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/ActionLayoutBookmarkingVm-description.adoc
new file mode 100644
index 0000000000..7eaf2ddee9
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/ActionLayoutBookmarkingVm-description.adoc
@@ -0,0 +1,9 @@
+:Notice: 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 ag [...]
+
+The `bookmarking` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Whether (and how) this action can be bookmarked in the UI.
+For bookmarkable actions, either org.apache.causeway.applib.annotation.BookmarkPolicy#AS_ROOT and org.apache.causeway.applib.annotation.BookmarkPolicy#AS_CHILD can be used (they are treated identically).
+
+
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/ActionLayoutBookmarkingVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/ActionLayoutBookmarkingVm.java
new file mode 100644
index 0000000000..f7ad7c93ea
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/ActionLayoutBookmarkingVm.java
@@ -0,0 +1,57 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.bookmarking;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.BookmarkPolicy;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutBookmarkingVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutBookmarkingVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#bookmarking";
+    }
+
+    @Action
+    @ActionLayout(
+            bookmarking = BookmarkPolicy.AS_CHILD)
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/ActionLayoutBookmarkingVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/ActionLayoutBookmarkingVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/bookmarking/ActionLayoutBookmarkingVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/ActionLayoutCssClassVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/ActionLayoutCssClassVm-description.adoc
new file mode 100644
index 0000000000..10d3e3f737
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/ActionLayoutCssClassVm-description.adoc
@@ -0,0 +1,7 @@
+:Notice: 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 ag [...]
+
+The `cssClass` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Indicates the css class that an action should have.
+For the Wicket viewer, this can be a bootstrap class such as btn-info .
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/ActionLayoutCssClassVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/ActionLayoutCssClassVm.java
new file mode 100644
index 0000000000..cf71a00e3b
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/ActionLayoutCssClassVm.java
@@ -0,0 +1,56 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.cssClass;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutCssClassVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutCssClassVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#cssClass";
+    }
+
+    @Action
+    @ActionLayout(
+            cssClass = "bg-dark")
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/ActionLayoutCssClassVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/ActionLayoutCssClassVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClass/ActionLayoutCssClassVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/ActionLayoutCssClassFaVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/ActionLayoutCssClassFaVm-description.adoc
new file mode 100644
index 0000000000..5dbd369315
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/ActionLayoutCssClassFaVm-description.adoc
@@ -0,0 +1,12 @@
+:Notice: 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 ag [...]
+
+The `cssClassFa` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Indicates theFont AwesomeCSS class to decorate an action (button or menu item).
+
+The `cssClassFaPosition` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Indicates the position of the Font Awesomeicon.
+The icon could be rendered on the left or the right of the action button
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/ActionLayoutCssClassFaVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/ActionLayoutCssClassFaVm.java
new file mode 100644
index 0000000000..f07070e083
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/ActionLayoutCssClassFaVm.java
@@ -0,0 +1,58 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.cssClassFa;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+import org.apache.causeway.applib.layout.component.CssClassFaPosition;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutCssClassFaVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutCssClassFaVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#cssClassFa";
+    }
+
+    @Action
+    @ActionLayout(
+            cssClassFa = "fa-bus",
+            cssClassFaPosition = CssClassFaPosition.RIGHT) //TODO[CAUSEWAY-3310] showcase LEFT and RIGTH
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/ActionLayoutCssClassFaVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/ActionLayoutCssClassFaVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/cssClassFa/ActionLayoutCssClassFaVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/describedAs/ActionLayoutDescribedAsVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/describedAs/ActionLayoutDescribedAsVm-description.adoc
new file mode 100644
index 0000000000..959da4e444
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/describedAs/ActionLayoutDescribedAsVm-description.adoc
@@ -0,0 +1,6 @@
+:Notice: 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 ag [...]
+
+The `describedAs` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Description of this action, eg to be rendered in a tooltip.
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/describedAs/ActionLayoutDescribedAsVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/describedAs/ActionLayoutDescribedAsVm.java
new file mode 100644
index 0000000000..60de5fd367
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/describedAs/ActionLayoutDescribedAsVm.java
@@ -0,0 +1,56 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.describedAs;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutDescribedAsVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutDescribedAsVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#describedAs";
+    }
+
+    @Action
+    @ActionLayout(
+            describedAs = "xxx")
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/describedAs/ActionLayoutDescribedAsVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/describedAs/ActionLayoutDescribedAsVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/describedAs/ActionLayoutDescribedAsVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/fieldSet/ActionLayoutFieldSetVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/fieldSet/ActionLayoutFieldSetVm-description.adoc
new file mode 100644
index 0000000000..94820e91b0
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/fieldSet/ActionLayoutFieldSetVm-description.adoc
@@ -0,0 +1,13 @@
+:Notice: 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 ag [...]
+
+The `fieldSetId` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Specifies the id of associated FieldSet .To associate an Action with a Collection , use Action#choicesFrom() instead.
+For a more in depth description see the analogous PropertyLayout#fieldSetId() .
+
+The `fieldSetName` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Specifies the friendly-name of associated FieldSet or Collection .To associate an Action with a Collection , use Action#choicesFrom() instead.
+For a more in depth description see the analogous PropertyLayout#fieldSetId() ;
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/fieldSet/ActionLayoutFieldSetVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/fieldSet/ActionLayoutFieldSetVm.java
new file mode 100644
index 0000000000..5d1ff041b6
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/fieldSet/ActionLayoutFieldSetVm.java
@@ -0,0 +1,57 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.fieldSet;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutFieldSetVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutFieldSetVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#fieldSet...";
+    }
+
+    @Action
+    @ActionLayout(
+            fieldSetId = "xxx",
+            fieldSetName = "xxx")
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/fieldSet/ActionLayoutFieldSetVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/fieldSet/ActionLayoutFieldSetVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/fieldSet/ActionLayoutFieldSetVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenVm-description.adoc
new file mode 100644
index 0000000000..bf5cd246b1
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenVm-description.adoc
@@ -0,0 +1,6 @@
+:Notice: 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 ag [...]
+
+The `hidden` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Indicates where in the UI the action should not not be visible.
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenVm.java
new file mode 100644
index 0000000000..a83faf5108
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenVm.java
@@ -0,0 +1,57 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.hidden;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+import org.apache.causeway.applib.annotation.Where;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutHiddenVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutHiddenVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#hidden";
+    }
+
+    @Action
+    @ActionLayout(
+            hidden = Where.STANDALONE_TABLES)
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/ActionLayoutNamedVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/ActionLayoutNamedVm-description.adoc
new file mode 100644
index 0000000000..138a91d856
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/ActionLayoutNamedVm-description.adoc
@@ -0,0 +1,7 @@
+:Notice: 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 ag [...]
+
+The `named` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+Name of this action (overriding the name derived from its name in code).
+A typical use case is if the desired name is a reserved Java keyword, such as default or package.
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/ActionLayoutNamedVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/ActionLayoutNamedVm.java
new file mode 100644
index 0000000000..b98114884d
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/ActionLayoutNamedVm.java
@@ -0,0 +1,56 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.named;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutNamedVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutNamedVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#named";
+    }
+
+    @Action
+    @ActionLayout(
+            named = "xxx")
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/ActionLayoutNamedVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/ActionLayoutNamedVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/named/ActionLayoutNamedVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyVm-description.adoc
new file mode 100644
index 0000000000..72a1647a2d
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyVm-description.adoc
@@ -0,0 +1,8 @@
+:Notice: 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 ag [...]
+
+The `redirectPolicy` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+If the action returns its target, then determines whether to update the page or instead to redirect (forcing a re-rendering of a new page).
+Not re-rendering can provide a smoother UI experience.
+Supported by the Wicket viewer.
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyVm.java
new file mode 100644
index 0000000000..2e0dbf68b7
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyVm.java
@@ -0,0 +1,57 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.redirectPolicy;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+import org.apache.causeway.applib.annotation.Redirect;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutRedirectPolicyVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutRedirectPolicyVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#redirectPolicy";
+    }
+
+    @Action
+    @ActionLayout(
+            redirectPolicy = Redirect.ONLY_IF_DIFFERS)
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/sequence/ActionLayoutSequenceVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/sequence/ActionLayoutSequenceVm-description.adoc
new file mode 100644
index 0000000000..62b06d4cd2
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/sequence/ActionLayoutSequenceVm-description.adoc
@@ -0,0 +1,7 @@
+:Notice: 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 ag [...]
+
+The `sequence` attribute ...
+
+WARNING: TODO[CAUSEWAY-3310]
+The order of this member relative to other members in the same (layout) group, given in Dewey-decimal notation.
+An alternative is to use the Xxx.layout.xml file, where Xxx is the domain object name.
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/sequence/ActionLayoutSequenceVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/sequence/ActionLayoutSequenceVm.java
new file mode 100644
index 0000000000..c7d864c102
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/sequence/ActionLayoutSequenceVm.java
@@ -0,0 +1,56 @@
+/*
+ *  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 demoapp.dom.domain.actions.ActionLayout.sequence;
+
+import javax.inject.Named;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.ActionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
+import org.apache.causeway.applib.annotation.ObjectSupport;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo.ActionLayoutSequenceVm")
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ActionLayoutSequenceVm implements HasAsciiDocDescription {
+
+    @ObjectSupport public String title() {
+        return "ActionLayout#sequence";
+    }
+
+    @Action
+    @ActionLayout(
+            sequence = "0")
+    public Object act(final String arg) {
+        return this;
+    }
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/sequence/ActionLayoutSequenceVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/sequence/ActionLayoutSequenceVm.layout.xml
new file mode 100644
index 0000000000..3b795257a4
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/sequence/ActionLayoutSequenceVm.layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
+					</cpt:action>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/hidden/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/hidden/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/typeOf/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/typeOf/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/cssClass/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/cssClass/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/defaultView/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/defaultView/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/describedAs/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/describedAs/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/hidden/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/hidden/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/named/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/named/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/paged/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/paged/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/sortedBy/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/sortedBy/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/bounded/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/bounded/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/bookmarking/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/bookmarking/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/cssClass/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/cssClass/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/cssClassFa/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/cssClassFa/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/describedAs/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/describedAs/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/named/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/named/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/paged/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/paged/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/xxxUiEvent/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/xxxUiEvent/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
index e29cfe764f..8fc9658426 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
@@ -71,15 +71,18 @@ For latest we use: https://raw.githubusercontent.com/apache/causeway/master/anto
             </mb3:section>
             <mb3:section>
                 <mb3:named>@ActionLayout</mb3:named>
+                <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="associateWith"/>
                 <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="bookmarking"/>
                 <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="cssClass"/>
                 <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="cssClassFa"/>
                 <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="describedAs"/>
+                <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="fieldSet"/>
                 <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="hidden"/>
                 <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="named"/>
                 <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="position"/>
                 <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="promptStyle"/>
                 <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="redirectPolicy"/>
+                <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="sequence"/>
             </mb3:section>
             <mb3:section>
                 <mb3:named>Programming Model</mb3:named>