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

[causeway] branch master updated (de26369dab -> a662db00a8)

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

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


    from de26369dab CAUSEWAY-3372: revert: void action return should always result in a (current) page reload
     new b3a3023ce7 CAUSEWAY-2485: wip - @Action#domainEvent, @DomainObject#xxxDomainEvent (currently NPE in metamodel :-( )
     new a662db00a8 CAUSEWAY-2485: reworks @Action#domainEvent

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


Summary of changes:
 .../src/main/java/demoapp/dom/DemoModuleJpa.java   |   2 +
 .../dom/domain/actions/Action/ActionMenu.java      |   6 +-
 .../ActionDomainEventControlStrategy.java          |  62 ++---------
 ...ava => ActionDomainEventControlSubscriber.java} |  20 +---
 .../ActionDomainEventPage-description.adoc         | 102 +++++++++++++++++
 ...mainEventVm.java => ActionDomainEventPage.java} |  38 +------
 ...layout.xml => ActionDomainEventPage.layout.xml} |  33 ++++--
 ...tionDomainEventPage_changeControlStrategy.java} |  28 ++---
 ... => ActionDomainEventPage_controlStrategy.java} |   9 +-
 ....java => ActionDomainEventPage_updateText.java} |  26 ++---
 ...ionDomainEventPage_updateTextNotAnnotated.java} |  29 ++---
 .../ActionDomainEventVm-description.adoc           | 123 ---------------------
 .../CollectionDomainEventVm-description.adoc       |   4 -
 .../objects/DomainObject/DomainObjectMenu.java     |  12 +-
 .../jpa/DomainObjectMixinMethodJpa.java            |   2 +-
 ...omainObjectXxxDomainEventPage-description.adoc} |   1 -
 ...Vm.java => DomainObjectXxxDomainEventPage.java} |   6 +-
 ...l => DomainObjectXxxDomainEventPage.layout.xml} |  13 ++-
 ...sVm.java => DomainObjectXxxLifecycleEvent.java} |  36 +++---
 .../DomainObjectXxxLifecycleEvent.layout.xml}      |   0
 ...ainObjectXxxLifecyleEventPage-description.adoc} |   1 +
 ....java => DomainObjectXxxLifecyleEventPage.java} |   6 +-
 ...=> DomainObjectXxxLifecyleEventPage.layout.xml} |  13 ++-
 ...mainObjectXxxLifecycleEventJpa-description.adoc |  11 ++
 .../jpa/DomainObjectXxxLifecycleEventJpa.java}     |  14 +--
 .../DomainObjectXxxLifecycleEventJpaEntities.java} |  33 +++---
 .../domain/properties/Property/PropertyMenu.java   |  18 +--
 ...oc => PropertyDomainEventPage-description.adoc} |   7 +-
 ...inEventVm.java => PropertyDomainEventPage.java} |   8 +-
 ...yout.xml => PropertyDomainEventPage.layout.xml} |   0
 .../PropertyDomainEventControlService.java         |   6 +-
 .../PropertyDomainEventControlStrategy.java        |  16 +--
 .../PropertyDomainEventVm_controlText.java         |   4 +-
 .../PropertyDomainEventVm_controlTextEditing.java  |   6 +-
 ...n.adoc => PropertyEditingPage-description.adoc} |  12 +-
 ...ertyEditingVm.java => PropertyEditingPage.java} |   4 +-
 ...m.layout.xml => PropertyEditingPage.layout.xml} |   0
 ...doc => PropertyFileAcceptPage-description.adoc} |  24 ++--
 ...leAcceptVm.java => PropertyFileAcceptPage.java} |   4 +-
 ...ayout.xml => PropertyFileAcceptPage.layout.xml} |   0
 ...eAcceptPage_updateClobWithParameterLayout.java} |   6 +-
 ...tyFileAcceptPage_updateWithMetaAnnotation.java} |   6 +-
 ...ptPage_updateWithMetaAnnotationOverridden.java} |   6 +-
 ...yFileAcceptPage_updateWithParameterLayout.java} |   6 +-
 44 files changed, 337 insertions(+), 426 deletions(-)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/{subscribers => }/ActionDomainEventControlStrategy.java (61%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/{subscribers/ActionDomainEventControlService.java => ActionDomainEventControlSubscriber.java} (63%)
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage-description.adoc
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/{ActionDomainEventVm.java => ActionDomainEventPage.java} (66%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/{ActionDomainEventVm.layout.xml => ActionDomainEventPage.layout.xml} (70%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/{subscribers/ActionDomainEventVm_controlUpdateTextInvocation.java => ActionDomainEventPage_changeControlStrategy.java} (56%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/{subscribers/ActionDomainEventVm_controlUpdateText.java => ActionDomainEventPage_controlStrategy.java} (79%)
 copy examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/{ActionDomainEventVm_mixinUpdateText.java => ActionDomainEventPage_updateText.java} (70%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/{ActionDomainEventVm_mixinUpdateText.java => ActionDomainEventPage_updateTextNotAnnotated.java} (66%)
 delete mode 100644 examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm-description.adoc
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/{xxxLifecycleEvent/DomainObjectLifecyleEventsVm-description.adoc => xxxDomainEvent/DomainObjectXxxDomainEventPage-description.adoc} (99%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/{DomainObjectDomainEventsVm.java => DomainObjectXxxDomainEventPage.java} (90%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/{DomainObjectDomainEventsVm.layout.xml => DomainObjectXxxDomainEventPage.layout.xml} (82%)
 copy examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/{DomainObjectLifecyleEventsVm.java => DomainObjectXxxLifecycleEvent.java} (59%)
 copy examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/{editing/DomainObjectEditing.layout.xml => xxxLifecycleEvent/DomainObjectXxxLifecycleEvent.layout.xml} (100%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/{xxxDomainEvent/DomainObjectDomainEventsVm-description.adoc => xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage-description.adoc} (99%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/{DomainObjectLifecyleEventsVm.java => DomainObjectXxxLifecyleEventPage.java} (89%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/{DomainObjectLifecyleEventsVm.layout.xml => DomainObjectXxxLifecyleEventPage.layout.xml} (82%)
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpa-description.adoc
 copy examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/{mixinMethod/jpa/DomainObjectMixinMethodJpa.java => xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpa.java} (78%)
 copy examples/demo/domain/src/main/java/demoapp/dom/domain/{properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java => objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpaEntities.java} (52%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/{PropertyDomainEventVm-description.adoc => PropertyDomainEventPage-description.adoc} (94%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/{PropertyDomainEventVm.java => PropertyDomainEventPage.java} (91%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/{PropertyDomainEventVm.layout.xml => PropertyDomainEventPage.layout.xml} (100%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/{PropertyEditingVm-description.adoc => PropertyEditingPage-description.adoc} (89%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/{PropertyEditingVm.java => PropertyEditingPage.java} (96%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/{PropertyEditingVm.layout.xml => PropertyEditingPage.layout.xml} (100%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/{PropertyFileAcceptVm-description.adoc => PropertyFileAcceptPage-description.adoc} (76%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/{PropertyFileAcceptVm.java => PropertyFileAcceptPage.java} (97%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/{PropertyFileAcceptVm.layout.xml => PropertyFileAcceptPage.layout.xml} (100%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/{PropertyFileAcceptVm_updateClobWithParameterLayout.java => PropertyFileAcceptPage_updateClobWithParameterLayout.java} (92%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/{PropertyFileAcceptVm_updateWithMetaAnnotation.java => PropertyFileAcceptPage_updateWithMetaAnnotation.java} (92%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/{PropertyFileAcceptVm_updateWithMetaAnnotationOverridden.java => PropertyFileAcceptPage_updateWithMetaAnnotationOverridden.java} (92%)
 rename examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/{PropertyFileAcceptVm_updateWithParameterLayout.java => PropertyFileAcceptPage_updateWithParameterLayout.java} (92%)


[causeway] 02/02: CAUSEWAY-2485: reworks @Action#domainEvent

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

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

commit a662db00a8b9f6511a81b988f4a6ce9d26ef63fe
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Mar 31 08:56:33 2023 +0100

    CAUSEWAY-2485: reworks @Action#domainEvent
---
 .../src/main/java/demoapp/dom/DemoModuleJpa.java   |  2 -
 .../ActionDomainEventControlStrategy.java          |  2 -
 .../ActionDomainEventPage-description.adoc         |  4 --
 ...ctionDomainEventPage_changeControlStrategy.java | 13 ++--
 .../CollectionDomainEventVm-description.adoc       |  4 --
 .../xxxDomainEvent/DomainObjectXxxDomainEvent.java | 45 ------------
 .../DomainObjectXxxDomainEvent.layout.xml          | 81 ----------------------
 .../DomainObjectXxxDomainEventPage_objects.java    | 29 --------
 .../DomainObjectXxxDomainEventJpa-description.adoc | 11 ---
 .../jpa/DomainObjectXxxDomainEventJpa.java         | 64 -----------------
 .../jpa/DomainObjectXxxDomainEventJpaEntities.java | 40 -----------
 .../PropertyDomainEventPage-description.adoc       |  4 --
 12 files changed, 6 insertions(+), 293 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
index 36bcc11844..d0cd3cee84 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
@@ -30,7 +30,6 @@ import demoapp.dom.domain.objects.DomainObject.introspection.annotReqd.jpa.Domai
 import demoapp.dom.domain.objects.DomainObject.introspection.encapsulated.jpa.DomainObjectIntrospectionEncapsulatedJpa;
 import demoapp.dom.domain.objects.DomainObject.mixinMethod.jpa.DomainObjectMixinMethodJpa;
 import demoapp.dom.domain.objects.DomainObject.nature.entity.jpa.DomainObjectNatureJpa;
-import demoapp.dom.domain.objects.DomainObject.xxxDomainEvent.jpa.DomainObjectXxxDomainEventJpa;
 import demoapp.dom.domain.objects.DomainObject.xxxLifecycleEvent.jpa.DomainObjectXxxLifecycleEventJpa;
 import demoapp.dom.domain.objects.other.embedded.jpa.NumberConstantJpa;
 import demoapp.dom.domain.properties.Property.commandPublishing.jpa.PropertyCommandPublishingJpa;
@@ -106,7 +105,6 @@ import org.springframework.context.annotation.Profile;
         DomainObjectIntrospectionAnnotReqdJpa.class,
         DomainObjectIntrospectionEncapsulatedJpa.class,
         DomainObjectMixinMethodJpa.class,
-        DomainObjectXxxDomainEventJpa.class,
         DomainObjectXxxLifecycleEventJpa.class,
 
         CausewayBlobJpa.class,
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlStrategy.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlStrategy.java
index 6317a893e6..1c8f49c78d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlStrategy.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlStrategy.java
@@ -56,7 +56,6 @@ enum ActionDomainEventControlStrategy {
                     ev.disable("ControlStrategy set to DISABLE");
                     break;
             }
-
         }
     },
 // end::disable[]
@@ -79,7 +78,6 @@ enum ActionDomainEventControlStrategy {
     EXECUTING_FORCE_UPPER_CASE{
         @Override
         void on(ActionDomainEvent<?> ev, ServiceRegistry serviceRegistry) {
-
             switch (ev.getEventPhase()) {
                 case EXECUTING:
                     List<Object> arguments = ev.getArguments();
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage-description.adoc
index e2714d225f..b4866da1a1 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage-description.adoc
@@ -15,10 +15,6 @@ The `domainEvent` element specifies the class to be emitted; this must be a subc
 If no `domainEvent` is specified on the action itself, then the domain event class can be specified at the class level using link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/annotation/DomainObject.html#actiondomainevent[@DomainObject#actionDomainEvent].
 And if not specified at the class level, then an instance of `o.a.c.applib.events.domain.ActionDomainEvent.Default` is emitted as the fallback.
 
-[TIP]
-====
-The fallback domain event can be suppressed using the `causeway.applib.annotation.action.domain-event.post-for-default` configuration property.
-====
 
 === How this demo works
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_changeControlStrategy.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_changeControlStrategy.java
index a5e8d5a10a..f3836ba2b4 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_changeControlStrategy.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_changeControlStrategy.java
@@ -32,17 +32,16 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ActionDomainEventPage_changeControlStrategy {
 
-    private final ActionDomainEventPage actionDomainEventVm;
+    private final ActionDomainEventPage mixee;
 
-    @MemberSupport public ActionDomainEventPage act(final ActionDomainEventControlStrategy controlStrategy) {
-        eventActionDomainEventControlService.controlStrategy = controlStrategy;
-        return actionDomainEventVm;
+    @MemberSupport public ActionDomainEventPage act(ActionDomainEventControlStrategy controlStrategy) {
+        subscriber.controlStrategy = controlStrategy;
+        return mixee;
     }
     @MemberSupport public ActionDomainEventControlStrategy default0Act() {
-        return eventActionDomainEventControlService.controlStrategy;
+        return subscriber.controlStrategy;
     }
 
-    @Inject
-    ActionDomainEventControlSubscriber eventActionDomainEventControlService;
+    @Inject ActionDomainEventControlSubscriber subscriber;
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/CollectionDomainEventVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/CollectionDomainEventVm-description.adoc
index 16ea3c7810..2a0b6a4011 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/CollectionDomainEventVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/CollectionDomainEventVm-description.adoc
@@ -13,10 +13,6 @@ If no `domainEvent` is specified on the property itself, then the domain event c
 
 And if not specified at the class level, then an instance of `org.apache.causeway.applib.events.domain.CollectionDomainEvent.Default` is emitted as the fallback.
 
-[TIP]
-====
-The fallback domain event can be suppressed using the `causeway.applib.annotation.collection.domain-event.post-for-default` configuration property.
-====
 
 
 == Annotated Collection
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.java
deleted file mode 100644
index 5f12dbf969..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  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.objects.DomainObject.xxxDomainEvent;
-
-import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
-import demoapp.dom._infra.values.ValueHolder;
-
-import org.apache.causeway.applib.annotation.ObjectSupport;
-
-@SuppressWarnings("CdiManagedBeanInconsistencyInspection")
-public abstract class DomainObjectXxxDomainEvent
-        implements
-        HasAsciiDocDescription,
-        ValueHolder<String> {
-
-    @ObjectSupport
-    public String title() {
-        return getName();
-    }
-
-    @Override
-    public String value() {
-        return getName();
-    }
-
-    public abstract String getName();
-    public abstract void setName(String value);
-
-}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.layout.xml
deleted file mode 100644
index 691a0c6d47..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.layout.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?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">
-			<bs3:tabGroup>
-				<bs3:tab name="General">
-					<bs3:row>
-						<bs3:col span="12">
-							<cpt:fieldSet name="General" id="general" >
-								<cpt:property id="name"/>
-								<cpt:property id="originalName"/>
-								<cpt:property id="initialCharacter"/>
-							</cpt:fieldSet>
-						</bs3:col>
-					</bs3:row>
-				</bs3:tab>
-				<bs3:tab name="Metadata">
-					<bs3:row>
-						<bs3:col span="12">
-							<cpt:fieldSet name="Metadata" id="metadata" >
-								<cpt:property id="id"/>
-								<cpt:property id="logicalTypeName"/>
-								<cpt:property id="version"/>
-							</cpt:fieldSet>
-						</bs3:col>
-					</bs3:row>
-				</bs3:tab>
-				<bs3:tab name="Other">
-					<bs3:row>
-						<bs3:col span="12">
-							<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-						</bs3:col>
-					</bs3:row>
-				</bs3:tab>
-			</bs3:tabGroup>
-		</bs3:col>
-		<bs3:col span="6">
-			<cpt:fieldSet name="Description" id="description" >
-				<cpt:action id="clearHints" position="PANEL" />
-				<cpt:action id="rebuildMetamodel" position="PANEL"/>
-				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="impersonateWithRoles"  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/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage_objects.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage_objects.java
deleted file mode 100644
index 25623f499e..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage_objects.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package demoapp.dom.domain.objects.DomainObject.xxxDomainEvent;
-
-import demoapp.dom._infra.values.ValueHolderRepository;
-import demoapp.dom.domain.objects.DomainObject.mixinMethod.DomainObjectMixinMethod;
-import demoapp.dom.domain.objects.DomainObject.mixinMethod.DomainObjectMixinMethodPage;
-import lombok.RequiredArgsConstructor;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.apache.causeway.applib.annotation.Collection;
-import org.apache.causeway.applib.annotation.CollectionLayout;
-import org.apache.causeway.applib.annotation.DomainObject;
-
-@Collection()
-@CollectionLayout()
-@RequiredArgsConstructor
-public class DomainObjectXxxDomainEventPage_objects {
-
-    @SuppressWarnings("unused")
-    private final DomainObjectXxxDomainEventPage mixee;
-
-    public List<? extends DomainObjectXxxDomainEvent> coll() {   // <.>
-        return objectRepository.all();
-    }
-
-    @Inject ValueHolderRepository<String, ? extends DomainObjectXxxDomainEvent> objectRepository;
-}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa-description.adoc
deleted file mode 100644
index e2fa64e618..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa-description.adoc
+++ /dev/null
@@ -1,11 +0,0 @@
-: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 [...]
-
-This domain class ...
-
-[source,java,indent=0]
-.DomainObjectXxxDomainEvent.java
-----
-include::../DomainObjectXxxDomainEvent.java[tags=class]
-----
-<.> ...
-
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa.java
deleted file mode 100644
index 0e38144620..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  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.objects.DomainObject.xxxDomainEvent.jpa;
-
-import demoapp.dom.domain.objects.DomainObject.xxxDomainEvent.DomainObjectXxxDomainEvent;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import javax.inject.Named;
-import javax.persistence.*;
-
-import org.apache.causeway.applib.annotation.DomainObject;
-import org.apache.causeway.applib.annotation.Nature;
-import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
-import org.springframework.context.annotation.Profile;
-
-@Profile("demo-jpa")
-@Entity
-@Table(
-    schema = "demo",
-    name = "DomainObjectXxxDomainEventJpa"
-)
-@EntityListeners(CausewayEntityListener.class)
-@Named("demo.DomainObjectXxxDomainEventJpa")
-@NoArgsConstructor
-//tag::class[]
-// ...
-@DomainObject(nature = Nature.ENTITY)
-public class DomainObjectXxxDomainEventJpa
-                extends DomainObjectXxxDomainEvent {
-    // ...
-//end::class[]
-
-    public DomainObjectXxxDomainEventJpa(String value) {
-        setName(value);
-    }
-
-    @Id
-    @GeneratedValue
-    private Long id;
-//tag::class[]
-
-    @Getter @Setter
-    private String name;
-
-}
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpaEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpaEntities.java
deleted file mode 100644
index 4a13c9638a..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpaEntities.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  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.objects.DomainObject.xxxDomainEvent.jpa;
-
-import demoapp.dom._infra.values.ValueHolderRepository;
-
-import org.springframework.context.annotation.Profile;
-import org.springframework.stereotype.Service;
-
-@Profile("demo-jpa")
-@Service
-public class DomainObjectXxxDomainEventJpaEntities
-extends ValueHolderRepository<String, DomainObjectXxxDomainEventJpa> {
-
-    protected DomainObjectXxxDomainEventJpaEntities() {
-        super(DomainObjectXxxDomainEventJpa.class);
-    }
-
-    @Override
-    protected DomainObjectXxxDomainEventJpa newDetachedEntity(String value) {
-        return new DomainObjectXxxDomainEventJpa(value);
-    }
-
-}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage-description.adoc
index 9480532663..df5abd89bf 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage-description.adoc
@@ -14,10 +14,6 @@ The `domainEvent` element specifies the class to be emitted; this must be a subc
 If no `domainEvent` is specified on the property itself, then the domain event class can be specified at the class level using `@DomainObject#propertyDomainEvent`.
 And if not specified at the class level, then an instance of `org.apache.causeway.applib.events.domain.PropertyDomainEvent.Default` is emitted as the fallback.
 
-[TIP]
-====
-The fallback domain event can be suppressed using the `causeway.applib.annotation.property.domain-event.post-for-default` configuration property.
-====
 
 == Annotated Property
 


[causeway] 01/02: CAUSEWAY-2485: wip - @Action#domainEvent, @DomainObject#xxxDomainEvent (currently NPE in metamodel :-( )

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

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

commit b3a3023ce78c2f5a4c9759687786ee7c8bb033c5
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Mar 31 07:23:05 2023 +0100

    CAUSEWAY-2485: wip - @Action#domainEvent, @DomainObject#xxxDomainEvent (currently NPE in metamodel :-( )
---
 .../src/main/java/demoapp/dom/DemoModuleJpa.java   |   4 +
 .../dom/domain/actions/Action/ActionMenu.java      |   6 +-
 .../ActionDomainEventControlStrategy.java          |  60 ++--------
 ...ava => ActionDomainEventControlSubscriber.java} |  20 +---
 .../ActionDomainEventPage-description.adoc         | 106 ++++++++++++++++++
 ...mainEventVm.java => ActionDomainEventPage.java} |  38 +------
 ...layout.xml => ActionDomainEventPage.layout.xml} |  33 ++++--
 ...tionDomainEventPage_changeControlStrategy.java} |  21 +---
 ... => ActionDomainEventPage_controlStrategy.java} |   9 +-
 ....java => ActionDomainEventPage_updateText.java} |  26 ++---
 ...ionDomainEventPage_updateTextNotAnnotated.java} |  29 ++---
 .../ActionDomainEventVm-description.adoc           | 123 ---------------------
 .../objects/DomainObject/DomainObjectMenu.java     |  12 +-
 .../jpa/DomainObjectMixinMethodJpa.java            |   2 +-
 ...entsVm.java => DomainObjectXxxDomainEvent.java} |  36 +++---
 .../DomainObjectXxxDomainEvent.layout.xml}         |  57 +++++++---
 ...omainObjectXxxDomainEventPage-description.adoc} |   1 -
 ...Vm.java => DomainObjectXxxDomainEventPage.java} |   6 +-
 ...l => DomainObjectXxxDomainEventPage.layout.xml} |  13 ++-
 .../DomainObjectXxxDomainEventPage_objects.java    |  29 +++++
 .../DomainObjectXxxDomainEventJpa-description.adoc |  11 ++
 .../jpa/DomainObjectXxxDomainEventJpa.java}        |  14 +--
 .../DomainObjectXxxDomainEventJpaEntities.java}    |  33 +++---
 ...sVm.java => DomainObjectXxxLifecycleEvent.java} |  36 +++---
 .../DomainObjectXxxLifecycleEvent.layout.xml}      |  57 +++++++---
 ...ainObjectXxxLifecyleEventPage-description.adoc} |   1 +
 ....java => DomainObjectXxxLifecyleEventPage.java} |   6 +-
 ...=> DomainObjectXxxLifecyleEventPage.layout.xml} |  13 ++-
 ...mainObjectXxxLifecycleEventJpa-description.adoc |  11 ++
 .../jpa/DomainObjectXxxLifecycleEventJpa.java}     |  14 +--
 .../DomainObjectXxxLifecycleEventJpaEntities.java} |  33 +++---
 .../domain/properties/Property/PropertyMenu.java   |  18 +--
 ...oc => PropertyDomainEventPage-description.adoc} |   3 +-
 ...inEventVm.java => PropertyDomainEventPage.java} |   8 +-
 ...yout.xml => PropertyDomainEventPage.layout.xml} |   0
 .../PropertyDomainEventControlService.java         |   6 +-
 .../PropertyDomainEventControlStrategy.java        |  16 +--
 .../PropertyDomainEventVm_controlText.java         |   4 +-
 .../PropertyDomainEventVm_controlTextEditing.java  |   6 +-
 ...n.adoc => PropertyEditingPage-description.adoc} |  12 +-
 ...ertyEditingVm.java => PropertyEditingPage.java} |   4 +-
 ...m.layout.xml => PropertyEditingPage.layout.xml} |   0
 ...doc => PropertyFileAcceptPage-description.adoc} |  24 ++--
 ...leAcceptVm.java => PropertyFileAcceptPage.java} |   4 +-
 ...ayout.xml => PropertyFileAcceptPage.layout.xml} |   0
 ...eAcceptPage_updateClobWithParameterLayout.java} |   6 +-
 ...tyFileAcceptPage_updateWithMetaAnnotation.java} |   6 +-
 ...ptPage_updateWithMetaAnnotationOverridden.java} |   6 +-
 ...yFileAcceptPage_updateWithParameterLayout.java} |   6 +-
 49 files changed, 496 insertions(+), 493 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
index b0ead1c349..36bcc11844 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
@@ -30,6 +30,8 @@ import demoapp.dom.domain.objects.DomainObject.introspection.annotReqd.jpa.Domai
 import demoapp.dom.domain.objects.DomainObject.introspection.encapsulated.jpa.DomainObjectIntrospectionEncapsulatedJpa;
 import demoapp.dom.domain.objects.DomainObject.mixinMethod.jpa.DomainObjectMixinMethodJpa;
 import demoapp.dom.domain.objects.DomainObject.nature.entity.jpa.DomainObjectNatureJpa;
+import demoapp.dom.domain.objects.DomainObject.xxxDomainEvent.jpa.DomainObjectXxxDomainEventJpa;
+import demoapp.dom.domain.objects.DomainObject.xxxLifecycleEvent.jpa.DomainObjectXxxLifecycleEventJpa;
 import demoapp.dom.domain.objects.other.embedded.jpa.NumberConstantJpa;
 import demoapp.dom.domain.properties.Property.commandPublishing.jpa.PropertyCommandPublishingJpa;
 import demoapp.dom.domain.properties.Property.executionPublishing.jpa.PropertyExecutionPublishingJpa;
@@ -104,6 +106,8 @@ import org.springframework.context.annotation.Profile;
         DomainObjectIntrospectionAnnotReqdJpa.class,
         DomainObjectIntrospectionEncapsulatedJpa.class,
         DomainObjectMixinMethodJpa.class,
+        DomainObjectXxxDomainEventJpa.class,
+        DomainObjectXxxLifecycleEventJpa.class,
 
         CausewayBlobJpa.class,
         CausewayClobJpa.class,
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/ActionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/ActionMenu.java
index f819244df8..0f78ef8e60 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/ActionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/ActionMenu.java
@@ -33,7 +33,7 @@ import demoapp.dom._infra.values.ValueHolderRepository;
 import demoapp.dom.domain.actions.Action.associateWith.ActionAssociateWithVm;
 import demoapp.dom.domain.actions.Action.associateWith.child.ActionAssociateWithChildVm;
 import demoapp.dom.domain.actions.Action.commandPublishing.ActionCommandPublishingEntity;
-import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventVm;
+import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventPage;
 import demoapp.dom.domain.actions.Action.executionPublishing.ActionExecutionPublishingEntity;
 import demoapp.dom.domain.actions.Action.hidden.ActionHiddenVm;
 import demoapp.dom.domain.actions.Action.restrictTo.ActionRestrictToVm;
@@ -80,8 +80,8 @@ public class ActionMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Class of the domain event emitted when interacting with the action")
-    public ActionDomainEventVm domainEvent(){
-        return new ActionDomainEventVm("value");
+    public ActionDomainEventPage domainEvent(){
+        return new ActionDomainEventPage("value");
     }
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlStrategy.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlStrategy.java
similarity index 61%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlStrategy.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlStrategy.java
index 0bc75e9590..6317a893e6 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlStrategy.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlStrategy.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.domain.actions.Action.domainEvent.subscribers;
+package demoapp.dom.domain.actions.Action.domainEvent;
 
 import java.util.List;
 
@@ -24,26 +24,21 @@ import org.apache.causeway.applib.events.domain.ActionDomainEvent;
 import org.apache.causeway.applib.services.message.MessageService;
 import org.apache.causeway.applib.services.registry.ServiceRegistry;
 
-import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventVm;
-import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventVm_mixinUpdateText;
-
 // tag::class[]
 enum ActionDomainEventControlStrategy {
 
     DO_NOTHING{
         @Override
-        void on(ActionDomainEvent<?> ev
-                , ServiceRegistry serviceRegistry) {
+        void on(ActionDomainEvent<?> ev, ServiceRegistry serviceRegistry) {
         }
     },
     // ...
 // end::class[]
 
 // tag::hide[]
-    HIDE_BOTH {
+    HIDE_ACTION {
         @Override
-        void on(ActionDomainEvent<?> ev
-                , ServiceRegistry serviceRegistry) {
+        void on(ActionDomainEvent<?> ev, ServiceRegistry serviceRegistry) {
             switch (ev.getEventPhase()) {
                 case HIDE:
                     ev.hide();
@@ -51,53 +46,24 @@ enum ActionDomainEventControlStrategy {
             }
         }
     },
-    HIDE_REGULAR_ACTION {
-        @Override
-        void on(ActionDomainEvent<?> ev
-                , ServiceRegistry serviceRegistry) {
-            if (ev instanceof ActionDomainEventVm.UpdateTextDomainEvent) {
-                switch (ev.getEventPhase()) {
-                    case HIDE:
-                        ev.hide();
-                        break;
-                }
-            }
-        }
-    },
 // end::hide[]
 // tag::disable[]
-    DISABLE_BOTH {
+    DISABLE {
         @Override
-        void on(ActionDomainEvent<?> ev
-                , ServiceRegistry serviceRegistry) {
+        void on(ActionDomainEvent<?> ev, ServiceRegistry serviceRegistry) {
             switch (ev.getEventPhase()) {
                 case DISABLE:
-                    ev.disable("ControlStrategy set to DISABLE_BOTH");
+                    ev.disable("ControlStrategy set to DISABLE");
                     break;
             }
 
         }
     },
-    DISABLE_MIXIN_ACTION {
-        @Override
-        void on(ActionDomainEvent<?> ev
-                , ServiceRegistry serviceRegistry) {
-            if(ev instanceof ActionDomainEventVm_mixinUpdateText.DomainEvent) {
-                switch (ev.getEventPhase()) {
-                    case DISABLE:
-                        ev.disable("ControlStrategy set to DISABLE_MIXIN_ACTION");
-                        break;
-                }
-            }
-
-        }
-    },
 // end::disable[]
 // tag::validate[]
     VALIDATE_MUST_BE_UPPER_CASE{
         @Override
-        void on(ActionDomainEvent<?> ev
-                , ServiceRegistry serviceRegistry) {
+        void on(ActionDomainEvent<?> ev, ServiceRegistry serviceRegistry) {
             switch (ev.getEventPhase()) {
                 case VALIDATE:
                     String argument = (String) ev.getArguments().get(0);
@@ -106,15 +72,13 @@ enum ActionDomainEventControlStrategy {
                     }
                     break;
             }
-
         }
     },
 // end::validate[]
 // tag::executing[]
     EXECUTING_FORCE_UPPER_CASE{
         @Override
-        void on(ActionDomainEvent<?> ev
-                , ServiceRegistry serviceRegistry) {
+        void on(ActionDomainEvent<?> ev, ServiceRegistry serviceRegistry) {
 
             switch (ev.getEventPhase()) {
                 case EXECUTING:
@@ -129,8 +93,7 @@ enum ActionDomainEventControlStrategy {
 // tag::executed[]
     EXECUTED_ANNOUNCE{
         @Override
-        void on(ActionDomainEvent<?> ev
-                , ServiceRegistry serviceRegistry) {
+        void on(ActionDomainEvent<?> ev, ServiceRegistry serviceRegistry) {
             switch (ev.getEventPhase()) {
                 case EXECUTED:
                     serviceRegistry
@@ -146,7 +109,6 @@ enum ActionDomainEventControlStrategy {
 
 // tag::class[]
     ;
-    abstract void on(ActionDomainEvent<?> ev
-            , ServiceRegistry serviceRegistry);
+    abstract void on(ActionDomainEvent<?> ev, ServiceRegistry serviceRegistry);
 }
 // end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlService.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlSubscriber.java
similarity index 63%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlService.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlSubscriber.java
index 964419567d..caf4dce9de 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventControlSubscriber.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.domain.actions.Action.domainEvent.subscribers;
+package demoapp.dom.domain.actions.Action.domainEvent;
 
 import javax.inject.Inject;
 
@@ -25,28 +25,20 @@ import org.springframework.stereotype.Service;
 
 import org.apache.causeway.applib.services.registry.ServiceRegistry;
 
-import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventVm;
-import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventVm_mixinUpdateText;
 import lombok.RequiredArgsConstructor;
 
 // tag::class[]
 @Service
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
-class ActionDomainEventControlService {
+class ActionDomainEventControlSubscriber {
 
     final ServiceRegistry serviceRegistry;
 
-    ActionDomainEventControlStrategy controlStrategy = ActionDomainEventControlStrategy.DO_NOTHING;         // <.>
+    ActionDomainEventControlStrategy controlStrategy = ActionDomainEventControlStrategy.DO_NOTHING;
 
-    @EventListener(ActionDomainEventVm.UpdateTextDomainEvent.class)       // <.>
-    public void on(ActionDomainEventVm.UpdateTextDomainEvent ev) {
-        controlStrategy.on(ev, serviceRegistry);
+    @EventListener(ActionDomainEventPage_updateText.DomainEvent.class)      // <.>
+    public void on(ActionDomainEventPage_updateText.DomainEvent ev) {
+        controlStrategy.on(ev, serviceRegistry);                            // <.>
     }
-
-    @EventListener(ActionDomainEventVm_mixinUpdateText.DomainEvent.class) // <.>
-    public void on(ActionDomainEventVm_mixinUpdateText.DomainEvent ev) {
-        controlStrategy.on(ev, serviceRegistry);
-    }
-
 }
 // end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage-description.adoc
new file mode 100644
index 0000000000..e2714d225f
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage-description.adoc
@@ -0,0 +1,106 @@
+: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 [...]
+
+Usually a domain event is emitted by the framework to emit whenever the user interacts with an action.
+Domain service subscribers can influence this interaction, either by:
+
+* hiding the action
+* disabling the action
+* validating arguments of the action invocation
+* performing arbitrary operations before the action has been invoked (including modifying the argument values to be used)
+* performing arbitrary operations after the action has been modified (including changing the apparent return value of the action)
+
+
+The `domainEvent` element specifies the class to be emitted; this must be a subclass of the abstract link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/events/domain/ActionDomainEvent.html[ActionDomainEvent] class.
+
+If no `domainEvent` is specified on the action itself, then the domain event class can be specified at the class level using link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/annotation/DomainObject.html#actiondomainevent[@DomainObject#actionDomainEvent].
+And if not specified at the class level, then an instance of `o.a.c.applib.events.domain.ActionDomainEvent.Default` is emitted as the fallback.
+
+[TIP]
+====
+The fallback domain event can be suppressed using the `causeway.applib.annotation.action.domain-event.post-for-default` configuration property.
+====
+
+=== How this demo works
+
+This page object has a single property, `text` and two (mixin) actions that update it.
+One is annotated with a custom domain event, the other is not.
+
+The annotated action can be controlled using the "change control strategy" action, influencing whether it is hidden, disabled, and so on.
+This control does not apply to the non-annotated action.
+
+In terms of code:
+
+* the annotated action:
++
+[source,java]
+.ActionDomainEventPage_updateText.java
+----
+include::ActionDomainEventPage_updateText.java[tags=class]
+----
+<.> the event class to emit
+<.> the event class definition.
+It's common to define these as nested classes.
+
+* the subscriber that listens to the events:
++
+[source,java]
+.ActionDomainEventPage_updateText.java
+.ActionDomainEventControlSubscriber.java
+----
+include::ActionDomainEventControlSubscriber.java[tags=class]
+----
+<.> listens to the custom event
+<.> dispatches to the currently selected control strategy (see below)
+
+* the action that selects the strategy in effect:
++
+[source,java]
+.ActionDomainEventPage_changeControlStrategy
+----
+include::ActionDomainEventPage_changeControlStrategy.java[tags=class]
+----
+
+* the different strategies:
+
+** do nothing
++
+[source,java]
+----
+include::ActionDomainEventControlStrategy.java[tags=class]
+----
+
+** hide
++
+[source,java,indent=0]
+----
+include::ActionDomainEventControlStrategy.java[tags=hide]
+----
+
+** disable
++
+[source,java,indent=0]
+----
+include::ActionDomainEventControlStrategy.java[tags=disable]
+----
+
+** validate
++
+[source,java,indent=0]
+----
+include::ActionDomainEventControlStrategy.java[tags=validate]
+----
+
+** executing
++
+[source,java,indent=0]
+----
+include::ActionDomainEventControlStrategy.java[tags=executing]
+----
+
+** executed
++
+[source,java,indent=0]
+----
+include::ActionDomainEventControlStrategy.java[tags=executed]
+----
+
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage.java
similarity index 66%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage.java
index f3e80d9baa..d76b5af36e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage.java
@@ -33,7 +33,6 @@ import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.events.domain.ActionDomainEvent;
 
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
@@ -41,19 +40,15 @@ import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
 
-@XmlRootElement(name = "root")
+@XmlRootElement(name = "demo.ActionDomainEventPage")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.ActionDomainEventVm")
-@DomainObject(
-    nature=Nature.VIEW_MODEL)
+@Named("demo.ActionDomainEventPage")
+@DomainObject(nature=Nature.VIEW_MODEL)
 @NoArgsConstructor
-//tag::class[]
-public class ActionDomainEventVm implements HasAsciiDocDescription {
-    // ...
-//end::class[]
+public class ActionDomainEventPage implements HasAsciiDocDescription {
 
-    public ActionDomainEventVm(final String text) {
+    public ActionDomainEventPage(final String text) {
         this.text = text;
     }
 
@@ -62,31 +57,8 @@ public class ActionDomainEventVm implements HasAsciiDocDescription {
     }
 
     @Property()
-    @PropertyLayout(fieldSetId = "annotation", sequence = "1")
     @XmlElement(required = true)
     @Getter @Setter
     private String text;
-//tag::class[]
 
-    public static class UpdateTextDomainEvent                       // <.>
-            extends ActionDomainEvent<ActionDomainEventVm> {}
-
-    @Action(
-            semantics = SemanticsOf.IDEMPOTENT
-            , domainEvent = UpdateTextDomainEvent.class             // <.>
-    )
-    @ActionLayout(
-        describedAs =
-            "@Action(domainEvent = UpdateTextDomainEvent.class)"
-        , associateWith = "text"
-        , sequence = "1"
-    )
-    public ActionDomainEventVm updateText(final String text) {
-        setText(text);
-        return this;
-    }
-    @MemberSupport public String default0UpdateText() {
-        return getText();
-    }
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage.layout.xml
similarity index 70%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.layout.xml
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage.layout.xml
index 4337e06f1a..33459cedb9 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage.layout.xml
@@ -28,26 +28,39 @@
 		<bs3:col span="6">
 			<bs3:row>
 				<bs3:col span="12">
-					<cpt:fieldSet name="Annotated" id="annotation"/>
-					<cpt:fieldSet name="Contributed" id="contributed"/>
+					<cpt:fieldSet name="Object" id="object">
+						<cpt:property id="text">
+							<cpt:action id="updateText">
+								<cpt:named>update (annotated)</cpt:named>
+							</cpt:action>
+							<cpt:action id="updateTextNotAnnotated">
+								<cpt:named>update (not annotated)</cpt:named>
+							</cpt:action>
+						</cpt:property>
+					</cpt:fieldSet>
+					<cpt:fieldSet name="Control" id="contributed">
+						<cpt:property id="controlStrategy">
+							<cpt:action id="changeControlStrategy">
+								<cpt:named>Change</cpt:named>
+							</cpt:action>
+						</cpt:property>
+					</cpt:fieldSet>
 					<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
 				</bs3:col>
 			</bs3:row>
-			<bs3:row>
-				<bs3:col span="12">
-					<cpt:collection id="events"/>
-				</bs3:col>
-			</bs3:row>
 		</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"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventVm_controlUpdateTextInvocation.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_changeControlStrategy.java
similarity index 65%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventVm_controlUpdateTextInvocation.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_changeControlStrategy.java
index a19f5e7230..a5e8d5a10a 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventVm_controlUpdateTextInvocation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_changeControlStrategy.java
@@ -16,34 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.domain.actions.Action.domainEvent.subscribers;
+package demoapp.dom.domain.actions.Action.domainEvent;
 
 import javax.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.PromptStyle;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
-import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventVm;
 import lombok.RequiredArgsConstructor;
 
 
 //tag::class[]
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    promptStyle = PromptStyle.INLINE
-    , associateWith = "controlUpdateText"
-    , sequence = "1")
+@Action(semantics = SemanticsOf.IDEMPOTENT)
 @RequiredArgsConstructor
-public class ActionDomainEventVm_controlUpdateTextInvocation {
+public class ActionDomainEventPage_changeControlStrategy {
 
-    private final ActionDomainEventVm actionDomainEventVm;
+    private final ActionDomainEventPage actionDomainEventVm;
 
-    @MemberSupport public ActionDomainEventVm act(final ActionDomainEventControlStrategy controlStrategy) {
+    @MemberSupport public ActionDomainEventPage act(final ActionDomainEventControlStrategy controlStrategy) {
         eventActionDomainEventControlService.controlStrategy = controlStrategy;
         return actionDomainEventVm;
     }
@@ -52,6 +43,6 @@ public class ActionDomainEventVm_controlUpdateTextInvocation {
     }
 
     @Inject
-    ActionDomainEventControlService eventActionDomainEventControlService;
+    ActionDomainEventControlSubscriber eventActionDomainEventControlService;
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventVm_controlUpdateText.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_controlStrategy.java
similarity index 79%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventVm_controlUpdateText.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_controlStrategy.java
index 09dd4dc948..3c6514b17e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventVm_controlUpdateText.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_controlStrategy.java
@@ -16,14 +16,13 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.domain.actions.Action.domainEvent.subscribers;
+package demoapp.dom.domain.actions.Action.domainEvent;
 
 import javax.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
 
-import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventVm;
 import lombok.RequiredArgsConstructor;
 
 
@@ -31,15 +30,15 @@ import lombok.RequiredArgsConstructor;
 @Property()
 @PropertyLayout(fieldSetId = "contributed", sequence = "1")
 @RequiredArgsConstructor
-public class ActionDomainEventVm_controlUpdateText {
+public class ActionDomainEventPage_controlStrategy {
 
-    private final ActionDomainEventVm actionDomainEventVm;
+    private final ActionDomainEventPage actionDomainEventVm;
 
     public ActionDomainEventControlStrategy prop() {
         return eventActionDomainEventControlService.controlStrategy;
     }
 
     @Inject
-    ActionDomainEventControlService eventActionDomainEventControlService;
+    ActionDomainEventControlSubscriber eventActionDomainEventControlService;
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm_mixinUpdateText.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_updateText.java
similarity index 70%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm_mixinUpdateText.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_updateText.java
index 79d5417a14..a74663ce36 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm_mixinUpdateText.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_updateText.java
@@ -21,38 +21,30 @@ package demoapp.dom.domain.actions.Action.domainEvent;
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.events.domain.ActionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
 
 //tag::class[]
-@Action(
-    semantics = SemanticsOf.SAFE
-    , domainEvent =
-        ActionDomainEventVm_mixinUpdateText.DomainEvent.class           // <.>
-)
-@ActionLayout(
-    describedAs =
-        "@Action(domainEvent = ActionDomainEventVm_mixinUpdateText.DomainEvent.class)"
-    , associateWith = "text"
-    , sequence = "2"
-)
+@Action(domainEvent = ActionDomainEventPage_updateText.DomainEvent.class)   // <.>
 @RequiredArgsConstructor
-public class ActionDomainEventVm_mixinUpdateText {
+public class ActionDomainEventPage_updateText {
 
-    public static class DomainEvent                                     // <.>
-            extends ActionDomainEvent<ActionDomainEventVm> {}
+    public static class DomainEvent                                         // <.>
+            extends ActionDomainEvent<ActionDomainEventPage> {}
+    // ...
+//end::class[]
 
-    private final ActionDomainEventVm actionDomainEventVm;
+    private final ActionDomainEventPage actionDomainEventVm;
 
-    @MemberSupport public ActionDomainEventVm act(final String text) {
+    @MemberSupport public ActionDomainEventPage act(final String text) {
         actionDomainEventVm.setText(text);
         return actionDomainEventVm;
     }
     @MemberSupport public String default0Act() {
         return actionDomainEventVm.getText();
     }
+//tag::class[]
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm_mixinUpdateText.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_updateTextNotAnnotated.java
similarity index 66%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm_mixinUpdateText.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_updateTextNotAnnotated.java
index 79d5417a14..03c15987ae 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm_mixinUpdateText.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventPage_updateTextNotAnnotated.java
@@ -18,41 +18,30 @@
  */
 package demoapp.dom.domain.actions.Action.domainEvent;
 
+import lombok.RequiredArgsConstructor;
+
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.events.domain.ActionDomainEvent;
 
-import lombok.RequiredArgsConstructor;
-
 
 //tag::class[]
-@Action(
-    semantics = SemanticsOf.SAFE
-    , domainEvent =
-        ActionDomainEventVm_mixinUpdateText.DomainEvent.class           // <.>
-)
-@ActionLayout(
-    describedAs =
-        "@Action(domainEvent = ActionDomainEventVm_mixinUpdateText.DomainEvent.class)"
-    , associateWith = "text"
-    , sequence = "2"
-)
+@Action()                                                       // <.>
 @RequiredArgsConstructor
-public class ActionDomainEventVm_mixinUpdateText {
-
-    public static class DomainEvent                                     // <.>
-            extends ActionDomainEvent<ActionDomainEventVm> {}
+public class ActionDomainEventPage_updateTextNotAnnotated {
+    // ...
+//end::class[]
 
-    private final ActionDomainEventVm actionDomainEventVm;
+    private final ActionDomainEventPage actionDomainEventVm;
 
-    @MemberSupport public ActionDomainEventVm act(final String text) {
+    @MemberSupport public ActionDomainEventPage act(final String text) {
         actionDomainEventVm.setText(text);
         return actionDomainEventVm;
     }
     @MemberSupport public String default0Act() {
         return actionDomainEventVm.getText();
     }
+//tag::class[]
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm-description.adoc
deleted file mode 100644
index bebba1dad4..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm-description.adoc
+++ /dev/null
@@ -1,123 +0,0 @@
-: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 [...]
-
-Usually a domain event is emitted by the framework to emit whenever the user interacts with an action.
-Domain service subscribers can influence this interaction, either by:
-
-* hiding the action
-* disabling the action
-* validating arguments of the action invocation
-* performing arbitrary operations before the action has been invoked (including modifying the argument values to be used)
-* performing arbitrary operations after the action has been modified (including changing the apparent return value of the action)
-
-
-The `domainEvent` element specifies the class to be emitted; this must be a subclass of the abstract `org.apache.causeway.applib.events.domain.ActionDomainEvent` class.
-
-If no `domainEvent` is specified on the action itself, then the domain event class can be specified at the class level using `@DomainObject#actionDomainEvent`.
-And if not specified at the class level, then an instance of `org.apache.causeway.applib.events.domain.ActionDomainEvent.Default` is emitted as the fallback.
-
-[TIP]
-====
-The fallback domain event can be suppressed using the `causeway.applib.annotation.action.domain-event.post-for-default` configuration property.
-====
-
-== Annotated Actions
-
-The demo defines two actions that are annotated using `domainEvent` element:
-
-* in the `ActionSemanticsVm` is a regular action, "updateText":
-+
-[source,java]
-----
-include::ActionDomainEventVm.java[tags=class]
-----
-<.> the event class to emit; genericised by the target type
-<.> indicates that the framework should emit this type
-
-* The `ActionSemanticsVm_mixinIncrementByAmountNonIdempotent` defines a mixin action, also annotated:
-+
-[source,java]
-----
-include::ActionDomainEventVm_mixinUpdateText.java[tags=class]
-----
-
-<.> the event class to emit; genericised by the target type
-+
-TIP: it's idiomatic to use a nested static class here.
-<.> indicates that the framework should emit this type
-
-== Subscriber
-
-The `ActionDomainEventControlService` is the subscriber:
-
-[source,java]
-----
-include::subscribers/ActionDomainEventControlService.java[tags=class]
-----
-<.> holds which "strategy" should be used to modify the interactions with the text field
-<.> subscribes using the Spring event bus
-
-== Influencing the Interaction
-
-The mechanisms to influence the interactions are implemented as an enum.
-The `DO_NOTHING` enum, unsurprisingly, does nothing:
-
-[source,java]
-----
-include::subscribers/ActionDomainEventControlStrategy.java[tags=class]
-----
-
-There are seven further options:
-
-* hide (two examples)
-+
-[source,java,indent=0]
-----
-include::subscribers/ActionDomainEventControlStrategy.java[tags=hide]
-----
-
-* disable (two examples)
-+
-[source,java,indent=0]
-----
-include::subscribers/ActionDomainEventControlStrategy.java[tags=disable]
-----
-
-* validate
-+
-[source,java,indent=0]
-----
-include::subscribers/ActionDomainEventControlStrategy.java[tags=validate]
-----
-
-* executing
-+
-[source,java,indent=0]
-----
-include::subscribers/ActionDomainEventControlStrategy.java[tags=executing]
-----
-
-* executed
-+
-[source,java,indent=0]
-----
-include::subscribers/ActionDomainEventControlStrategy.java[tags=executed]
-----
-
-=== Selecting the Strategy
-
-Selecting which strategy is in force is implemented using two mixins which work together:
-
-* the `controlUpdateText` mixin property just surfaces the selected strategy as a read-only value:
-+
-[source,java]
-----
-include::subscribers/ActionDomainEventVm_controlUpdateText.java[tags=class]
-----
-
-* while the `controlUpdateTextInvocation` mixin action allows the strategy to be changed:
-+
-[source,java]
-----
-include::subscribers/ActionDomainEventVm_controlUpdateTextInvocation.java[tags=class]
-----
-
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java
index 55c8afad07..29aa7593b0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java
@@ -26,8 +26,8 @@ import demoapp.dom.domain.objects.DomainObject.entityChangePublishing.DomainObje
 import demoapp.dom.domain.objects.DomainObject.introspection.DomainObjectIntrospectionPage;
 import demoapp.dom.domain.objects.DomainObject.mixinMethod.DomainObjectMixinMethodPage;
 import demoapp.dom.domain.objects.DomainObject.nature.DomainObjectNaturePage;
-import demoapp.dom.domain.objects.DomainObject.xxxDomainEvent.DomainObjectDomainEventsVm;
-import demoapp.dom.domain.objects.DomainObject.xxxLifecycleEvent.DomainObjectLifecyleEventsVm;
+import demoapp.dom.domain.objects.DomainObject.xxxDomainEvent.DomainObjectXxxDomainEventPage;
+import demoapp.dom.domain.objects.DomainObject.xxxLifecycleEvent.DomainObjectXxxLifecyleEventPage;
 import lombok.RequiredArgsConstructor;
 
 import javax.inject.Inject;
@@ -93,14 +93,14 @@ public class DomainObjectMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Default class of the domain event emitted when interacting with the domain object's actions, properties or collections")
-    public DomainObjectDomainEventsVm domainEvents() {
-        return new DomainObjectDomainEventsVm();
+    public DomainObjectXxxDomainEventPage domainEvents() {
+        return new DomainObjectXxxDomainEventPage();
     }
 
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-redo", describedAs = "Class of the lifecycle event emitted when the domain entity transitions through its persistence lifecycle")
-    public DomainObjectLifecyleEventsVm lifecycleEvents() {
-        return new DomainObjectLifecyleEventsVm();
+    public DomainObjectXxxLifecyleEventPage lifecycleEvents() {
+        return new DomainObjectXxxLifecyleEventPage();
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java
index 06bd418edb..1dc8affbfe 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java
@@ -35,7 +35,7 @@ import org.springframework.context.annotation.Profile;
 @Entity
 @Table(
     schema = "demo",
-    name = "DomainObjectMixinMethodJpaJpa"
+    name = "DomainObjectMixinMethodJpa"
 )
 @EntityListeners(CausewayEntityListener.class)
 @Named("demo.DomainObjectMixinMethodJpa")
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.java
similarity index 59%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.java
index 1eb6109dac..5f12dbf969 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.java
@@ -19,29 +19,27 @@
 package demoapp.dom.domain.objects.DomainObject.xxxDomainEvent;
 
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import demoapp.dom._infra.values.ValueHolder;
 
-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.DomainObject;
-import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 
-//tag::class[]
-@XmlRootElement(name = "root")
-@XmlType
-@XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.DomainObjectDomainEventsVm")
-@DomainObject(
-        nature = Nature.VIEW_MODEL)
-public class DomainObjectDomainEventsVm implements HasAsciiDocDescription {
+@SuppressWarnings("CdiManagedBeanInconsistencyInspection")
+public abstract class DomainObjectXxxDomainEvent
+        implements
+        HasAsciiDocDescription,
+        ValueHolder<String> {
+
+    @ObjectSupport
+    public String title() {
+        return getName();
+    }
 
-    @ObjectSupport public String title() {
-        return "DomainObject#...DomainEvent";
+    @Override
+    public String value() {
+        return getName();
     }
 
+    public abstract String getName();
+    public abstract void setName(String value);
+
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.layout.xml
similarity index 61%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.layout.xml
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.layout.xml
index 4337e06f1a..691a0c6d47 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEvent.layout.xml
@@ -26,33 +26,54 @@
 
 	<bs3:row>
 		<bs3:col span="6">
-			<bs3:row>
-				<bs3:col span="12">
-					<cpt:fieldSet name="Annotated" id="annotation"/>
-					<cpt:fieldSet name="Contributed" id="contributed"/>
-					<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-				</bs3:col>
-			</bs3:row>
-			<bs3:row>
-				<bs3:col span="12">
-					<cpt:collection id="events"/>
-				</bs3:col>
-			</bs3:row>
+			<bs3:tabGroup>
+				<bs3:tab name="General">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="General" id="general" >
+								<cpt:property id="name"/>
+								<cpt:property id="originalName"/>
+								<cpt:property id="initialCharacter"/>
+							</cpt:fieldSet>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Metadata">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Metadata" id="metadata" >
+								<cpt:property id="id"/>
+								<cpt:property id="logicalTypeName"/>
+								<cpt:property id="version"/>
+							</cpt:fieldSet>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Other">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+			</bs3:tabGroup>
 		</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"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  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="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
-		</bs3:col>
-	</bs3:row>
+		</bs3:col>	</bs3:row>
 	<bs3:row>
 		<bs3:col span="12" unreferencedCollections="true"/>
 	</bs3:row>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage-description.adoc
similarity index 99%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm-description.adoc
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage-description.adoc
index ddfcc44bad..21d6014a98 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage-description.adoc
@@ -59,4 +59,3 @@ public class Order {
 This subclass must provide a no-arg constructor; the fields are set reflectively. It must also use `Object` as its generic type. This is to allow mixins to also emit the same event.
 
 
-
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage.java
similarity index 90%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage.java
index 1eb6109dac..d2884b23ba 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage.java
@@ -34,13 +34,13 @@ import org.apache.causeway.applib.annotation.ObjectSupport;
 @XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.DomainObjectDomainEventsVm")
+@Named("demo.DomainObjectXxxDomainEventPage")
 @DomainObject(
         nature = Nature.VIEW_MODEL)
-public class DomainObjectDomainEventsVm implements HasAsciiDocDescription {
+public class DomainObjectXxxDomainEventPage implements HasAsciiDocDescription {
 
     @ObjectSupport public String title() {
-        return "DomainObject#...DomainEvent";
+        return "@DomainObject#xxxDomainEvent";
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage.layout.xml
similarity index 82%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm.layout.xml
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage.layout.xml
index b4f853de75..2ca31ba597 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage.layout.xml
@@ -18,6 +18,7 @@
 	<bs3:row>
 		<bs3:col span="10" unreferencedActions="true">
 			<cpt:domainObject />
+			<cpt:action id="toggleEvents"/>
 		</bs3:col>
 		<bs3:col span="2">
 			<cpt:fieldSet name="" id="sources" />
@@ -27,16 +28,22 @@
 	<bs3:row>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+			<cpt:collection id="objects">
+				<cpt:action id="updateName"/>
+			</cpt:collection>
 		</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"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage_objects.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage_objects.java
new file mode 100644
index 0000000000..25623f499e
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectXxxDomainEventPage_objects.java
@@ -0,0 +1,29 @@
+package demoapp.dom.domain.objects.DomainObject.xxxDomainEvent;
+
+import demoapp.dom._infra.values.ValueHolderRepository;
+import demoapp.dom.domain.objects.DomainObject.mixinMethod.DomainObjectMixinMethod;
+import demoapp.dom.domain.objects.DomainObject.mixinMethod.DomainObjectMixinMethodPage;
+import lombok.RequiredArgsConstructor;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.causeway.applib.annotation.Collection;
+import org.apache.causeway.applib.annotation.CollectionLayout;
+import org.apache.causeway.applib.annotation.DomainObject;
+
+@Collection()
+@CollectionLayout()
+@RequiredArgsConstructor
+public class DomainObjectXxxDomainEventPage_objects {
+
+    @SuppressWarnings("unused")
+    private final DomainObjectXxxDomainEventPage mixee;
+
+    public List<? extends DomainObjectXxxDomainEvent> coll() {   // <.>
+        return objectRepository.all();
+    }
+
+    @Inject ValueHolderRepository<String, ? extends DomainObjectXxxDomainEvent> objectRepository;
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa-description.adoc
new file mode 100644
index 0000000000..e2fa64e618
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa-description.adoc
@@ -0,0 +1,11 @@
+: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 [...]
+
+This domain class ...
+
+[source,java,indent=0]
+.DomainObjectXxxDomainEvent.java
+----
+include::../DomainObjectXxxDomainEvent.java[tags=class]
+----
+<.> ...
+
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa.java
similarity index 79%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa.java
index 06bd418edb..0e38144620 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpa.java
@@ -16,9 +16,9 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.domain.objects.DomainObject.mixinMethod.jpa;
+package demoapp.dom.domain.objects.DomainObject.xxxDomainEvent.jpa;
 
-import demoapp.dom.domain.objects.DomainObject.mixinMethod.DomainObjectMixinMethod;
+import demoapp.dom.domain.objects.DomainObject.xxxDomainEvent.DomainObjectXxxDomainEvent;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -35,20 +35,20 @@ import org.springframework.context.annotation.Profile;
 @Entity
 @Table(
     schema = "demo",
-    name = "DomainObjectMixinMethodJpaJpa"
+    name = "DomainObjectXxxDomainEventJpa"
 )
 @EntityListeners(CausewayEntityListener.class)
-@Named("demo.DomainObjectMixinMethodJpa")
+@Named("demo.DomainObjectXxxDomainEventJpa")
 @NoArgsConstructor
 //tag::class[]
 // ...
 @DomainObject(nature = Nature.ENTITY)
-public class DomainObjectMixinMethodJpa
-                extends DomainObjectMixinMethod {
+public class DomainObjectXxxDomainEventJpa
+                extends DomainObjectXxxDomainEvent {
     // ...
 //end::class[]
 
-    public DomainObjectMixinMethodJpa(String value) {
+    public DomainObjectXxxDomainEventJpa(String value) {
         setName(value);
     }
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpaEntities.java
similarity index 52%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpaEntities.java
index 3fde90dbc0..4a13c9638a 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/jpa/DomainObjectXxxDomainEventJpaEntities.java
@@ -16,30 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.domain.properties.Property.domainEvent.subscribers;
+package demoapp.dom.domain.objects.DomainObject.xxxDomainEvent.jpa;
 
-import javax.inject.Inject;
+import demoapp.dom._infra.values.ValueHolderRepository;
 
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Service;
 
-import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventVm;
-import lombok.RequiredArgsConstructor;
+@Profile("demo-jpa")
+@Service
+public class DomainObjectXxxDomainEventJpaEntities
+extends ValueHolderRepository<String, DomainObjectXxxDomainEventJpa> {
 
+    protected DomainObjectXxxDomainEventJpaEntities() {
+        super(DomainObjectXxxDomainEventJpa.class);
+    }
 
-//tag::class[]
-@Property()
-@PropertyLayout(fieldSetId = "contributed", sequence = "1")
-@RequiredArgsConstructor
-public class PropertyDomainEventVm_controlText {
-
-    private final PropertyDomainEventVm propertyDomainEventVm;
-
-    public PropertyDomainEventControlStrategy prop() {
-        return eventControlService.controlStrategy;
+    @Override
+    protected DomainObjectXxxDomainEventJpa newDetachedEntity(String value) {
+        return new DomainObjectXxxDomainEventJpa(value);
     }
 
-    @Inject
-    PropertyDomainEventControlService eventControlService;
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecycleEvent.java
similarity index 59%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecycleEvent.java
index 0931fcd7ae..6b846797ec 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecycleEvent.java
@@ -19,29 +19,27 @@
 package demoapp.dom.domain.objects.DomainObject.xxxLifecycleEvent;
 
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import demoapp.dom._infra.values.ValueHolder;
 
-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.DomainObject;
-import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 
-//tag::class[]
-@XmlRootElement(name = "root")
-@XmlType
-@XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.DomainObjectLifecyleEventsVm")
-@DomainObject(
-        nature = Nature.VIEW_MODEL)
-public class DomainObjectLifecyleEventsVm implements HasAsciiDocDescription {
+@SuppressWarnings("CdiManagedBeanInconsistencyInspection")
+public abstract class DomainObjectXxxLifecycleEvent
+        implements
+        HasAsciiDocDescription,
+        ValueHolder<String> {
+
+    @ObjectSupport
+    public String title() {
+        return getName();
+    }
 
-    @ObjectSupport public String title() {
-        return "DomainObject#...LifecyleEvent";
+    @Override
+    public String value() {
+        return getName();
     }
 
+    public abstract String getName();
+    public abstract void setName(String value);
+
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecycleEvent.layout.xml
similarity index 61%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.layout.xml
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecycleEvent.layout.xml
index 4337e06f1a..691a0c6d47 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecycleEvent.layout.xml
@@ -26,33 +26,54 @@
 
 	<bs3:row>
 		<bs3:col span="6">
-			<bs3:row>
-				<bs3:col span="12">
-					<cpt:fieldSet name="Annotated" id="annotation"/>
-					<cpt:fieldSet name="Contributed" id="contributed"/>
-					<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-				</bs3:col>
-			</bs3:row>
-			<bs3:row>
-				<bs3:col span="12">
-					<cpt:collection id="events"/>
-				</bs3:col>
-			</bs3:row>
+			<bs3:tabGroup>
+				<bs3:tab name="General">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="General" id="general" >
+								<cpt:property id="name"/>
+								<cpt:property id="originalName"/>
+								<cpt:property id="initialCharacter"/>
+							</cpt:fieldSet>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Metadata">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Metadata" id="metadata" >
+								<cpt:property id="id"/>
+								<cpt:property id="logicalTypeName"/>
+								<cpt:property id="version"/>
+							</cpt:fieldSet>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Other">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+			</bs3:tabGroup>
 		</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"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  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="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
-		</bs3:col>
-	</bs3:row>
+		</bs3:col>	</bs3:row>
 	<bs3:row>
 		<bs3:col span="12" unreferencedCollections="true"/>
 	</bs3:row>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage-description.adoc
similarity index 99%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm-description.adoc
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage-description.adoc
index 239f71b35c..de341e26e9 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxDomainEvent/DomainObjectDomainEventsVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage-description.adoc
@@ -1,5 +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 [...]
 
+
 == createdLifecycleEvent
 
 Indicates that the loading of the domain object should be posted to the org.apache.causeway.applib.services.eventbus.EventBusService event bus using a custom (subclass of) ObjectCreatedEvent .
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage.java
similarity index 89%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage.java
index 0931fcd7ae..c1d2d71ee6 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage.java
@@ -34,13 +34,13 @@ import org.apache.causeway.applib.annotation.ObjectSupport;
 @XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.DomainObjectLifecyleEventsVm")
+@Named("demo.DomainObjectXxxLifecyleEventPage")
 @DomainObject(
         nature = Nature.VIEW_MODEL)
-public class DomainObjectLifecyleEventsVm implements HasAsciiDocDescription {
+public class DomainObjectXxxLifecyleEventPage implements HasAsciiDocDescription {
 
     @ObjectSupport public String title() {
-        return "DomainObject#...LifecyleEvent";
+        return "DomainObject#xxxLifecyleEvent";
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage.layout.xml
similarity index 82%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm.layout.xml
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage.layout.xml
index b4f853de75..2ca31ba597 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectLifecyleEventsVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/DomainObjectXxxLifecyleEventPage.layout.xml
@@ -18,6 +18,7 @@
 	<bs3:row>
 		<bs3:col span="10" unreferencedActions="true">
 			<cpt:domainObject />
+			<cpt:action id="toggleEvents"/>
 		</bs3:col>
 		<bs3:col span="2">
 			<cpt:fieldSet name="" id="sources" />
@@ -27,16 +28,22 @@
 	<bs3:row>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+			<cpt:collection id="objects">
+				<cpt:action id="updateName"/>
+			</cpt:collection>
 		</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"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
+                <cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpa-description.adoc
new file mode 100644
index 0000000000..4b4548b0b1
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpa-description.adoc
@@ -0,0 +1,11 @@
+: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 [...]
+
+This domain class ...
+
+[source,java,indent=0]
+.DomainObjectXxxLifecycleEvent.java
+----
+include::../DomainObjectXxxLifecycleEvent.java[tags=class]
+----
+<.> ...
+
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpa.java
similarity index 78%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpa.java
index 06bd418edb..0822d283d9 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/mixinMethod/jpa/DomainObjectMixinMethodJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpa.java
@@ -16,9 +16,9 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.domain.objects.DomainObject.mixinMethod.jpa;
+package demoapp.dom.domain.objects.DomainObject.xxxLifecycleEvent.jpa;
 
-import demoapp.dom.domain.objects.DomainObject.mixinMethod.DomainObjectMixinMethod;
+import demoapp.dom.domain.objects.DomainObject.xxxLifecycleEvent.DomainObjectXxxLifecycleEvent;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -35,20 +35,20 @@ import org.springframework.context.annotation.Profile;
 @Entity
 @Table(
     schema = "demo",
-    name = "DomainObjectMixinMethodJpaJpa"
+    name = "DomainObjectXxxLifecycleEventJpa"
 )
 @EntityListeners(CausewayEntityListener.class)
-@Named("demo.DomainObjectMixinMethodJpa")
+@Named("demo.DomainObjectXxxLifecycleEventJpa")
 @NoArgsConstructor
 //tag::class[]
 // ...
 @DomainObject(nature = Nature.ENTITY)
-public class DomainObjectMixinMethodJpa
-                extends DomainObjectMixinMethod {
+public class DomainObjectXxxLifecycleEventJpa
+                extends DomainObjectXxxLifecycleEvent {
     // ...
 //end::class[]
 
-    public DomainObjectMixinMethodJpa(String value) {
+    public DomainObjectXxxLifecycleEventJpa(String value) {
         setName(value);
     }
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpaEntities.java
similarity index 52%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpaEntities.java
index 3fde90dbc0..15168b3fdf 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/xxxLifecycleEvent/jpa/DomainObjectXxxLifecycleEventJpaEntities.java
@@ -16,30 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.domain.properties.Property.domainEvent.subscribers;
+package demoapp.dom.domain.objects.DomainObject.xxxLifecycleEvent.jpa;
 
-import javax.inject.Inject;
+import demoapp.dom._infra.values.ValueHolderRepository;
 
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Service;
 
-import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventVm;
-import lombok.RequiredArgsConstructor;
+@Profile("demo-jpa")
+@Service
+public class DomainObjectXxxLifecycleEventJpaEntities
+extends ValueHolderRepository<String, DomainObjectXxxLifecycleEventJpa> {
 
+    protected DomainObjectXxxLifecycleEventJpaEntities() {
+        super(DomainObjectXxxLifecycleEventJpa.class);
+    }
 
-//tag::class[]
-@Property()
-@PropertyLayout(fieldSetId = "contributed", sequence = "1")
-@RequiredArgsConstructor
-public class PropertyDomainEventVm_controlText {
-
-    private final PropertyDomainEventVm propertyDomainEventVm;
-
-    public PropertyDomainEventControlStrategy prop() {
-        return eventControlService.controlStrategy;
+    @Override
+    protected DomainObjectXxxLifecycleEventJpa newDetachedEntity(String value) {
+        return new DomainObjectXxxLifecycleEventJpa(value);
     }
 
-    @Inject
-    PropertyDomainEventControlService eventControlService;
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java
index fbc7bda572..be391e6555 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java
@@ -34,10 +34,10 @@ import org.apache.causeway.applib.value.Clob;
 
 import demoapp.dom._infra.values.ValueHolderRepository;
 import demoapp.dom.domain.properties.Property.commandPublishing.PropertyCommandPublishingEntity;
-import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventVm;
-import demoapp.dom.domain.properties.Property.editing.PropertyEditingVm;
+import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventPage;
+import demoapp.dom.domain.properties.Property.editing.PropertyEditingPage;
 import demoapp.dom.domain.properties.Property.executionPublishing.PropertyExecutionPublishingEntity;
-import demoapp.dom.domain.properties.Property.fileAccept.PropertyFileAcceptVm;
+import demoapp.dom.domain.properties.Property.fileAccept.PropertyFileAcceptPage;
 import demoapp.dom.domain.properties.Property.hidden.PropertyHiddenVm;
 import demoapp.dom.domain.properties.Property.hidden.child.PropertyHiddenChildVm;
 import demoapp.dom.domain.properties.Property.maxLength.PropertyMaxLengthVm;
@@ -74,14 +74,14 @@ public class PropertyMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Class of the domain event emitted when interacting with the property")
-    public PropertyDomainEventVm domainEvent(){
-        return new PropertyDomainEventVm("change me");
+    public PropertyDomainEventPage domainEvent(){
+        return new PropertyDomainEventPage("change me");
     }
 
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-pencil-alt", describedAs = "Editable fields")
-    public PropertyEditingVm editing(){
-        val vm = new PropertyEditingVm();
+    public PropertyEditingPage editing(){
+        val vm = new PropertyEditingPage();
 
         vm.setPropertyUsingAnnotation("this property is editable");
         vm.setPropertyUsingMetaAnnotation("this property is also editable");
@@ -97,8 +97,8 @@ public class PropertyMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-file-upload", describedAs = "Length of text fields")
-    public PropertyFileAcceptVm fileAccept(){
-        val vm = new PropertyFileAcceptVm();
+    public PropertyFileAcceptPage fileAccept(){
+        val vm = new PropertyFileAcceptPage();
 
         setSampleBlob(".pdf", vm::setPdfPropertyUsingAnnotation);
         setSampleBlob(".pdf", vm::setPdfPropertyUsingMetaAnnotation);
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage-description.adoc
similarity index 98%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm-description.adoc
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage-description.adoc
index 62bf0fe850..9480532663 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage-description.adoc
@@ -24,8 +24,9 @@ The fallback domain event can be suppressed using the `causeway.applib.annotatio
 In the demo, the `PropertyDomainEventVm` class defines an editable property, "text", annotated with `domainEvent`:
 
 [source,java]
+.PropertyDomainEventPage.java
 ----
-include::PropertyDomainEventVm.java[tags=class]
+include::PropertyDomainEventPage.java[tags=class]
 ----
 <.> the event class to emit; genericised by the target type and the property type
 <.> indicates that the framework should emit this type
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage.java
similarity index 91%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage.java
index a6df16ac82..0001a53381 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage.java
@@ -41,17 +41,17 @@ import lombok.Setter;
 @XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.PropertyDomainEventVm")
+@Named("demo.PropertyDomainEventPage")
 @DomainObject(
     nature=Nature.VIEW_MODEL,
     editing = Editing.ENABLED)
 @NoArgsConstructor
 //tag::class[]
-public class PropertyDomainEventVm implements HasAsciiDocDescription {
+public class PropertyDomainEventPage implements HasAsciiDocDescription {
     // ...
 //end::class[]
 
-    public PropertyDomainEventVm(final String text) {
+    public PropertyDomainEventPage(final String text) {
         this.text = text;
     }
 
@@ -61,7 +61,7 @@ public class PropertyDomainEventVm implements HasAsciiDocDescription {
 //tag::class[]
 
     public static class TextDomainEvent                             // <.>
-        extends PropertyDomainEvent<PropertyDomainEventVm,String> {}
+        extends PropertyDomainEvent<PropertyDomainEventPage,String> {}
 
     @Property(
         domainEvent = TextDomainEvent.class                         // <.>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage.layout.xml
similarity index 100%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm.layout.xml
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventPage.layout.xml
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlService.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlService.java
index 8293107e7b..002403d689 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlService.java
@@ -26,7 +26,7 @@ import org.springframework.stereotype.Service;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.services.registry.ServiceRegistry;
 
-import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventVm;
+import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventPage;
 import lombok.RequiredArgsConstructor;
 
 // tag::class[]
@@ -39,8 +39,8 @@ class PropertyDomainEventControlService {
 
     PropertyDomainEventControlStrategy controlStrategy = PropertyDomainEventControlStrategy.DO_NOTHING;   // <.>
 
-    @EventListener(PropertyDomainEventVm.TextDomainEvent.class)     // <.>
-    public void on(PropertyDomainEventVm.TextDomainEvent ev) {
+    @EventListener(PropertyDomainEventPage.TextDomainEvent.class)     // <.>
+    public void on(PropertyDomainEventPage.TextDomainEvent ev) {
         controlStrategy.on(ev, serviceRegistry);
     }
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlStrategy.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlStrategy.java
index 495b147c34..d7e2520789 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlStrategy.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlStrategy.java
@@ -21,14 +21,14 @@ package demoapp.dom.domain.properties.Property.domainEvent.subscribers;
 import org.apache.causeway.applib.services.message.MessageService;
 import org.apache.causeway.applib.services.registry.ServiceRegistry;
 
-import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventVm;
+import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventPage;
 
 // tag::class[]
 enum PropertyDomainEventControlStrategy {
 
     DO_NOTHING{
         @Override
-        void on(PropertyDomainEventVm.TextDomainEvent ev
+        void on(PropertyDomainEventPage.TextDomainEvent ev
                 , ServiceRegistry serviceRegistry) {
         }
     },
@@ -38,7 +38,7 @@ enum PropertyDomainEventControlStrategy {
 // tag::hide[]
     HIDE {
         @Override
-        void on(PropertyDomainEventVm.TextDomainEvent ev
+        void on(PropertyDomainEventPage.TextDomainEvent ev
                 , ServiceRegistry serviceRegistry) {
             switch (ev.getEventPhase()) {
                 case HIDE:
@@ -51,7 +51,7 @@ enum PropertyDomainEventControlStrategy {
 // tag::disable[]
     DISABLE{
         @Override
-        void on(PropertyDomainEventVm.TextDomainEvent ev
+        void on(PropertyDomainEventPage.TextDomainEvent ev
                 , ServiceRegistry serviceRegistry) {
             switch (ev.getEventPhase()) {
                 case DISABLE:
@@ -65,7 +65,7 @@ enum PropertyDomainEventControlStrategy {
 // tag::validate[]
     VALIDATE_MUST_BE_UPPER_CASE{
         @Override
-        void on(PropertyDomainEventVm.TextDomainEvent ev
+        void on(PropertyDomainEventPage.TextDomainEvent ev
                 , ServiceRegistry serviceRegistry) {
             switch (ev.getEventPhase()) {
                 case VALIDATE:
@@ -82,7 +82,7 @@ enum PropertyDomainEventControlStrategy {
 // tag::executing[]
     EXECUTING_FORCE_UPPER_CASE{
         @Override
-        void on(PropertyDomainEventVm.TextDomainEvent ev
+        void on(PropertyDomainEventPage.TextDomainEvent ev
                 , ServiceRegistry serviceRegistry) {
 
             switch (ev.getEventPhase()) {
@@ -98,7 +98,7 @@ enum PropertyDomainEventControlStrategy {
 // tag::executed[]
     EXECUTED_ANNOUNCE{
         @Override
-        void on(PropertyDomainEventVm.TextDomainEvent ev
+        void on(PropertyDomainEventPage.TextDomainEvent ev
                 , ServiceRegistry serviceRegistry) {
             switch (ev.getEventPhase()) {
                 case EXECUTED:
@@ -118,7 +118,7 @@ enum PropertyDomainEventControlStrategy {
 
 // tag::class[]
     ;
-    abstract void on(PropertyDomainEventVm.TextDomainEvent ev
+    abstract void on(PropertyDomainEventPage.TextDomainEvent ev
             , ServiceRegistry serviceRegistry);
 }
 // end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java
index 3fde90dbc0..a74e47ae4d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlText.java
@@ -23,7 +23,7 @@ import javax.inject.Inject;
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
 
-import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventVm;
+import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventPage;
 import lombok.RequiredArgsConstructor;
 
 
@@ -33,7 +33,7 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class PropertyDomainEventVm_controlText {
 
-    private final PropertyDomainEventVm propertyDomainEventVm;
+    private final PropertyDomainEventPage propertyDomainEventVm;
 
     public PropertyDomainEventControlStrategy prop() {
         return eventControlService.controlStrategy;
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlTextEditing.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlTextEditing.java
index 6cfd77d8b2..2edcbbcac2 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlTextEditing.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventVm_controlTextEditing.java
@@ -27,7 +27,7 @@ import org.apache.causeway.applib.annotation.PromptStyle;
 import org.apache.causeway.applib.annotation.Redirect;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
-import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventVm;
+import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventPage;
 import lombok.RequiredArgsConstructor;
 
 //tag::class[]
@@ -43,9 +43,9 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class PropertyDomainEventVm_controlTextEditing {
 
-    private final PropertyDomainEventVm propertyDomainEventVm;
+    private final PropertyDomainEventPage propertyDomainEventVm;
 
-    @MemberSupport public PropertyDomainEventVm act(final PropertyDomainEventControlStrategy controlStrategy) {
+    @MemberSupport public PropertyDomainEventPage act(final PropertyDomainEventControlStrategy controlStrategy) {
         eventControlService.controlStrategy = controlStrategy;
         return propertyDomainEventVm;
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingPage-description.adoc
similarity index 89%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm-description.adoc
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingPage-description.adoc
index 02574e66ac..d10ccf210a 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingPage-description.adoc
@@ -15,8 +15,9 @@ Editing can also be specified at the class level.
 This will override any configured defaults, but just for the properties of that class:
 
 [source,java,indent=0]
+.PropertyEditingPage.java
 ----
-include::PropertyEditingVm.java[tags=class]
+include::PropertyEditingPage.java[tags=class]
 ----
 
 The property-level element can, in turn, overrides the configured or class-level default.
@@ -29,8 +30,9 @@ The `editing` element can be specified explicitly using an annotation:
 * for properties, using `@Property#editing()`:
 +
 [source,java,indent=0]
+.PropertyEditingPage.java
 ----
-include::PropertyEditingVm.java[tags=annotation]
+include::PropertyEditingPage.java[tags=annotation]
 ----
 <.> explicitly specifies that the property is editable
 
@@ -52,8 +54,9 @@ include::EditingEnabledMetaAnnotation.java[tags=class]
 * and can be applied to a property:
 +
 [source,java,indent=0]
+.PropertyEditingPage.java
 ----
-include::PropertyEditingVm.java[tags=meta-annotated]
+include::PropertyEditingPage.java[tags=meta-annotated]
 ----
 <.> semantic is inherited from the meta-annotation
 
@@ -66,8 +69,9 @@ The meta-annotation can itself be overridden:
 * in a property:
 +
 [source,java,indent=0]
+.PropertyEditingPage.java
 ----
-include::PropertyEditingVm.java[tags=meta-annotated-overridden]
+include::PropertyEditingPage.java[tags=meta-annotated-overridden]
 ----
 <.> semantic from meta-annotation ...
 <.> \... is overridden by the `@Property` annotation
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingPage.java
similarity index 96%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingPage.java
index ef23de68f2..f0011ca985 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingPage.java
@@ -40,12 +40,12 @@ import lombok.Setter;
 @XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.PropertyEditingVm")
+@Named("demo.PropertyEditingPage")
 @DomainObject(
         nature=Nature.VIEW_MODEL,
         editing = Editing.DISABLED              // <.>
 )
-public class PropertyEditingVm implements HasAsciiDocDescription {
+public class PropertyEditingPage implements HasAsciiDocDescription {
     // ...
 //end::class[]
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingPage.layout.xml
similarity index 100%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm.layout.xml
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingPage.layout.xml
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage-description.adoc
similarity index 76%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm-description.adoc
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage-description.adoc
index 3702508843..7f571aad4b 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage-description.adoc
@@ -16,16 +16,18 @@ The `fileAccept` element can be specified explicitly using an annotation (on a `
 * for properties, using `@Property#fileAccept()`:
 +
 [source,java,indent=0]
+.PropertyFileAcceptPage.java
 ----
-include::PropertyFileAcceptVm.java[tags=annotation]
+include::PropertyFileAcceptPage.java[tags=annotation]
 ----
 <.> explicitly specifies that only PDFs can be accepted for the property
 
 * for parameters, using `@Parameter#fileAccept()`:
 +
 [source,java,indent=0]
+.PropertyFileAcceptPage_updateWithParameterLayout.java
 ----
-include::PropertyFileAcceptVm_updateWithParameterLayout.java[tags=annotation]
+include::PropertyFileAcceptPage_updateWithParameterLayout.java[tags=annotation]
 ----
 <.> explicitly specifies that only PDFs can be accepted for the parameter
 
@@ -34,16 +36,18 @@ This also works for ``Clob``s:
 * for properties, using `@Property#fileAccept()`:
 +
 [source,java,indent=0]
+.PropertyFileAcceptPage.java
 ----
-include::PropertyFileAcceptVm.java[tags=annotation-clob]
+include::PropertyFileAcceptPage.java[tags=annotation-clob]
 ----
 <.> explicitly specifies that only PDFs can be accepted for the property
 
 * for parameters, using `@Parameter#fileAccept()`:
 +
 [source,java,indent=0]
+.PropertyFileAcceptPage_updateClobWithParameterLayout.java
 ----
-include::PropertyFileAcceptVm_updateClobWithParameterLayout.java[tags=annotation]
+include::PropertyFileAcceptPage_updateClobWithParameterLayout.java[tags=annotation]
 ----
 <.> explicitly specifies that only PDFs can be accepted for the parameter
 
@@ -67,16 +71,18 @@ include::FileAcceptPdfMetaAnnotation.java[tags=class]
 * and can be applied to a property:
 +
 [source,java,indent=0]
+.PropertyFileAcceptPage.java
 ----
-include::PropertyFileAcceptVm.java[tags=meta-annotated]
+include::PropertyFileAcceptPage.java[tags=meta-annotated]
 ----
 <.> semantic is inherited from the meta-annotation
 
 * or can be applied to a parameter:
 +
 [source,java,indent=0]
+.PropertyFileAcceptPage_updateWithMetaAnnotation.java
 ----
-include::PropertyFileAcceptVm_updateWithMetaAnnotation.java[tags=meta-annotation]
+include::PropertyFileAcceptPage_updateWithMetaAnnotation.java[tags=meta-annotation]
 ----
 <.> semantic is inherited from the meta-annotation
 
@@ -88,8 +94,9 @@ The meta-annotation can itself be overridden:
 * in a property:
 +
 [source,java,indent=0]
+.PropertyFileAcceptPage.java
 ----
-include::PropertyFileAcceptVm.java[tags=meta-annotated-overridden]
+include::PropertyFileAcceptPage.java[tags=meta-annotated-overridden]
 ----
 <.> semantic from meta-annotation ...
 <.> \... is overridden by the `@Property` annotation
@@ -97,8 +104,9 @@ include::PropertyFileAcceptVm.java[tags=meta-annotated-overridden]
 * or a parameter:
 +
 [source,java,indent=0]
+.PropertyFileAcceptPage_updateWithMetaAnnotationOverridden.java
 ----
-include::PropertyFileAcceptVm_updateWithMetaAnnotationOverridden.java[tags=meta-annotation-overridden]
+include::PropertyFileAcceptPage_updateWithMetaAnnotationOverridden.java[tags=meta-annotation-overridden]
 ----
 <.> semantic from meta-annotation ...
 <.> \... is overridden by the `@Parameter` annotation
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage.java
similarity index 97%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage.java
index d9f179fee9..e7a2287b8f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage.java
@@ -42,11 +42,11 @@ import lombok.Setter;
 @XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.PropertyFileAcceptVm")
+@Named("demo.PropertyFileAcceptPage")
 @DomainObject(
         nature=Nature.VIEW_MODEL,
         editing = Editing.ENABLED)
-public class PropertyFileAcceptVm implements HasAsciiDocDescription {
+public class PropertyFileAcceptPage implements HasAsciiDocDescription {
 
     @ObjectSupport public String title() {
         return "Property#fileAccept";
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage.layout.xml
similarity index 100%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm.layout.xml
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage.layout.xml
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateClobWithParameterLayout.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateClobWithParameterLayout.java
similarity index 92%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateClobWithParameterLayout.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateClobWithParameterLayout.java
index b2abb69b44..70e5fd2072 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateClobWithParameterLayout.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateClobWithParameterLayout.java
@@ -36,12 +36,12 @@ import lombok.RequiredArgsConstructor;
         associateWith = "txtPropertyUsingAnnotation"
         , sequence = "1")
 @RequiredArgsConstructor
-public class PropertyFileAcceptVm_updateClobWithParameterLayout {
+public class PropertyFileAcceptPage_updateClobWithParameterLayout {
 
-    private final PropertyFileAcceptVm propertyFileAcceptVm;
+    private final PropertyFileAcceptPage propertyFileAcceptVm;
 
 //tag::annotation[]
-    @MemberSupport public PropertyFileAcceptVm act(
+    @MemberSupport public PropertyFileAcceptPage act(
             @Parameter(
                 fileAccept = ".txt"                     // <.>
                 , optionality = Optionality.OPTIONAL
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateWithMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateWithMetaAnnotation.java
similarity index 92%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateWithMetaAnnotation.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateWithMetaAnnotation.java
index acef24f07e..71bec148e2 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateWithMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateWithMetaAnnotation.java
@@ -35,12 +35,12 @@ import lombok.RequiredArgsConstructor;
         associateWith = "pdfPropertyUsingMetaAnnotation"
         , sequence = "1")
 @RequiredArgsConstructor
-public class PropertyFileAcceptVm_updateWithMetaAnnotation {
+public class PropertyFileAcceptPage_updateWithMetaAnnotation {
 
-    private final PropertyFileAcceptVm propertyFileAcceptVm;
+    private final PropertyFileAcceptPage propertyFileAcceptVm;
 
 //tag::meta-annotation[]
-    @MemberSupport public PropertyFileAcceptVm act(
+    @MemberSupport public PropertyFileAcceptPage act(
             @FileAcceptPdfMetaAnnotation                            // <.>
             @Parameter()
             @ParameterLayout(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateWithMetaAnnotationOverridden.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateWithMetaAnnotationOverridden.java
similarity index 92%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateWithMetaAnnotationOverridden.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateWithMetaAnnotationOverridden.java
index c41d72c546..78e73fac37 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateWithMetaAnnotationOverridden.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateWithMetaAnnotationOverridden.java
@@ -35,12 +35,12 @@ import lombok.RequiredArgsConstructor;
         associateWith = "docxPropertyUsingMetaAnnotationButOverridden"
         , sequence = "1")
 @RequiredArgsConstructor
-public class PropertyFileAcceptVm_updateWithMetaAnnotationOverridden {
+public class PropertyFileAcceptPage_updateWithMetaAnnotationOverridden {
 
-    private final PropertyFileAcceptVm propertyFileAcceptVm;
+    private final PropertyFileAcceptPage propertyFileAcceptVm;
 
 //tag::meta-annotation-overridden[]
-    @MemberSupport public PropertyFileAcceptVm act(
+    @MemberSupport public PropertyFileAcceptPage act(
             @FileAcceptPdfMetaAnnotation                    // <.>
             @Parameter(
                 fileAccept = ".docx"                        // <.>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateWithParameterLayout.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateWithParameterLayout.java
similarity index 92%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateWithParameterLayout.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateWithParameterLayout.java
index 8a952651ac..9f1f4e22a4 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm_updateWithParameterLayout.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptPage_updateWithParameterLayout.java
@@ -36,12 +36,12 @@ import lombok.RequiredArgsConstructor;
     associateWith = "pdfPropertyUsingAnnotation"
     , sequence = "1")
 @RequiredArgsConstructor
-public class PropertyFileAcceptVm_updateWithParameterLayout {
+public class PropertyFileAcceptPage_updateWithParameterLayout {
 
-    private final PropertyFileAcceptVm propertyFileAcceptVm;
+    private final PropertyFileAcceptPage propertyFileAcceptVm;
 
 //tag::annotation[]
-    @MemberSupport public PropertyFileAcceptVm act(
+    @MemberSupport public PropertyFileAcceptPage act(
             @Parameter(
                 fileAccept = ".pdf"                     // <.>
                 , optionality = Optionality.OPTIONAL