You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/03/05 09:55:34 UTC

[isis] branch ISIS-2444 updated (75cd4f0 -> 102ee96)

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

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


 discard 75cd4f0  ISIS-2566: renames uniqueId and transactionId to interactionId where appropriate
 discard 9ef3c10  ISIS-2444 : regen index
 discard f35366d  ISIS-439: fixes further compile issues
 discard e11d395  ISIS-2564: rationalizing mixee interfaces
 discard 9a42de5  ISIS-2444: event docs
 discard 6c0ae8e  ISIS-439: removes disabled interaction advisor reponsibility from CollectionDomainEventFacet (dead code)
 discard ee97093  ISIS-2444: more on domain event docs
 discard f37bfd2  ISIS-439: further work removing dead code re: mutable collections
 discard 58c921a  ISIS-439: further work removing dead code re: mutable collections
 discard fb81473  ISIS-439: further work removing dead code re: mutable collections
 discard a4512aa  ISIS-2444: cleaning up domain event docs
     add 5ab396e  ISIS-2553: promotes ApplicationFeature to applib (new interface)
     add 5aacfb7  ISIS-2553: relocate constants that belong to secman
     add 3611617  ISIS-2553: ApplicationFeatureDefault: simplify and improve formal api
     new bd04df8  ISIS-2444: cleaning up domain event docs
     new 1bba29d  ISIS-439: further work removing dead code re: mutable collections
     new 75bb549  ISIS-439: further work removing dead code re: mutable collections
     new a38e35b  ISIS-439: further work removing dead code re: mutable collections
     new 09c4072  ISIS-2444: more on domain event docs
     new 0ac313b  ISIS-439: removes disabled interaction advisor reponsibility from CollectionDomainEventFacet (dead code)
     new 9b307c7  ISIS-2444: event docs
     new b2917f0  ISIS-2564: rationalizing mixee interfaces
     new 8934fb2  ISIS-439: fixes further compile issues
     new 434ef2f  ISIS-2444 : regen index
     new 102ee96  ISIS-2566: renames uniqueId and transactionId to interactionId where appropriate

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (75cd4f0)
            \
             N -- N -- N   refs/heads/ISIS-2444 (102ee96)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 11 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:
 ...ionFeatureSort.java => ApplicationFeature.java} | 63 ++++++++++---------
 ...Feature.java => ApplicationFeatureDefault.java} | 71 ++++++++++++----------
 .../appfeat/ApplicationFeatureFactory.java         |  3 +-
 .../ApplicationFeatureRepositoryDefault.java       | 20 ++----
 .../metamodel/services/appfeat/_Predicates.java    |  1 +
 .../valuetypes/ValueTypeProviderForBuiltin.java    |  4 +-
 .../services/appfeat/ApplicationFeatureIdTest.java |  1 +
 .../ApplicationFeatureRepositoryDefaultTest.java   | 33 ++++++----
 .../services/appfeat/ApplicationFeatureTest.java   | 56 ++++++++++-------
 .../api/permission/ApplicationPermission.java      |  2 +-
 .../api/permission/ApplicationPermissionMode.java  |  2 +-
 .../api/permission/ApplicationPermissionRule.java  |  2 +-
 .../dom/feature/ApplicationFeatureConstants.java   | 14 ++---
 .../dom/feature/ApplicationFeatureViewModel.java   | 21 ++++---
 .../dom/feature/ApplicationFeatureViewModels.java  |  4 +-
 .../dom/role/ApplicationRole_addPermission.java    |  2 +-
 .../user/ApplicationUser_filterPermissions.java    |  7 ++-
 .../dom/user/ApplicationUser_permissions.java      |  2 +-
 .../model/dom/user/UserPermissionViewModel.java    |  2 +-
 .../jdo/dom/permission/ApplicationPermission.java  |  4 +-
 .../ApplicationPermissionRepository.java           |  2 +-
 .../jpa/dom/permission/ApplicationPermission.java  |  4 +-
 .../ApplicationPermissionRepository.java           |  2 +-
 23 files changed, 175 insertions(+), 147 deletions(-)
 copy api/applib/src/main/java/org/apache/isis/applib/services/appfeat/{ApplicationFeatureSort.java => ApplicationFeature.java} (50%)
 rename core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/{ApplicationFeature.java => ApplicationFeatureDefault.java} (80%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacet.java => extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureConstants.java (70%)


[isis] 11/11: ISIS-2566: renames uniqueId and transactionId to interactionId where appropriate

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

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

commit 102ee96fb30223dc6dac97b9b7d7ac9886d2d917
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Mar 5 09:25:35 2021 +0000

    ISIS-2566: renames uniqueId and transactionId to interactionId where appropriate
    
    mostly in the DTOs, also in Command and CommandJdo
---
 .../modules/_overview/pages/about.adoc             | 80 +++++++++----------
 .../hooks/GridService_020-examples-and-usage.adoc  |  2 +-
 .../hooks/Execution_020-examples-and-usage.adoc    |  2 +-
 .../hooks/JaxbService_020-examples-and-usage.adoc  |  2 +-
 .../LayoutService_020-examples-and-usage.adoc      |  2 +-
 ...ExecutionSubscriber_020-examples-and-usage.adoc |  2 +-
 .../{ => queryresultscache}/MethodReferences.adoc  |  0
 .../commons/pages/index/having/HasUniqueId.adoc    | 25 ------
 .../commons/pages/index/having/HasUpdatedAt.adoc   | 13 ---
 .../commons/pages/index/having/HasUpdatedBy.adoc   | 13 ---
 .../commons/pages/index/having/HasUsername.adoc    | 29 -------
 .../impl/mixins/HasUniqueId_command.adoc           | 32 --------
 .../isis/applib/services/command/Command.java      | 18 ++---
 .../{ => queryresultscache}/MethodReferences.java  | 32 ++++----
 .../queryresultscache/QueryResultsCache.java       |  2 -
 .../applib/util/schema/InteractionDtoUtils.java    |  8 +-
 .../apache/isis/applib/util/schema/Roundtrip.java  | 86 ++++++++++----------
 .../org/apache/isis/schema/chg/chg-2.0.xsd         |  4 +-
 .../org/apache/isis/schema/cmd/cmd-2.0.xsd         |  4 +-
 .../org/apache/isis/schema/ixn/ixn-2.0.xsd         |  2 +-
 .../core/interaction/session/IsisInteraction.java  |  4 +-
 .../services/command/CommandDtoFactory.java        |  4 +-
 .../specloader/specimpl/ObjectActionDefault.java   | 92 +++++++++++-----------
 .../specimpl/OneToOneAssociationDefault.java       | 28 +++----
 ...notationFacetFactoryTest_commandPublishing.java |  2 +-
 ...tationFacetFactoryTest_executionPublishing.java |  2 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |  2 +-
 .../command/CommandDtoFactoryDefault.java          | 12 +--
 .../command/CommandExecutorServiceDefault.java     |  2 +-
 .../QueryResultsCacheDefault.java                  | 12 +--
 .../wrapper/WrapperFactoryDefault.java             |  6 +-
 .../changetracking/ChangingEntitiesFactory.java    | 12 +--
 .../commandlog/impl/CommandSubscriberForJdo.java   |  4 +-
 .../extensions/commandlog/impl/jdo/CommandJdo.java | 26 +++---
 .../impl/jdo/CommandJdo.layout.fallback.xml        |  2 +-
 .../commandlog/impl/jdo/CommandJdoRepository.java  | 28 +++----
 ..._command.java => HasInteractionId_command.java} | 12 +--
 .../commandlog/impl/ui/CommandServiceMenu.java     |  2 +-
 .../primary/restapi/CommandRetrievalService.java   | 16 ++--
 .../primary/ui/CommandReplayOnPrimaryService.java  | 30 +++----
 .../secondary/fetch/CommandFetcher.java            |  8 +-
 .../adoc/modules/audit-trail/pages/about.adoc      |  2 +-
 .../viewer/javafx/ui/main/UiBuilderFx.java         | 20 ++---
 .../publishing/jdo/JdoCommandPublishingTest.java   | 28 +++----
 44 files changed, 300 insertions(+), 414 deletions(-)

diff --git a/antora/components/refguide-index/modules/_overview/pages/about.adoc b/antora/components/refguide-index/modules/_overview/pages/about.adoc
index 333266c..b643bad 100644
--- a/antora/components/refguide-index/modules/_overview/pages/about.adoc
+++ b/antora/components/refguide-index/modules/_overview/pages/about.adoc
@@ -33,7 +33,7 @@ package "App\n[Software System]" {
 .Projects/Modules (App)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Starter Parent
 [source,yaml]
@@ -126,7 +126,7 @@ package "Mavendeps\n[Software System]" {
 .Projects/Modules (Mavendeps)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Maven Deps
 [source,yaml]
@@ -408,7 +408,7 @@ package "Testing\n[Software System]" {
 .Projects/Modules (Testing)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Testing
 [source,yaml]
@@ -767,7 +767,7 @@ package "Examples\n[Software System]" {
 .Projects/Modules (Examples)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Demo - Parent
 [source,yaml]
@@ -1134,7 +1134,7 @@ package "Root\n[Software System]" {
 .Projects/Modules (Root)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis (Aggregator)
 [source,yaml]
@@ -1213,7 +1213,7 @@ package "Commons\n[Software System]" {
 .Projects/Modules (Commons)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Commons
 [source,yaml]
@@ -1369,7 +1369,7 @@ package "Core\n[Software System]" {
 .Projects/Modules (Core)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Core
 [source,yaml]
@@ -1901,7 +1901,7 @@ package "JDO\n[Software System]" {
 .Projects/Modules (JDO)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Persistence - JDO
 [source,yaml]
@@ -2125,7 +2125,7 @@ package "JPA\n[Software System]" {
 .Projects/Modules (JPA)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Persistence - JPA
 [source,yaml]
@@ -2258,7 +2258,7 @@ package "Security\n[Software System]" {
 .Projects/Modules (Security)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Security - Spring
 [source,yaml]
@@ -2319,7 +2319,7 @@ package "Bypass\n[Software System]" {
 .Projects/Modules (Bypass)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Security - Bypass
 [source,yaml]
@@ -2376,7 +2376,7 @@ package "Keycloak\n[Software System]" {
 .Projects/Modules (Keycloak)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Security - Keycloak
 [source,yaml]
@@ -2438,7 +2438,7 @@ package "Shiro\n[Software System]" {
 .Projects/Modules (Shiro)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Security - Shiro
 [source,yaml]
@@ -2503,7 +2503,7 @@ package "Viewer\n[Software System]" {
 .Projects/Modules (Viewer)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Viewer - Common Model
 [source,yaml]
@@ -2594,7 +2594,7 @@ package "Restful Objects\n[Software System]" {
 .Projects/Modules (Restful Objects)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Viewer - RO
 [source,yaml]
@@ -2802,7 +2802,7 @@ package "Wicket\n[Software System]" {
 .Projects/Modules (Wicket)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Viewer - Wicket
 [source,yaml]
@@ -2987,7 +2987,7 @@ package "Valuetypes\n[Software System]" {
 .Projects/Modules (Valuetypes)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Value types
 [source,yaml]
@@ -3173,7 +3173,7 @@ package "Asciidoc\n[Software System]" {
 .Projects/Modules (Asciidoc)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Val - Asciidoctor (parent)
 [source,yaml]
@@ -3401,7 +3401,7 @@ package "Markdown\n[Software System]" {
 .Projects/Modules (Markdown)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Val - Markdown (parent)
 [source,yaml]
@@ -3558,7 +3558,7 @@ package "Mappings\n[Software System]" {
 .Projects/Modules (Mappings)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Mappings
 [source,yaml]
@@ -3621,7 +3621,7 @@ package "JAX-RS Client Library\n[Software System]" {
 .Projects/Modules (JAX-RS Client Library)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Map - JaxRS Client (parent)
 [source,yaml]
@@ -3703,7 +3703,7 @@ package "REST Client\n[Software System]" {
 .Projects/Modules (REST Client)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Ext - REST Client (parent)
 [source,yaml]
@@ -3921,7 +3921,7 @@ package "Extensions\n[Software System]" {
 .Projects/Modules (Extensions)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Extensions
 [source,yaml]
@@ -4390,7 +4390,7 @@ package "Core: Command Log\n[Software System]" {
 .Projects/Modules (Core: Command Log)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Ext - Command Log
 [source,yaml]
@@ -4432,7 +4432,7 @@ org.apache.isis.testing:isis-testing-unittestsupport-applib:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:extensions:index/commandlog/impl/CommandSubscriberForJdo.adoc[CommandSubscriberForJdo], xref:refguide:extensions:index/commandlog/impl/IsisModuleExtCommandLogImpl.adoc[IsisModuleExtCommandLogImpl], xref:refguide:extensions:index/commandlog/impl/mixins/HasUniqueId_command.adoc[HasUniqueId_command], xref:refguide:extensions:index/commandlog/impl/mixins/HasUsername_recentCommandsByUser.adoc[HasUsername_recentCommandsByUser], xref:refguide:extensions:index/commandlog/impl/ui/Co [...]
+xref:refguide:extensions:index/commandlog/impl/CommandSubscriberForJdo.adoc[CommandSubscriberForJdo], xref:refguide:extensions:index/commandlog/impl/IsisModuleExtCommandLogImpl.adoc[IsisModuleExtCommandLogImpl], xref:refguide:extensions:index/commandlog/impl/mixins/HasInteractionId_command.adoc[HasUniqueId_command], xref:refguide:extensions:index/commandlog/impl/mixins/HasUsername_recentCommandsByUser.adoc[HasUsername_recentCommandsByUser], xref:refguide:extensions:index/commandlog/impl/ [...]
 ****
 |===
 
@@ -4480,7 +4480,7 @@ package "Core: Command Replay\n[Software System]" {
 .Projects/Modules (Core: Command Replay)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Ext - Command Replay
 [source,yaml]
@@ -4594,7 +4594,7 @@ package "Core: Model Annotation\n[Software System]" {
 .Projects/Modules (Core: Model Annotation)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Ext - @Model
 [source,yaml]
@@ -4661,7 +4661,7 @@ package "Core: Quartz\n[Software System]" {
 .Projects/Modules (Core: Quartz)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Ext - Quartz
 [source,yaml]
@@ -4807,7 +4807,7 @@ package "Subdomains\n[Software System]" {
 .Projects/Modules (Subdomains)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Subdomains
 [source,yaml]
@@ -4987,7 +4987,7 @@ package "Base\n[Software System]" {
 .Projects/Modules (Base)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Sub - Base (parent)
 [source,yaml]
@@ -5085,7 +5085,7 @@ package "Excel\n[Software System]" {
 .Projects/Modules (Excel)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Sub - Excel (parent)
 [source,yaml]
@@ -5221,7 +5221,7 @@ package "Spring\n[Software System]" {
 .Projects/Modules (Spring)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Sub - Spring (parent)
 [source,yaml]
@@ -5295,7 +5295,7 @@ package "XDocReport\n[Software System]" {
 .Projects/Modules (XDocReport)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Sub - XdocReport (parent)
 [source,yaml]
@@ -5410,7 +5410,7 @@ package "Tooling\n[Software System]" {
 .Projects/Modules (Tooling)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis - Tooling
 [source,yaml]
@@ -5589,7 +5589,7 @@ package "Regression Tests\n[Software System]" {
 .Projects/Modules (Regression Tests)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis - Regression Tests
 [source,yaml]
@@ -5691,7 +5691,7 @@ package "Incubator\n[Software System]" {
 .Projects/Modules (Incubator)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Incubator
 [source,yaml]
@@ -5739,7 +5739,7 @@ package "Kroviz Client\n[Software System]" {
 .Projects/Modules (Kroviz Client)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Inc - Client kroViz
 [source,yaml]
@@ -5803,7 +5803,7 @@ package "JavaFX Viewer\n[Software System]" {
 .Projects/Modules (JavaFX Viewer)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Inc - Viewer JavaFX
 [source,yaml]
@@ -5913,7 +5913,7 @@ package "Vaadin Viewer\n[Software System]" {
 .Projects/Modules (Vaadin Viewer)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Inc - Viewer Vaadin
 [source,yaml]
@@ -6053,7 +6053,7 @@ package "Legacy\n[Software System]" {
 .Projects/Modules (Legacy)
 [cols="3a,5a", options="header"]
 |===
-|Coordinates |Description 
+|Coordinates |Description
 
 |Apache Isis Legacy
 [source,yaml]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/grid/hooks/GridService_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/grid/hooks/GridService_020-examples-and-usage.adoc
index fe3260e..88bb8a2 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/grid/hooks/GridService_020-examples-and-usage.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/grid/hooks/GridService_020-examples-and-usage.adoc
@@ -12,7 +12,7 @@ Dynamic reloading is disabled in production mode.
 
 == See also
 
-This service is called by xref:refguide:applib:index/services/layout/LayoutService.adoc[LayoutService], exposed in the UI through `LayoutServiceMenu` (to download the layout XML as a zip file for all domain objects) and the xref:applib-classes:mixins.adoc#java-lang-object[downloadLayoutXml()] mixin (to download the layout XML for a single domain
+This service is called by xref:refguide:applib:index/services/layout/LayoutService.adoc[LayoutService], exposed in the UI through `LayoutServiceMenu` (to download the layout XML as a zip file for all domain objects) and the xref:applib-classes:mixees-and-mixins.adoc#java-lang-object[downloadLayoutXml()] mixin (to download the layout XML for a single domain
 object).
 
 This service delegates to:
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/iactn/hooks/Execution_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/hooks/Execution_020-examples-and-usage.adoc
index 69233b7..413a085 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/iactn/hooks/Execution_020-examples-and-usage.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/hooks/Execution_020-examples-and-usage.adoc
@@ -12,7 +12,7 @@ This supports several use cases:
 
 ** they enable profiling of the running application (which actions are invoked then most often, what is their response time)
 
-** if auditing is configured (using xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber]), they provide better audit information, since the parent xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] captures the 'cause' of an interaction and can be correlated to the audit records (the "effect" of the interaction) by way of the xref:applib-classes:mixins.adoc[uniqueId] that both share.
+** if auditing is configured (using xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber]), they provide better audit information, since the parent xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] captures the 'cause' of an interaction and can be correlated to the audit records (the "effect" of the interaction) by way of the xref:applib-classes:mixees-and-mixins.adoc[interactionId] that both share.
 
 
 == See also
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/jaxb/hooks/JaxbService_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/jaxb/hooks/JaxbService_020-examples-and-usage.adoc
index d4bc8df..69f7b68 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/jaxb/hooks/JaxbService_020-examples-and-usage.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/jaxb/hooks/JaxbService_020-examples-and-usage.adoc
@@ -9,5 +9,5 @@
 This service is provided as a convenience for applications, but is also used internally by the framework to marshall xref:refguide:applib-ant:XmlRootElement.adoc[@XmlRootElement]-annotated
 xref:userguide:fun:overview.adoc#view-models[view models].
 
-The functionality to download XML and XSD schemas is also exposed in the UI through mixins of the xref:applib-classes:mixins.adoc#Dto[Dto] interface.
+The functionality to download XML and XSD schemas is also exposed in the UI through mixins of the xref:applib-classes:mixees-and-mixins.adoc#Dto[Dto] interface.
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/layout/hooks/LayoutService_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/layout/hooks/LayoutService_020-examples-and-usage.adoc
index b6638cc..02924fb 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/layout/hooks/LayoutService_020-examples-and-usage.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/layout/hooks/LayoutService_020-examples-and-usage.adoc
@@ -7,7 +7,7 @@
 
 The service's functionality is exposed in the UI through a mixin (per object) and a menu action (for all objects):
 
-* the xref:applib-classes:mixins.adoc#java-lang-object[Object] mixin provides the ability to download the XML layout for any domain object (entity or view model).
+* the xref:applib-classes:mixees-and-mixins.adoc#java-lang-object[Object] mixin provides the ability to download the XML layout for any domain object (entity or view model).
 
 * the `LayoutServiceMenu` provides the ability to download all XML layouts as a single ZIP file (in any of the three styles).
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/publishing/spi/hooks/ExecutionSubscriber_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/publishing/spi/hooks/ExecutionSubscriber_020-examples-and-usage.adoc
index a8f800b..b266803 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/publishing/spi/hooks/ExecutionSubscriber_020-examples-and-usage.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/publishing/spi/hooks/ExecutionSubscriber_020-examples-and-usage.adoc
@@ -25,7 +25,7 @@ See also:
 +
 The xref:refguide:applib:index/services/command/Command.adoc[Command]  captures the __cause__ of an interaction (an action was invoked, a property was edited), while the xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber] captures the __effect__ of that interaction in terms of events, while the xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber] captures the effect of the inter [...]
 
-All of these services collaborate implicitly by way of the xref:refguide:commons:index//having/HasUniqueId.adoc[HasUniqueId] interface.
+All of these services collaborate implicitly by way of the xref:refguide:applib:index/mixins/system/HasInteractionId.adoc[HasInteractionId] interface.
 
 In contrast:
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/MethodReferences.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/queryresultscache/MethodReferences.adoc
similarity index 100%
rename from antora/components/refguide-index/modules/applib/pages/index/services/MethodReferences.adoc
rename to antora/components/refguide-index/modules/applib/pages/index/services/queryresultscache/MethodReferences.adoc
diff --git a/antora/components/refguide-index/modules/commons/pages/index/having/HasUniqueId.adoc b/antora/components/refguide-index/modules/commons/pages/index/having/HasUniqueId.adoc
deleted file mode 100644
index 774e8f5..0000000
--- a/antora/components/refguide-index/modules/commons/pages/index/having/HasUniqueId.adoc
+++ /dev/null
@@ -1,25 +0,0 @@
-= HasUniqueId _(interface)_
-: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 [...]
-
-== API
-
-[source,java]
-.HasUniqueId.java
-----
-interface HasUniqueId {
-  UUID getUniqueId()     // <.>
-}
-----
-
-<.> xref:#getUniqueId__[getUniqueId()]
-+
---
-A unique identifier (a GUID).
---
-
-== Members
-
-[#getUniqueId__]
-=== getUniqueId()
-
-A unique identifier (a GUID).
diff --git a/antora/components/refguide-index/modules/commons/pages/index/having/HasUpdatedAt.adoc b/antora/components/refguide-index/modules/commons/pages/index/having/HasUpdatedAt.adoc
deleted file mode 100644
index 6b1641d..0000000
--- a/antora/components/refguide-index/modules/commons/pages/index/having/HasUpdatedAt.adoc
+++ /dev/null
@@ -1,13 +0,0 @@
-= HasUpdatedAt _(interface)_
-: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 [...]
-
-== API
-
-[source,java]
-.HasUpdatedAt.java
-----
-interface HasUpdatedAt {
-  void setUpdatedAt(java.sql.Timestamp updatedAt)
-}
-----
-
diff --git a/antora/components/refguide-index/modules/commons/pages/index/having/HasUpdatedBy.adoc b/antora/components/refguide-index/modules/commons/pages/index/having/HasUpdatedBy.adoc
deleted file mode 100644
index 6356b9b..0000000
--- a/antora/components/refguide-index/modules/commons/pages/index/having/HasUpdatedBy.adoc
+++ /dev/null
@@ -1,13 +0,0 @@
-= HasUpdatedBy _(interface)_
-: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 [...]
-
-== API
-
-[source,java]
-.HasUpdatedBy.java
-----
-interface HasUpdatedBy {
-  void setUpdatedBy(String updatedBy)
-}
-----
-
diff --git a/antora/components/refguide-index/modules/commons/pages/index/having/HasUsername.adoc b/antora/components/refguide-index/modules/commons/pages/index/having/HasUsername.adoc
deleted file mode 100644
index 6a5892b..0000000
--- a/antora/components/refguide-index/modules/commons/pages/index/having/HasUsername.adoc
+++ /dev/null
@@ -1,29 +0,0 @@
-= HasUsername _(interface)_
-: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 [...]
-
-Mix-in interface for objects (usually created by service implementations) that are be persistable, and so can be associated with a username, usually of the user that has performed some operation.
-
-Other services can then use this username as a means to contributed actions/collections to render such additional information relating to the activities of the user.
-
-== API
-
-[source,java]
-.HasUsername.java
-----
-interface HasUsername {
-  String getUsername()     // <.>
-}
-----
-
-<.> xref:#getUsername__[getUsername()]
-+
---
-The user that created this object.
---
-
-== Members
-
-[#getUsername__]
-=== getUsername()
-
-The user that created this object.
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc
deleted file mode 100644
index 6ca9e82..0000000
--- a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc
+++ /dev/null
@@ -1,32 +0,0 @@
-= HasUniqueId_command
-: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 mixin contributes a `command` action to any (non-command) implementation of xref:refguide:applib:index/mixins/system/HasInteractionId.adoc[HasInteractionId] ; that is: audit entries, and published events. Thus, it is possible to navigate from the effect back to the cause.
-
-== API
-
-[source,java]
-.HasUniqueId_command.java
-----
-class HasUniqueId_command {
-  @Inject
-CommandJdoRepository commandServiceRepository;
-  HasUniqueId_command(final HasInteractionId hasInteractionId)
-  CommandJdo act()
-  boolean hideAct()     // <.>
-  String disableAct()
-}
-----
-
-<.> xref:#hideAct__[hideAct()]
-+
---
-Hide if the contributee is a xref:refguide:applib:index/services/command/Command.adoc[Command] , because xref:refguide:applib:index/services/command/Command.adoc[Command] s already have a _Command#getParent() parent_ property.
---
-
-== Members
-
-[#hideAct__]
-=== hideAct()
-
-Hide if the contributee is a xref:refguide:applib:index/services/command/Command.adoc[Command] , because xref:refguide:applib:index/services/command/Command.adoc[Command] s already have a _Command#getParent() parent_ property.
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
index a508a3f..857e9c1 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
@@ -84,7 +84,7 @@ public class Command implements HasInteractionId, HasUsername, HasCommandDto {
      * Unique identifier for the command.
      *
      * <p>
-     *     Derived from {@link #getCommandDto()}'s {@link CommandDto#getTransactionId()}
+     *     Derived from {@link #getCommandDto()}'s {@link CommandDto#getInteractionId()}
      * </p>
      */
     @Getter
@@ -125,7 +125,7 @@ public class Command implements HasInteractionId, HasUsername, HasCommandDto {
      *
      * <p>
      *     When the framework sets this (through an internal API), it is
-     *     expected to have {@link CommandDto#getTransactionId()},
+     *     expected to have {@link CommandDto#getInteractionId()},
      *     {@link CommandDto#getUser()}, {@link CommandDto#getTimestamp()},
      *     {@link CommandDto#getTargets()} and {@link CommandDto#getMember()}
      *     to be populated.  The {@link #getInteractionId()}, {@link #getUsername()},
@@ -266,14 +266,14 @@ public class Command implements HasInteractionId, HasUsername, HasCommandDto {
         public void setCommandDto(final CommandDto commandDto) {
             Command.this.commandDto = commandDto;
 
-            // even though redundant, but must ensure commandUniqueId == dtoUniqueId
-            val commandUniqueId = Command.this.getInteractionId().toString();
-            val dtoUniqueId = commandDto.getTransactionId();
+            // should be redundant, but we ensure commandInteractionId == dtoInteractionId
+            val commandInteractionId = Command.this.getInteractionId().toString();
+            val dtoInteractionId = commandDto.getInteractionId();
 
-            if(!commandUniqueId.equals(dtoUniqueId)) {
-                log.warn("setting CommandDto on a Command has side-effects when "
-                        + "both their UniqueIds don't match");
-                commandDto.setTransactionId(commandUniqueId);
+            if(!commandInteractionId.equals(dtoInteractionId)) {
+                log.warn("setting CommandDto on a Command has side-effects if "
+                        + "their InteractionIds don't match; forcing CommandDto's Id to be same as Command's");
+                commandDto.setInteractionId(commandInteractionId);
             }
 
         }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/MethodReferences.java b/api/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/MethodReferences.java
similarity index 95%
rename from api/applib/src/main/java/org/apache/isis/applib/services/MethodReferences.java
rename to api/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/MethodReferences.java
index 6731a40..893a723 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/MethodReferences.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/MethodReferences.java
@@ -16,79 +16,79 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services;
+package org.apache.isis.applib.services.queryresultscache;
 
 import lombok.experimental.UtilityClass;
 
 /**
- * 
+ *
  * @since 2.0 {@index}
  */
 @UtilityClass
 public class MethodReferences {
 
     // -- METHOD REFERENCE MATCHERS (WITHOUT RETURN VALUE)
-    
+
     @FunctionalInterface
     public static interface Run0 {
         void run();
     }
-    
+
     @FunctionalInterface
     public static interface Run1<A0> {
         void run(A0 arg0);
     }
-    
+
     @FunctionalInterface
     public static interface Run2<A0, A1> {
         void run(A0 arg0, A1 arg1);
     }
-    
+
     @FunctionalInterface
     public static interface Run3<A0, A1, A2> {
         void run(A0 arg0, A1 arg1, A2 arg2);
     }
-    
+
     @FunctionalInterface
     public static interface Run4<A0, A1, A2, A3> {
         void run(A0 arg0, A1 arg1, A2 arg2, A3 arg3);
     }
-    
+
     @FunctionalInterface
     public static interface Run5<A0, A1, A2, A3, A4> {
         void run(A0 arg0, A1 arg1, A2 arg2, A3 arg3, A4 arg4);
     }
-    
+
     // -- METHOD REFERENCE MATCHERS (WITH RETURN VALUE)
-    
+
     @FunctionalInterface
     public static interface Call0<R> {
         R call();
     }
-    
+
     @FunctionalInterface
     public static interface Call1<R, A0> {
         R call(A0 arg0);
     }
-    
+
     @FunctionalInterface
     public static interface Call2<R, A0, A1> {
         R call(A0 arg0, A1 arg1);
     }
-    
+
     @FunctionalInterface
     public static interface Call3<R, A0, A1, A2> {
         R call(A0 arg0, A1 arg1, A2 arg2);
     }
-    
+
     @FunctionalInterface
     public static interface Call4<R, A0, A1, A2, A3> {
         R call(A0 arg0, A1 arg1, A2 arg2, A3 arg3);
     }
-    
+
     @FunctionalInterface
     public static interface Call5<R, A0, A1, A2, A3, A4> {
         R call(A0 arg0, A1 arg1, A2 arg2, A3 arg3, A4 arg4);
     }
-    
+
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java b/api/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
index c756211..a29248e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
@@ -23,8 +23,6 @@ import java.util.concurrent.Callable;
 
 import org.springframework.beans.factory.DisposableBean;
 
-import org.apache.isis.applib.services.MethodReferences;
-
 import lombok.Data;
 import lombok.Getter;
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java b/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
index 3e12a27..5b82116 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
@@ -198,20 +198,20 @@ public final class InteractionDtoUtils {
             final Execution<?, ?> execution,
             final MemberExecutionDto executionDto) {
         final Interaction interaction = execution.getInteraction();
-        final String transactionId = interaction.getInteractionId().toString();
+        final String interactionId = interaction.getInteractionId().toString();
 
-        return InteractionDtoUtils.newInteractionDto(transactionId, executionDto);
+        return InteractionDtoUtils.newInteractionDto(interactionId, executionDto);
     }
 
     private static InteractionDto newInteractionDto(
-            final String transactionId,
+            final String interactionId,
             final MemberExecutionDto executionDto) {
         final InteractionDto interactionDto = new InteractionDto();
 
         interactionDto.setMajorVersion("1");
         interactionDto.setMinorVersion("0");
 
-        interactionDto.setTransactionId(transactionId);
+        interactionDto.setInteractionId(interactionId);
         interactionDto.setExecution(executionDto);
 
         executionDto.setInteractionType(
diff --git a/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java b/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
index 98027d0..e66e1c3 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
@@ -60,7 +60,7 @@ import lombok.val;
 public class Roundtrip {
 
     private static InteractionDto newInteractionDtoWithActionInvocation(
-            final String transactionId,
+            final String interactionId,
             final int sequence,
             final Bookmark targetBookmark,
             final String targetTitle,
@@ -78,7 +78,7 @@ public class Roundtrip {
         interactionDto.setMajorVersion("1");
         interactionDto.setMinorVersion("0");
 
-        interactionDto.setTransactionId(transactionId);
+        interactionDto.setInteractionId(interactionId);
         interactionDto.setExecution(executionDto);
 
         executionDto.setInteractionType(InteractionType.ACTION_INVOCATION);
@@ -92,71 +92,71 @@ public class Roundtrip {
         InteractionDtoUtils.addParamArg(interactionDto, "a"+name, type, sampleValue, null);
         InteractionDtoUtils.addParamArg(interactionDto, "null"+name, type, type.cast(null), null);
     }
-    
+
     private static void testArg(
-            ActionInvocationDto invocationDto, 
-            LongAdder paramIndex, 
-            ValueType valueType, 
+            ActionInvocationDto invocationDto,
+            LongAdder paramIndex,
+            ValueType valueType,
             Object expectedValue) {
         testArg(invocationDto, paramIndex, valueType, expectedValue, null);
     }
-    
+
     private static void testArg(
-            ActionInvocationDto invocationDto, 
-            LongAdder paramIndex, 
-            ValueType valueType, 
+            ActionInvocationDto invocationDto,
+            LongAdder paramIndex,
+            ValueType valueType,
             Object expectedValue,
             String nameOverride) {
-        
+
         paramIndex.increment();
         int param = paramIndex.intValue();
-        
+
         val type = expectedValue.getClass();
         val name = nameOverride!=null ? nameOverride : type.getSimpleName();
         assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("a"+name));
         assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(valueType));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false));
-        
+
         val actualValue = InteractionDtoUtils.getParameterArgValue(invocationDto, param);
-        
+
         // equals test, some types need special checks ...
         if(expectedValue instanceof OidDto) {
-            
+
             assertThat( ((OidDto)actualValue).getId(), is(((OidDto)expectedValue).getId()) );
             assertThat( ((OidDto)actualValue).getType(), is(((OidDto)expectedValue).getType()) );
-            
+
         } else if(expectedValue instanceof org.joda.time.DateTime) {
-            
+
             assertThat( actualValue.toString(), is(expectedValue.toString()) );
-            
+
         } else if(expectedValue instanceof Iterable
                 || expectedValue.getClass().isArray()) {
-            
+
             val actualAsCan = Can.ofStream(_NullSafe.streamAutodetect(actualValue));
             val expectedAsCan = Can.ofStream(_NullSafe.streamAutodetect(expectedValue));
-            
+
             assertThat(actualAsCan, is(expectedAsCan));
-            
+
         } else {
-            assertThat(actualValue, is(expectedValue));    
+            assertThat(actualValue, is(expectedValue));
         }
-        
+
         paramIndex.increment();
         param = paramIndex.intValue();
         assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("null"+name));
         assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(valueType));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true));
     }
-    
+
     private static class SampleValues {
-        
+
         final Bookmark bookmark = Bookmark.of("ORD", "12345");
         final OidDto reference = new OidDto();
         {
             reference.setId("12345");
             reference.setType("ORD");
         }
-        
+
         final String string = "Fred";
         final byte primitiveByte = (byte)123;
         final short primitiveShort= (short) 32123;
@@ -166,10 +166,10 @@ public class Roundtrip {
         final double primitiveDouble = 12345678.90123d;
         final boolean primitiveBoolean = true;
         final char primitiveCharacter = 'x';
-        
+
         final BigInteger bigInteger = new java.math.BigInteger("12345678901234567890");
         final BigDecimal bigDecimal = new java.math.BigDecimal("12345678901234567890");
-                
+
         // java.time
         final LocalTime localTime = LocalTime.of(9, 54, 1);
         final OffsetTime offsetTime = OffsetTime.of(9, 54, 1, 123_000_000, ZoneOffset.ofTotalSeconds(-120));
@@ -177,13 +177,13 @@ public class Roundtrip {
         final LocalDateTime localDateTime = LocalDateTime.of(2015, 5, 23, 9, 54, 1);
         final OffsetDateTime offsetDateTime = OffsetDateTime.of(2015, 5, 23, 9, 54, 1, 0, ZoneOffset.UTC);
         final ZonedDateTime zonedDateTime = ZonedDateTime.of(2015, 5, 23, 9, 54, 1, 0, ZoneOffset.UTC);
-        
+
         // joda.time
         final org.joda.time.DateTime jodaDateTime = new org.joda.time.DateTime(2015, 5, 23, 9, 54, 1);
         final org.joda.time.LocalDate jodaLocalDate = new org.joda.time.LocalDate(2015, 5, 23);
         final org.joda.time.LocalDateTime jodaLocalDateTime = new org.joda.time.LocalDateTime(2015, 5, 23, 9, 54, 1);
         final org.joda.time.LocalTime jodaLocalTime = new org.joda.time.LocalTime(9, 54, 1);
-        
+
         // iterables
         final List<Long> list = _Lists.of(1L, 2L, 3L);
         final Set<Long> set = _Sets.of(1L, 2L, 3L);
@@ -191,10 +191,10 @@ public class Roundtrip {
         final long[] array = {1L, 2L, 3L};
 
     }
-    
+
     private final SampleValues sampleValues = new SampleValues();
-    
-    
+
+
     @Test
     public void happyCase() throws Exception {
 
@@ -214,7 +214,7 @@ public class Roundtrip {
                 Bookmark.of("CUS", "12345"), "John Customer", "com.mycompany.Customer#placeOrder", Arrays.<ParamDto>asList(),
                 "freddyUser"
                 );
-        
+
         addArg(interactionDto, sampleValues.bookmark);
         addArg(interactionDto, sampleValues.string);
         addArg(interactionDto, sampleValues.primitiveByte);
@@ -225,10 +225,10 @@ public class Roundtrip {
         addArg(interactionDto, sampleValues.primitiveDouble);
         addArg(interactionDto, sampleValues.primitiveBoolean);
         addArg(interactionDto, sampleValues.primitiveCharacter);
-        
+
         addArg(interactionDto, sampleValues.bigInteger);
         addArg(interactionDto, sampleValues.bigDecimal);
-        
+
         // java.time
         addArg(interactionDto, sampleValues.localTime);
         addArg(interactionDto, sampleValues.localDate);
@@ -236,13 +236,13 @@ public class Roundtrip {
         addArg(interactionDto, sampleValues.offsetTime);
         addArg(interactionDto, sampleValues.offsetDateTime);
         addArg(interactionDto, sampleValues.zonedDateTime);
-        
+
         // joda.time
         addArg(interactionDto, sampleValues.jodaDateTime);
         addArg(interactionDto, sampleValues.jodaLocalDate);
         addArg(interactionDto, sampleValues.jodaLocalDateTime);
         addArg(interactionDto, sampleValues.jodaLocalTime);
-        
+
         // iterables
         addArg(interactionDto, sampleValues.list);
         addArg(interactionDto, sampleValues.set);
@@ -265,7 +265,7 @@ public class Roundtrip {
         assertThat(recreated.getExecution().getTarget().getId(), Matchers.is(interactionDto.getExecution().getTarget().getId()));
 
         final ActionInvocationDto invocationDto = (ActionInvocationDto) recreated.getExecution();
-        val paramIndex = new LongAdder(); 
+        val paramIndex = new LongAdder();
         paramIndex.decrement();
 
         testArg(invocationDto, paramIndex, ValueType.REFERENCE, sampleValues.reference, "Bookmark");
@@ -278,10 +278,10 @@ public class Roundtrip {
         testArg(invocationDto, paramIndex, ValueType.DOUBLE, sampleValues.primitiveDouble);
         testArg(invocationDto, paramIndex, ValueType.BOOLEAN, sampleValues.primitiveBoolean);
         testArg(invocationDto, paramIndex, ValueType.CHAR, sampleValues.primitiveCharacter);
-        
+
         testArg(invocationDto, paramIndex, ValueType.BIG_INTEGER, sampleValues.bigInteger);
         testArg(invocationDto, paramIndex, ValueType.BIG_DECIMAL, sampleValues.bigDecimal);
-        
+
         // java.time
         testArg(invocationDto, paramIndex, ValueType.LOCAL_TIME, sampleValues.localTime);
         testArg(invocationDto, paramIndex, ValueType.LOCAL_DATE, sampleValues.localDate);
@@ -289,13 +289,13 @@ public class Roundtrip {
         testArg(invocationDto, paramIndex, ValueType.OFFSET_TIME, sampleValues.offsetTime);
         testArg(invocationDto, paramIndex, ValueType.OFFSET_DATE_TIME, sampleValues.offsetDateTime);
         testArg(invocationDto, paramIndex, ValueType.ZONED_DATE_TIME, sampleValues.zonedDateTime);
-        
+
         // joda.time
         testArg(invocationDto, paramIndex, ValueType.JODA_DATE_TIME, sampleValues.jodaDateTime);
         testArg(invocationDto, paramIndex, ValueType.JODA_LOCAL_DATE, sampleValues.jodaLocalDate);
         testArg(invocationDto, paramIndex, ValueType.JODA_LOCAL_DATE_TIME, sampleValues.jodaLocalDateTime);
         testArg(invocationDto, paramIndex, ValueType.JODA_LOCAL_TIME, sampleValues.jodaLocalTime);
-        
+
         // iterables
         testArg(invocationDto, paramIndex, ValueType.COLLECTION, sampleValues.list);
         testArg(invocationDto, paramIndex, ValueType.COLLECTION, sampleValues.set);
diff --git a/api/schema/src/main/resources/org/apache/isis/schema/chg/chg-2.0.xsd b/api/schema/src/main/resources/org/apache/isis/schema/chg/chg-2.0.xsd
index 3590d20..d51974d 100644
--- a/api/schema/src/main/resources/org/apache/isis/schema/chg/chg-2.0.xsd
+++ b/api/schema/src/main/resources/org/apache/isis/schema/chg/chg-2.0.xsd
@@ -45,7 +45,7 @@
                         </xs:documentation>
                     </xs:annotation>
                 </xs:element>
-                <xs:element name="transactionId" type="xs:string">
+                <xs:element name="interactionId" type="xs:string">
                     <xs:annotation>
                         <xs:documentation>Unique identifier of the interaction id within which this change occurred.
                         </xs:documentation>
@@ -53,7 +53,7 @@
                 </xs:element>
                 <xs:element name="sequence" type="xs:int">
                     <xs:annotation>
-                        <xs:documentation>Unique sequence number of the set of change within the interaction.  There could be many such events within a single interaction, one for each completed transaction.
+                        <xs:documentation>Unique sequence number of the transaction committed within the interaction.  Although there is usually just one transaction per interaction, in advanced use cases there could be many.
                         </xs:documentation>
                     </xs:annotation>
                 </xs:element>
diff --git a/api/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-2.0.xsd b/api/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-2.0.xsd
index 87dcd6a..218f1e4 100644
--- a/api/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-2.0.xsd
+++ b/api/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-2.0.xsd
@@ -55,9 +55,9 @@
                         </xs:documentation>
                     </xs:annotation>
                 </xs:element>
-                <xs:element name="transactionId" type="xs:string">
+                <xs:element name="interactionId" type="xs:string">
                     <xs:annotation>
-                        <xs:documentation>Transaction id for this command, a unique identifier.
+                        <xs:documentation>Unique identifier of the interaction that gave rise to this command.
                         </xs:documentation>
                     </xs:annotation>
                 </xs:element>
diff --git a/api/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-2.0.xsd b/api/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-2.0.xsd
index dd83dbf..bf1bc5e 100644
--- a/api/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-2.0.xsd
+++ b/api/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-2.0.xsd
@@ -47,7 +47,7 @@
                         </xs:documentation>
                     </xs:annotation>
                 </xs:element>
-                <xs:element name="transactionId" type="xs:string">
+                <xs:element name="interactionId" type="xs:string">
                     <xs:annotation>
                         <xs:documentation>Unique identifier of the interaction which this member was interacted with (action invoked/property edited); can be used to locate the corresponding Command object (which may have been persisted).
                         </xs:documentation>
diff --git a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java
index 5481416..765032a 100644
--- a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java
+++ b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java
@@ -44,8 +44,8 @@ import lombok.extern.log4j.Log4j2;
 @Log4j2
 public class IsisInteraction implements InternalInteraction {
 
-    public IsisInteraction(final @NonNull UUID uniqueId) {
-        this.command = new Command(uniqueId);
+    public IsisInteraction(final @NonNull UUID interactionId) {
+        this.command = new Command(interactionId);
     }
 
     @Getter(onMethod_ = {@Override})
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandDtoFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandDtoFactory.java
index c80b4c2..6c7b2de 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandDtoFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandDtoFactory.java
@@ -55,7 +55,7 @@ public interface CommandDtoFactory {
      * @see #asCommandDto(UUID, Can, OneToOneAssociation, ManagedObject)
      */
     CommandDto asCommandDto(
-            final UUID uniqueId,
+            final UUID interactionId,
             final Can<ManagedObject> targetAdapters,
             final ObjectAction objectAction,
             final Can<ManagedObject> argAdapters);
@@ -68,7 +68,7 @@ public interface CommandDtoFactory {
      * @see #asCommandDto(UUID, Can, ObjectAction, Can)
      */
     CommandDto asCommandDto(
-            final UUID uniqueId,
+            final UUID interactionId,
             final Can<ManagedObject> targetAdapters,
             final OneToOneAssociation association,
             final ManagedObject valueAdapterOrNull);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index 898d5cb..2ff5d1d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -67,8 +67,8 @@ import org.apache.isis.schema.cmd.v2.CommandDto;
 import lombok.NonNull;
 import lombok.val;
 
-public class ObjectActionDefault 
-extends ObjectMemberAbstract 
+public class ObjectActionDefault
+extends ObjectMemberAbstract
 implements ObjectAction {
 
     public static ActionType getType(final String typeStr) {
@@ -151,7 +151,7 @@ implements ObjectAction {
     public ActionInteractionHead interactionHead(@NonNull ManagedObject actionOwner) {
         return ActionInteractionHead.of(this, actionOwner, actionOwner);
     }
-    
+
     // -- Parameters
 
     @Override
@@ -165,7 +165,7 @@ implements ObjectAction {
     }
 
     protected Can<ObjectActionParameter> determineParameters() {
-        
+
         val parameterCount = getParameterCount();
         val paramPeers = getFacetedMethod().getParameters();
 
@@ -231,27 +231,27 @@ implements ObjectAction {
 
     @Override
     public VisibilityContext createVisibleInteractionContext(
-            final ManagedObject target, 
+            final ManagedObject target,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         return new ActionVisibilityContext(
-                headFor(target), 
-                this, 
-                getIdentifier(), 
-                interactionInitiatedBy, 
+                headFor(target),
+                this,
+                getIdentifier(),
+                interactionInitiatedBy,
                 where);
     }
 
     @Override
     public UsabilityContext createUsableInteractionContext(
-            final ManagedObject target, 
+            final ManagedObject target,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         return new ActionUsabilityContext(
-                headFor(target), 
-                this, 
-                getIdentifier(), 
-                interactionInitiatedBy, 
+                headFor(target),
+                this,
+                getIdentifier(),
+                interactionInitiatedBy,
                 where);
     }
 
@@ -295,14 +295,14 @@ implements ObjectAction {
             final Can<ManagedObject> proposedArguments,
             final InteractionInitiatedBy interactionInitiatedBy,
             final InteractionResultSet resultSet) {
-        
+
         val actionParameters = getParameters();
         if (proposedArguments != null) {
             for (int i = 0; i < proposedArguments.size(); i++) {
                 val validityContext = actionParameters.getElseFail(i)
                         .createProposedArgumentInteractionContext(
                                 head, proposedArguments, i, interactionInitiatedBy);
-                
+
                 InteractionUtils.isValidResultSet(getParameter(i), validityContext, resultSet);
             }
         }
@@ -325,7 +325,7 @@ implements ObjectAction {
             final Can<ManagedObject> proposedArguments,
             final InteractionInitiatedBy interactionInitiatedBy,
             final InteractionResultSet resultSet) {
-        
+
         val validityContext = createActionInvocationInteractionContext(
                 head, proposedArguments, interactionInitiatedBy);
         InteractionUtils.isValidResultSet(this, validityContext, resultSet);
@@ -335,11 +335,11 @@ implements ObjectAction {
             final InteractionHead head,
             final Can<ManagedObject> proposedArguments,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        
+
         return new ActionValidityContext(
-                head, 
-                this, 
-                getIdentifier(), 
+                head,
+                this,
+                getIdentifier(),
                 proposedArguments,
                 interactionInitiatedBy);
     }
@@ -356,7 +356,7 @@ implements ObjectAction {
             final Where where) {
 
         val target = head.getOwner();
-        
+
         // see it?
         final Consent visibility = isVisible(target, interactionInitiatedBy, where);
         if (visibility.isVetoed()) {
@@ -390,9 +390,9 @@ implements ObjectAction {
 
         _Assert.assertEquals(this.getParameterCount(), argumentAdapters.size(),
                 "action's parameter count and provided argument count must match");
-        
+
         setupCommand(head.getTarget(), argumentAdapters);
-        
+
         return this.executeInternal(head, argumentAdapters, interactionInitiatedBy);
     }
 
@@ -403,7 +403,7 @@ implements ObjectAction {
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        
+
         val actionInvocationFacet = getFacet(ActionInvocationFacet.class);
         return actionInvocationFacet
                 .invoke(this, head, argumentAdapters, interactionInitiatedBy);
@@ -420,13 +420,13 @@ implements ObjectAction {
 
         val actionDefaultsFacet = getFacet(ActionDefaultsFacet.class);
         if (!actionDefaultsFacet.isFallback()) {
-            
+
             // use the old defaultXxx approach
-            
+
             final int parameterCount = getParameterCount();
             val parameters = getParameters();
             final Object[] parameterDefaultPojos;
-            
+
             parameterDefaultPojos = actionDefaultsFacet.getDefaults(target);
             if (parameterDefaultPojos.length != parameterCount) {
                 throw new DomainModelException("Defaults array of incompatible size; expected " + parameterCount + " elements, but was " + parameterDefaultPojos.length + " for " + actionDefaultsFacet);
@@ -441,7 +441,7 @@ implements ObjectAction {
                     }
                 }
             }
-            
+
             final ManagedObject[] parameterDefaultAdapters = new ManagedObject[parameterCount];
             for (int i = 0; i < parameterCount; i++) {
                 val paramSpec = parameters.getElseFail(i).getSpecification();
@@ -449,9 +449,9 @@ implements ObjectAction {
             }
 
             return Can.ofArray(parameterDefaultAdapters);
-            
-        } 
-        
+
+        }
+
         // else use the new defaultNXxx approach for each param in turn
         // (the reflector will have made sure both aren't installed).
         return interactionHead(target)
@@ -460,8 +460,8 @@ implements ObjectAction {
 
     }
 
-        
-    
+
+
     private static ThreadLocal<List<ManagedObject>> commandTargetAdaptersHolder = new ThreadLocal<>();
 
     /**
@@ -493,7 +493,7 @@ implements ObjectAction {
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         final int parameterCount = getParameterCount();
-        CanVector<ManagedObject> paramChoicesVector; 
+        CanVector<ManagedObject> paramChoicesVector;
 
         final ActionChoicesFacet facet = getFacet(ActionChoicesFacet.class);
         val parameters = getParameters();
@@ -521,13 +521,13 @@ implements ObjectAction {
                 val param = parameters.getElseFail(i);
                 val paramSpec = param.getSpecification();
                 val paramFacet = param.getFacet(ActionParameterChoicesFacet.class);
-                
+
                 if (paramFacet != null && !paramFacet.isFallback()) {
-                    
+
                     val visibleChoices = paramFacet.getChoices(
-                            paramSpec, 
-                            interactionHead(target), 
-                            emptyPendingArgs, 
+                            paramSpec,
+                            interactionHead(target),
+                            emptyPendingArgs,
                             interactionInitiatedBy);
                     ObjectActionParameterAbstract.checkChoicesOrAutoCompleteType(
                             getSpecificationLoader(), visibleChoices, paramSpec);
@@ -554,7 +554,7 @@ implements ObjectAction {
             final ManagedObject targetAdapter,
             final Can<ManagedObject> argumentAdapters) {
 
-        setupCommand(targetAdapter, uniqueId->commandDtoFor(uniqueId, targetAdapter, argumentAdapters));
+        setupCommand(targetAdapter, interactionId->commandDtoFor(interactionId, targetAdapter, argumentAdapters));
     }
 
     @Override
@@ -588,19 +588,19 @@ implements ObjectAction {
     }
 
     // -- HELPER
-    
+
     private CommandDto commandDtoFor(
-            final UUID uniqueId,
+            final UUID interactionId,
             final ManagedObject targetAdapter,
             final Can<ManagedObject> argumentAdapters) {
-        
+
         val commandTargetAdapters =
                 commandTargetAdaptersHolder.get() != null
                     ? Can.ofCollection(commandTargetAdaptersHolder.get())
                     : Can.ofSingleton(targetAdapter);
 
         return getCommandDtoFactory()
-                .asCommandDto(uniqueId, commandTargetAdapters, this, argumentAdapters);
+                .asCommandDto(interactionId, commandTargetAdapters, this, argumentAdapters);
     }
-    
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
index 11f744a..4322cb6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -53,8 +53,8 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 import lombok.val;
 
-public class OneToOneAssociationDefault 
-extends ObjectAssociationAbstract 
+public class OneToOneAssociationDefault
+extends ObjectAssociationAbstract
 implements OneToOneAssociation {
 
     public OneToOneAssociationDefault(final FacetedMethod facetedMethod) {
@@ -73,7 +73,7 @@ implements OneToOneAssociation {
 
     @Override
     public VisibilityContext createVisibleInteractionContext(
-            final ManagedObject ownerAdapter, 
+            final ManagedObject ownerAdapter,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         return new PropertyVisibilityContext(
@@ -83,7 +83,7 @@ implements OneToOneAssociation {
 
     @Override
     public UsabilityContext createUsableInteractionContext(
-            final ManagedObject ownerAdapter, 
+            final ManagedObject ownerAdapter,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         return new PropertyUsabilityContext(
@@ -125,9 +125,9 @@ implements OneToOneAssociation {
     // -- init
     @Override
     public void initAssociation(
-            final ManagedObject ownerAdapter, 
+            final ManagedObject ownerAdapter,
             final ManagedObject referencedAdapter) {
-        
+
         final PropertyInitializationFacet initializerFacet = getFacet(PropertyInitializationFacet.class);
         if (initializerFacet != null) {
             initializerFacet.initProperty(ownerAdapter, referencedAdapter);
@@ -189,7 +189,7 @@ implements OneToOneAssociation {
         if (propertySetterFacet == null) {
             throw _Exceptions.unexpectedCodeReach();
         }
-        
+
         EntityUtil.requiresWhenFirstIsBookmarkableSecondIsAttached(ownerAdapter, newReferencedAdapter);
 
         return propertySetterFacet.setProperty(this, ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
@@ -198,13 +198,13 @@ implements OneToOneAssociation {
     private ManagedObject clearValue(
             final ManagedObject ownerAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        
+
         val propertyClearFacet = getFacet(PropertyClearFacet.class);
-        
+
         if (propertyClearFacet == null) {
             throw _Exceptions.unexpectedCodeReach();
         }
-        
+
         return propertyClearFacet.clearProperty(this, ownerAdapter, interactionInitiatedBy);
     }
 
@@ -274,11 +274,11 @@ implements OneToOneAssociation {
             final ManagedObject ownerAdapter,
             final String searchArg,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        
+
         final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
         final Object[] pojoOptions = propertyAutoCompleteFacet
                 .autoComplete(ownerAdapter, searchArg, interactionInitiatedBy);
-        
+
         val adapters = _NullSafe.stream(pojoOptions)
                 .map(getObjectManager()::adapt)
                 .collect(Can.toCan());
@@ -300,9 +300,9 @@ implements OneToOneAssociation {
             final ManagedObject targetAdapter,
             final ManagedObject valueAdapterOrNull) {
 
-        setupCommand(targetAdapter, uniqueId -> 
+        setupCommand(targetAdapter, interactionId ->
             getCommandDtoFactory()
-                .asCommandDto(uniqueId, Can.ofSingleton(targetAdapter), this, valueAdapterOrNull));
+                .asCommandDto(interactionId, Can.ofSingleton(targetAdapter), this, valueAdapterOrNull));
     }
 
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java
index 0fcaa0f..11d1c99 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java
@@ -44,7 +44,7 @@ public class ActionAnnotationFacetFactoryTest_commandPublishing extends ActionAn
     }
 
     @Test
-    public void given_HasUniqueId_thenIgnored() {
+    public void given_HasInteractionId_thenIgnored() {
         // given
         final Method actionMethod = findMethod(SomeHasInteractionId.class, "someAction");
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java
index b822d5b..219cae9 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java
@@ -48,7 +48,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
     }
 
     @Test
-    public void given_HasUniqueId_thenIgnored() {
+    public void given_HasInteractionId_thenIgnored() {
 
         final Method actionMethod = findMethod(SomeHasInteractionId.class, "someAction");
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 00e485f..e799160 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -123,7 +123,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
         }
 
         @Test
-        public void ignore_HasUniqueId() {
+        public void ignore_HasInteractionId() {
 
             allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy.ALL);
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java
index 9d22043..044b2ad 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java
@@ -72,12 +72,12 @@ public class CommandDtoFactoryDefault implements CommandDtoFactory {
 
     @Override
     public CommandDto asCommandDto(
-            final UUID uniqueId,
+            final UUID interactionId,
             final Can<ManagedObject> targetAdapters,
             final ObjectAction objectAction,
             final Can<ManagedObject> argAdapters) {
 
-        final CommandDto dto = asCommandDto(uniqueId, targetAdapters);
+        final CommandDto dto = asCommandDto(interactionId, targetAdapters);
 
         final ActionDto actionDto = new ActionDto();
         actionDto.setInteractionType(InteractionType.ACTION_INVOCATION);
@@ -90,12 +90,12 @@ public class CommandDtoFactoryDefault implements CommandDtoFactory {
 
     @Override
     public CommandDto asCommandDto(
-            final UUID uniqueId,
+            final UUID interactionId,
             final Can<ManagedObject> targetAdapters,
             final OneToOneAssociation property,
             final ManagedObject valueAdapterOrNull) {
 
-        final CommandDto dto = asCommandDto(uniqueId, targetAdapters);
+        final CommandDto dto = asCommandDto(interactionId, targetAdapters);
 
         final PropertyDto propertyDto = new PropertyDto();
         propertyDto.setInteractionType(InteractionType.PROPERTY_EDIT);
@@ -163,13 +163,13 @@ public class CommandDtoFactoryDefault implements CommandDtoFactory {
 
     // -- HELPER
 
-    private CommandDto asCommandDto(final UUID uniqueId, final Can<ManagedObject> targetAdapters) {
+    private CommandDto asCommandDto(final UUID interactionId, final Can<ManagedObject> targetAdapters) {
 
         val dto = new CommandDto();
         dto.setMajorVersion("2");
         dto.setMinorVersion("0");
 
-        dto.setTransactionId(uniqueId.toString());
+        dto.setInteractionId(interactionId.toString());
         dto.setUser(userService.currentUserNameElseNobody());
         dto.setTimestamp(clockService.getClock().xmlGregorianCalendar());
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
index adb0c42..6b7408f 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
@@ -180,7 +180,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
 
         log.info("Executing: {} {} {}",
                 dto.getMember().getLogicalMemberIdentifier(),
-                dto.getTimestamp(), dto.getTransactionId());
+                dto.getTimestamp(), dto.getInteractionId());
 
         final MemberDto memberDto = dto.getMember();
         final String memberId = memberDto.getMemberIdentifier();
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/queryresultscache/QueryResultsCacheDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/queryresultscache/QueryResultsCacheDefault.java
index 005b1f0..54af533 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/queryresultscache/QueryResultsCacheDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/queryresultscache/QueryResultsCacheDefault.java
@@ -31,12 +31,12 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.InteractionScope;
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.services.MethodReferences.Call0;
-import org.apache.isis.applib.services.MethodReferences.Call1;
-import org.apache.isis.applib.services.MethodReferences.Call2;
-import org.apache.isis.applib.services.MethodReferences.Call3;
-import org.apache.isis.applib.services.MethodReferences.Call4;
-import org.apache.isis.applib.services.MethodReferences.Call5;
+import org.apache.isis.applib.services.queryresultscache.MethodReferences.Call0;
+import org.apache.isis.applib.services.queryresultscache.MethodReferences.Call1;
+import org.apache.isis.applib.services.queryresultscache.MethodReferences.Call2;
+import org.apache.isis.applib.services.queryresultscache.MethodReferences.Call3;
+import org.apache.isis.applib.services.queryresultscache.MethodReferences.Call4;
+import org.apache.isis.applib.services.queryresultscache.MethodReferences.Call5;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCacheControl;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.commons.internal.base._Casts;
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
index 220c8d0..b34d6c9 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
@@ -357,7 +357,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
         val interactionLayer = currentInteractionLayer();
         val asyncAuth = authFrom(asyncControl, interactionLayer.getAuthentication());
         val command = interactionContextProvider.get().currentInteractionElseFail().getCommand();
-        val commandUniqueId = command.getInteractionId();
+        val commandInteractionId = command.getInteractionId();
 
         val targetAdapter = memberAndTarget.getTarget();
         val method = memberAndTarget.getMethod();
@@ -370,12 +370,12 @@ public class WrapperFactoryDefault implements WrapperFactory {
             case ACTION:
                 val action = memberAndTarget.getAction();
                 commandDto = commandDtoFactory
-                        .asCommandDto(commandUniqueId, targetList, action, argAdapters);
+                        .asCommandDto(commandInteractionId, targetList, action, argAdapters);
                 break;
             case PROPERTY:
                 val property = memberAndTarget.getProperty();
                 commandDto = commandDtoFactory
-                        .asCommandDto(commandUniqueId, targetList, property, argAdapters.getElseFail(0));
+                        .asCommandDto(commandInteractionId, targetList, property, argAdapters.getElseFail(0));
                 break;
             default:
                 // shouldn't happen, already catered for this case previously
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
index d09894a..4cce664 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
@@ -84,16 +84,16 @@ class ChangingEntitiesFactory {
             final int numberEntityPropertiesModified,
             final Map<ManagedObject, EntityChangeKind> changeKindByEnlistedAdapter) {
 
-        val uniqueId = interaction.getInteractionId();
+        val interactionId = interaction.getInteractionId();
         final int nextEventSequence = interaction.next(SequenceType.TRANSACTION);
 
         return new SimpleChangingEntities(
-                    uniqueId, nextEventSequence,
+                    interactionId, nextEventSequence,
                     userName, completedAt,
                     numberEntitiesLoaded,
                     numberEntityPropertiesModified,
                     ()->newDto(
-                            uniqueId, nextEventSequence,
+                            interactionId, nextEventSequence,
                             userName, completedAt,
                             numberEntitiesLoaded,
                             numberEntityPropertiesModified,
@@ -101,7 +101,7 @@ class ChangingEntitiesFactory {
     }
 
     private static ChangesDto newDto(
-            final UUID uniqueId, final int nextEventSequence,
+            final UUID interactionId, final int transactionSequenceNum,
             final String userName, final java.sql.Timestamp completedAt,
             final int numberEntitiesLoaded,
             final int numberEntityPropertiesModified,
@@ -125,8 +125,8 @@ class ChangingEntitiesFactory {
         changesDto.setMajorVersion("2");
         changesDto.setMinorVersion("0");
 
-        changesDto.setTransactionId(uniqueId.toString());
-        changesDto.setSequence(nextEventSequence);
+        changesDto.setInteractionId(interactionId.toString());
+        changesDto.setSequence(transactionSequenceNum);
 
         changesDto.setUser(userName);
         changesDto.setCompletedAt(JavaSqlXMLGregorianCalendarMarshalling.toXMLGregorianCalendar(completedAt));
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/CommandSubscriberForJdo.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/CommandSubscriberForJdo.java
index 61dd61a..0adf534 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/CommandSubscriberForJdo.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/CommandSubscriberForJdo.java
@@ -57,7 +57,7 @@ public class CommandSubscriberForJdo implements CommandSubscriber {
         }
 
         val existingCommandJdoIfAny =
-                commandJdoRepository.findByUniqueId(command.getInteractionId());
+                commandJdoRepository.findByInteractionId(command.getInteractionId());
         if(existingCommandJdoIfAny.isPresent()) {
             if(log.isDebugEnabled()) {
                 // this isn't expected to happen ... we just log the fact if it does
@@ -75,7 +75,7 @@ public class CommandSubscriberForJdo implements CommandSubscriber {
             val parentJdo =
                 parent != null
                     ? commandJdoRepository
-                        .findByUniqueId(parent.getInteractionId())
+                        .findByInteractionId(parent.getInteractionId())
                         .orElse(null)
                     : null;
             commandJdo.setParent(parentJdo);
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java
index dfaf900..ea1b6b5 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java
@@ -84,10 +84,10 @@ import lombok.val;
         table = "Command")
 @javax.jdo.annotations.Queries( {
     @javax.jdo.annotations.Query(
-            name="findByUniqueIdStr",
+            name="findByInteractionIdStr",
             value="SELECT "
                     + "FROM org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo "
-                    + "WHERE uniqueIdStr == :uniqueIdStr "),
+                    + "WHERE interactionIdStr == :interactionIdStr "),
     @javax.jdo.annotations.Query(
             name="findByParent",
             value="SELECT "
@@ -110,7 +110,7 @@ import lombok.val;
             value="SELECT "
                     + "FROM org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo "
                     + "WHERE target == :target "
-                    + "ORDER BY this.timestamp DESC, uniqueIdStr DESC "
+                    + "ORDER BY this.timestamp DESC "
                     + "RANGE 0,30"),
     @javax.jdo.annotations.Query(
             name="findByTargetAndTimestampBetween",
@@ -273,7 +273,7 @@ public class CommandJdo
      */
     public CommandJdo(final Command command) {
 
-        setUniqueIdStr(command.getInteractionId().toString());
+        setInteractionIdStr(command.getInteractionId().toString());
         setUsername(command.getUsername());
         setTimestamp(command.getTimestamp());
 
@@ -303,7 +303,7 @@ public class CommandJdo
             final ReplayState replayState,
             final int targetIndex) {
 
-        setUniqueIdStr(commandDto.getTransactionId());
+        setInteractionIdStr(commandDto.getInteractionId());
         setUsername(commandDto.getUser());
         setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimestamp()));
 
@@ -360,7 +360,7 @@ public class CommandJdo
     }
 
 
-    public static class UniqueIdDomainEvent extends PropertyDomainEvent<String> { }
+    public static class InteractionIdDomainEvent extends PropertyDomainEvent<String> { }
     /**
      * Implementation note: persisted as a string rather than a UUID as fails
      * to persist if using h2 (perhaps would need to be mapped differently).
@@ -368,13 +368,13 @@ public class CommandJdo
      */
     @javax.jdo.annotations.PrimaryKey
     @javax.jdo.annotations.Persistent
-    @javax.jdo.annotations.Column(allowsNull="false", name = "uniqueId", length = 36)
-    @Property(domainEvent = UniqueIdDomainEvent.class)
-    @PropertyLayout(named = "UniqueId")
+    @javax.jdo.annotations.Column(allowsNull="false", name = "interactionId", length = 36)
+    @Property(domainEvent = InteractionIdDomainEvent.class)
+    @PropertyLayout(named = "Interaction Id")
     @Getter @Setter
-    private String uniqueIdStr;
+    private String interactionIdStr;
     @Programmatic
-    public UUID getInteractionId() {return UUID.fromString(getUniqueIdStr());}
+    public UUID getInteractionId() {return UUID.fromString(getInteractionIdStr());}
 
 
     public static class UsernameDomainEvent extends PropertyDomainEvent<String> { }
@@ -594,7 +594,7 @@ public class CommandJdo
     @Override
     public String toString() {
         return ObjectContracts
-                .toString("uniqueId", CommandJdo::getInteractionId)
+                .toString("interactionId", CommandJdo::getInteractionId)
                 .thenToString("username", CommandJdo::getUsername)
                 .thenToString("timestamp", CommandJdo::getTimestamp)
                 .thenToString("target", CommandJdo::getTarget)
@@ -653,7 +653,7 @@ public class CommandJdo
 
         private List<String> ordered(List<String> propertyIds) {
             return Arrays.asList(
-                "timestamp", "target", "targetMember", "username", "complete", "resultSummary", "uniqueIdStr"
+                "timestamp", "target", "targetMember", "username", "complete", "resultSummary", "interactionIdStr"
             );
         }
     }
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.layout.fallback.xml b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.layout.fallback.xml
index 65ab586..8f7e26a 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.layout.fallback.xml
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.layout.fallback.xml
@@ -34,7 +34,7 @@
                         <cpt:action id="downloadJdoMetadata" position="PANEL_DROPDOWN"/>
                         <cpt:action id="openRestApi" position="PANEL_DROPDOWN"/>
                         <cpt:property id="type"/>
-                        <cpt:property id="uniqueIdStr"/>
+                        <cpt:property id="interactionIdStr"/>
                         <cpt:property id="logicalMemberIdentifier"/>
                     </cpt:fieldSet>
                     <cpt:fieldSet name="Who and When">
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java
index 23a5d4a..623e4e8 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java
@@ -100,10 +100,10 @@ public class CommandJdoRepository {
     }
 
 
-    public Optional<CommandJdo> findByUniqueId(final UUID uniqueId) {
+    public Optional<CommandJdo> findByInteractionId(final UUID interactionId) {
         return repositoryService().firstMatch(
-                Query.named(CommandJdo.class, "findByUniqueIdStr")
-                    .withParameter("uniqueIdStr", uniqueId.toString()));
+                Query.named(CommandJdo.class, "findByInteractionIdStr")
+                    .withParameter("interactionIdStr", interactionId.toString()));
     }
 
     public List<CommandJdo> findByParent(final CommandJdo parent) {
@@ -189,10 +189,10 @@ public class CommandJdoRepository {
      * the application.
      *
      * This finder returns all (completed) {@link CommandJdo}s started after
-     * the command with the specified uniqueId.  The number of commands
+     * the command with the specified interactionId.  The number of commands
      * returned can be limited so that they can be applied in batches.
      *
-     * If the provided uniqueId is null, then only a single
+     * If the provided interactionId is null, then only a single
      * {@link CommandJdo command} is returned.  This is intended to support
      * the case when the secondary does not yet have any
      * {@link CommandJdo command}s replicated.  In practice this is unlikely;
@@ -201,24 +201,24 @@ public class CommandJdoRepository {
      * case there will already be a {@link CommandJdo command} representing the
      * current high water mark on the secondary system.
      *
-     * If the unique id is not null but the corresponding
+     * If the interactionid is not null but the corresponding
      * {@link CommandJdo command} is not found, then <tt>null</tt> is returned.
      * In the replay scenario the caller will probably interpret this as an
      * error because it means that the high water mark on the secondary is
      * inaccurate, referring to a non-existent {@link CommandJdo command} on
      * the primary.
      *
-     * @param uniqueId - the identifier of the {@link CommandJdo command} being
+     * @param interactionId - the identifier of the {@link CommandJdo command} being
      *                   the replay hwm (using {@link #findMostRecentReplayed()} on the
      *                   secondary), or null if no HWM was found there.
      * @param batchSize - to restrict the number returned (so that replay
      *                   commands can be batched).
      */
-    public List<CommandJdo> findSince(final UUID uniqueId, final Integer batchSize) {
-        if(uniqueId == null) {
+    public List<CommandJdo> findSince(final UUID interactionId, final Integer batchSize) {
+        if(interactionId == null) {
             return findFirst();
         }
-        final CommandJdo from = findByUniqueIdElseNull(uniqueId);
+        final CommandJdo from = findByInteractionIdElseNull(interactionId);
         if(from == null) {
             return Collections.emptyList();
         }
@@ -234,13 +234,13 @@ public class CommandJdoRepository {
     }
 
 
-    private CommandJdo findByUniqueIdElseNull(final UUID uniqueId) {
+    private CommandJdo findByInteractionIdElseNull(final UUID interactionId) {
         val tsq = jdoSupport.newTypesafeQuery(CommandJdo.class);
         val cand = QCommandJdo.candidate();
         val q = tsq.filter(
-                cand.uniqueIdStr.eq(tsq.parameter("uniqueIdStr", String.class))
+                cand.interactionIdStr.eq(tsq.parameter("interactionIdStr", String.class))
         );
-        q.setParameter("uniqueIdStr", uniqueId.toString());
+        q.setParameter("interactionIdStr", interactionId.toString());
         return q.executeUnique();
     }
 
@@ -333,7 +333,7 @@ public class CommandJdoRepository {
 
         final CommandJdo commandJdo = new CommandJdo();
 
-        commandJdo.setUniqueIdStr(dto.getTransactionId());
+        commandJdo.setInteractionIdStr(dto.getInteractionId());
         commandJdo.setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(dto.getTimestamp()));
         commandJdo.setUsername(dto.getUser());
 
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasInteractionId_command.java
similarity index 89%
rename from extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java
rename to extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasInteractionId_command.java
index 5fa9843..ecdbed2 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasInteractionId_command.java
@@ -41,20 +41,20 @@ import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
  */
 @Action(
     semantics = SemanticsOf.SAFE
-    , domainEvent = HasUniqueId_command.ActionDomainEvent.class
+    , domainEvent = HasInteractionId_command.ActionDomainEvent.class
 )
-public class HasUniqueId_command {
+public class HasInteractionId_command {
 
     public static class ActionDomainEvent
-            extends IsisModuleExtCommandLogImpl.ActionDomainEvent<HasUniqueId_command> { }
+            extends IsisModuleExtCommandLogImpl.ActionDomainEvent<HasInteractionId_command> { }
 
     private final HasInteractionId hasInteractionId;
-    public HasUniqueId_command(final HasInteractionId hasInteractionId) {
+    public HasInteractionId_command(final HasInteractionId hasInteractionId) {
         this.hasInteractionId = hasInteractionId;
     }
 
 
-    @MemberOrder(name="transactionId", sequence="1")
+    @MemberOrder(name="interactionId", sequence="1")
     public CommandJdo act() {
         return findCommand();
     }
@@ -72,7 +72,7 @@ public class HasUniqueId_command {
     private CommandJdo findCommand() {
         final UUID transactionId = hasInteractionId.getInteractionId();
         return commandServiceRepository
-                .findByUniqueId(transactionId)
+                .findByInteractionId(transactionId)
                 .orElse(null);
     }
 
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/ui/CommandServiceMenu.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/ui/CommandServiceMenu.java
index eeee395..d063d75 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/ui/CommandServiceMenu.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/ui/CommandServiceMenu.java
@@ -122,7 +122,7 @@ public class CommandServiceMenu {
     public CommandJdo findCommandById(
             @ParameterLayout(named="Transaction Id")
             final UUID transactionId) {
-        return commandServiceRepository.findByUniqueId(transactionId).orElse(null);
+        return commandServiceRepository.findByInteractionId(transactionId).orElse(null);
     }
     public boolean hideFindCommandById() {
         return commandServiceRepository == null;
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java
index c1c8525..5a17174 100644
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java
@@ -59,10 +59,10 @@ public class CommandRetrievalService {
     public static class NotFoundException extends RecoverableException {
         private static final long serialVersionUID = 1L;
         @Getter
-        private final UUID uniqueId;
-        public NotFoundException(final UUID uniqueId) {
+        private final UUID interactionId;
+        public NotFoundException(final UUID interactionId) {
             super("Command not found");
-            this.uniqueId = uniqueId;
+            this.interactionId = interactionId;
         }
     }
 
@@ -70,22 +70,22 @@ public class CommandRetrievalService {
      * These actions should be called with HTTP Accept Header set to:
      * <code>application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v1.CommandsDto"</code>
      *
-     * @param uniqueId - to search from.  This transactionId will <i>not</i> be included in the response.
+     * @param interactionId - to search from.  This interactionId will <i>not</i> be included in the response.
      * @param batchSize - the maximum number of commands to return.  If not specified, all found will be returned.
      * @throws NotFoundException - if the command with specified transaction cannot be found.
      */
     @Action(domainEvent = FindCommandsOnPrimaryFromDomainEvent.class, semantics = SemanticsOf.SAFE)
     public List<CommandJdo> findCommandsOnPrimaryFrom(
             @Nullable
-            @ParameterLayout(named="Unique Id")
-            final UUID uniqueId,
+            @ParameterLayout(named="Interaction Id")
+            final UUID interactionId,
             @Nullable
             @ParameterLayout(named="Batch size")
             final Integer batchSize)
             throws NotFoundException {
-        final List<CommandJdo> commands = commandServiceRepository.findSince(uniqueId, batchSize);
+        final List<CommandJdo> commands = commandServiceRepository.findSince(interactionId, batchSize);
         if(commands == null) {
-            throw new NotFoundException(uniqueId);
+            throw new NotFoundException(interactionId);
         }
         return commands;
     }
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java
index 54dbd6a..3d49a37 100644
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java
@@ -82,10 +82,10 @@ public class CommandReplayOnPrimaryService {
     public static class NotFoundException extends RecoverableException {
         private static final long serialVersionUID = 1L;
         @Getter
-        private final UUID uniqueId;
-        public NotFoundException(final UUID uniqueId) {
+        private final UUID interactionId;
+        public NotFoundException(final UUID interactionId) {
             super("Command not found");
-            this.uniqueId = uniqueId;
+            this.interactionId = interactionId;
         }
     }
 
@@ -93,7 +93,7 @@ public class CommandReplayOnPrimaryService {
      * These actions should be called with HTTP Accept Header set to:
      * <code>application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v1.CommandsDto"</code>
      *
-     * @param uniqueId - to search from.  This transactionId will <i>not</i> be included in the response.
+     * @param interactionId - to search from.  This transactionId will <i>not</i> be included in the response.
      * @param batchSize - the maximum number of commands to return.  If not specified, all found will be returned.
      * @throws NotFoundException - if the command with specified transaction cannot be found.
      */
@@ -102,13 +102,13 @@ public class CommandReplayOnPrimaryService {
     @MemberOrder(sequence="40")
     public List<CommandJdo> findCommands(
             @Nullable
-            @ParameterLayout(named="Unique Id")
-            final UUID uniqueId,
+            @ParameterLayout(named="Interaction Id")
+            final UUID interactionId,
             @Nullable
             @ParameterLayout(named="Batch size")
             final Integer batchSize)
             throws NotFoundException {
-        return commandRetrievalService.findCommandsOnPrimaryFrom(uniqueId, batchSize);
+        return commandRetrievalService.findCommandsOnPrimaryFrom(interactionId, batchSize);
     }
     public Integer default1FindCommandsOnPrimaryFrom() {
         return commandRetrievalService.default1FindCommandsOnPrimaryFrom();
@@ -121,7 +121,7 @@ public class CommandReplayOnPrimaryService {
      * These actions should be called with HTTP Accept Header set to:
      * <code>application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v1.CommandsDto"</code>
      *
-     * @param uniqueId - to search from.  This transactionId will <i>not</i> be included in the response.
+     * @param interactionId - to search from.  This transactionId will <i>not</i> be included in the response.
      * @param batchSize - the maximum number of commands to return.  If not specified, all found will be returned.
      * @throws NotFoundException - if the command with specified transaction cannot be found.
      */
@@ -130,11 +130,11 @@ public class CommandReplayOnPrimaryService {
     @MemberOrder(sequence="50")
     public Clob downloadCommands(
             @Nullable
-            final UUID uniqueId,
+            final UUID interactionId,
             @Nullable
             final Integer batchSize,
             final String filenamePrefix) {
-        final List<CommandJdo> commands = commandServiceRepository.findSince(uniqueId, batchSize);
+        final List<CommandJdo> commands = commandServiceRepository.findSince(interactionId, batchSize);
         if(commands == null) {
             messageService.informUser("No commands found");
         }
@@ -143,7 +143,7 @@ public class CommandReplayOnPrimaryService {
                 contentMappingServiceForCommandsDto.map(commands);
 
         final String fileName = String.format(
-                "%s_%s.xml", filenamePrefix, elseDefault(uniqueId));
+                "%s_%s.xml", filenamePrefix, elseDefault(interactionId));
 
         final String xml = jaxbService.toXml(commandsDto);
         return new Clob(fileName, "application/xml", xml);
@@ -162,23 +162,23 @@ public class CommandReplayOnPrimaryService {
      * This action should be called with HTTP Accept Header set to:
      * <code>application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v1.CommandDto"</code>
      *
-     * @param uniqueId - to download.
+     * @param interactionId - to download.
      * @throws NotFoundException - if the command with specified transaction cannot be found.
      */
     @Action(domainEvent = DownloadCommandByIdDomainEvent.class, semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa = "fa-download")
     @MemberOrder(sequence="50")
     public Clob downloadCommandById(
-            final UUID uniqueId,
+            final UUID interactionId,
             final String filenamePrefix) {
 
-        return commandServiceRepository.findByUniqueId(uniqueId)
+        return commandServiceRepository.findByInteractionId(interactionId)
                 .map(commandJdo -> {
 
                     final CommandDto commandDto = commandJdo.getCommandDto();
 
                     final String fileName = String.format(
-                            "%s_%s.xml", filenamePrefix, elseDefault(uniqueId));
+                            "%s_%s.xml", filenamePrefix, elseDefault(interactionId));
 
                     final String xml = jaxbService.toXml(commandDto);
                     return new Clob(fileName, "application/xml", xml);
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java
index 6f1b820..c2bb972 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java
@@ -105,12 +105,12 @@ public class CommandFetcher {
     }
 
 
-    private URI buildUri(final UUID uniqueId) {
+    private URI buildUri(final UUID interactionId) {
         final UriBuilder uriBuilder = UriBuilder.fromUri(
-                uniqueId != null
+                interactionId != null
                         ? String.format(
-                            "%s%s?uniqueId=%s&batchSize=%d",
-                            secondaryConfig.getPrimaryBaseUrlRestful(), URL_SUFFIX, uniqueId, secondaryConfig.getBatchSize())
+                            "%s%s?interactionId=%s&batchSize=%d",
+                            secondaryConfig.getPrimaryBaseUrlRestful(), URL_SUFFIX, interactionId, secondaryConfig.getBatchSize())
                         : String.format(
                             "%s%s?batchSize=%d",
                             secondaryConfig.getPrimaryBaseUrlRestful(), URL_SUFFIX, secondaryConfig.getBatchSize())
diff --git a/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc b/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc
index 7f48744..568cbc5 100644
--- a/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc
+++ b/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc
@@ -15,7 +15,7 @@ The module also provides:
 * `AuditingServiceRepository` service to to search for persisted `AuditEntry``s.
 None of its actions are visible in the user interface (they are all `@Programmatic`).
 
-* `AuditingServiceContributions` which contributes collections to the xref:refguide:applib-classes:mixins.adoc[HasUniqueId] interface.
+* `AuditingServiceContributions` which contributes collections to the xref:refguide:applib-classes:mixins.adoc[HasInteractionId] interface.
 This will therefore display all audit entries that occurred in a given request/transaction, in other words whenever a command, a published event or another audit entry is displayed.
 
 These services can be activated by updating the `pom.xml` and updating the `AppManifest#getModules()` method.
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiBuilderFx.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiBuilderFx.java
index 41ddab9..6996e24 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiBuilderFx.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiBuilderFx.java
@@ -45,7 +45,7 @@ import lombok.extern.log4j.Log4j2;
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 @Log4j2
 public class UiBuilderFx implements InteractionScopeAware {
-    
+
     private final ApplicationContext springContext;
     private final JavaFxViewerConfig viewerConfig;
 
@@ -70,32 +70,32 @@ public class UiBuilderFx implements InteractionScopeAware {
     public void beforeEnteringTransactionalBoundary(InteractionSession interactionSession) {
         //TODO this would be the place to indicate to the user, that a long running task has started
         //scene.getRoot().cursorProperty().set(Cursor.WAIT);
-        _Probe.errOut("Interaction HAS_STARTED conversationId=%s", interactionSession.getUniqueId());
+        _Probe.errOut("Interaction HAS_STARTED conversationId=%s", interactionSession.getInteractionId());
     }
-    
+
     @Override
     public void afterLeavingTransactionalBoundary(InteractionSession interactionSession) {
         //TODO this would be the place to indicate to the user, that a long running task has ended
         //scene.getRoot().cursorProperty().set(Cursor.DEFAULT);
-        _Probe.errOut("Interaction IS_ENDING conversationId=%s", interactionSession.getUniqueId());
+        _Probe.errOut("Interaction IS_ENDING interactionId=%s", interactionSession.getInteractionId());
     }
-    
+
     // -- HELPER
-        
+
     private void setupTitle(Stage stage) {
         val title = Optional.ofNullable(viewerConfig.getApplicationTitle())
                 .orElse("Unknonw Title");
         stage.setTitle(title);
     }
-    
+
     private void setupIcon(Stage stage) {
         val icon = viewerConfig.getApplicationIcon();
         if(icon==null) {
-            return; 
+            return;
         }
         stage.getIcons().add(icon);
     }
-    
-    
+
+
 
 }
diff --git a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/JdoCommandPublishingTest.java b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/JdoCommandPublishingTest.java
index 165d844..a57c0f7 100644
--- a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/JdoCommandPublishingTest.java
+++ b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/JdoCommandPublishingTest.java
@@ -51,7 +51,7 @@ import lombok.val;
                 Configuration_usingJdo.class,
                 Configuration_usingCommandPublishing.class,
                 ApplicationLayerTestFactory.class
-        }, 
+        },
         properties = {
                 "logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisTransactionJdo=DEBUG",
                 "logging.level.org.apache.isis.core.runtimeservices.session.IsisInteractionFactoryDefault=DEBUG",
@@ -73,40 +73,40 @@ class JdoCommandPublishingTest extends IsisIntegrationTestAbstract {
     private void given() {
         CommandSubscriberForTesting.clearPublishedCommands(kvStore);
     }
-    
+
     private void verify(VerificationStage verificationStage) {
         switch(verificationStage) {
-        
+
         case FAILURE_CASE:
             assertHasCommandEntries(Can.empty());
             break;
         case POST_INTERACTION:
-        
-            
+
+
 //            Interaction interaction = null;
 //            String propertyId = "org.apache.isis.testdomain.jdo.entities.JdoBook#name";
 //            Object target = null;
 //            Object argValue = "Book #2";
 //            String targetMemberName = "name???";
 //            String targetClass = "org.apache.isis.testdomain.jdo.entities.JdoBook";
-            
+
             val propertyDto = new PropertyDto();
             propertyDto.setLogicalMemberIdentifier("testdomain.jdo.Book#name");
-            
+
             val command = new Command(UUID.randomUUID());
             val commandDto = new CommandDto();
-            commandDto.setTransactionId(command.getUniqueId().toString());
+            commandDto.setInteractionId(command.getInteractionId().toString());
             commandDto.setMember(propertyDto);
 
             command.updater().setCommandDto(commandDto);
-            
+
             assertHasCommandEntries(Can.of(command));
             break;
         default:
             // ignore ... no checks
         }
     }
-    
+
     // -- HELPER
 
     private void assertHasCommandEntries(Can<Command> expectedCommands) {
@@ -114,19 +114,19 @@ class JdoCommandPublishingTest extends IsisIntegrationTestAbstract {
         CollectionAssertions.assertComponentWiseEquals(
                 expectedCommands, actualCommands, this::commandDifference);
     }
-    
+
     private String commandDifference(Command a, Command b) {
         if(!Objects.equals(a.getLogicalMemberIdentifier(), b.getLogicalMemberIdentifier())) {
-            return String.format("differing member identifier %s != %s", 
+            return String.format("differing member identifier %s != %s",
                     a.getLogicalMemberIdentifier(), b.getLogicalMemberIdentifier());
         }
         if(!Objects.equals(a.getResult(), b.getResult())) {
-            return String.format("differing results %s != %s", 
+            return String.format("differing results %s != %s",
                     a.getResult(), b.getResult());
         }
         return null; // no difference
     }
-    
+
 
 
 }


[isis] 03/11: ISIS-439: further work removing dead code re: mutable collections

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

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

commit 75bb549b84d066e632f6a2401c499f78eefe0ca1
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Mar 3 07:04:12 2021 +0000

    ISIS-439: further work removing dead code re: mutable collections
---
 .../events/domain/CollectionDomainEvent.java       |  35 -------
 .../core/metamodel/facets/DomainEventHelper.java   | 110 ++++++++-------------
 .../modify/CollectionDomainEventFacetAbstract.java |   2 -
 ...HelperTest_newCollectionDomainEvent_forAdd.java |   6 +-
 ...perTest_newCollectionDomainEvent_forRemove.java |   6 +-
 5 files changed, 49 insertions(+), 110 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
index 6d4c57c..7b1c489 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
@@ -93,32 +93,6 @@ public abstract class CollectionDomainEvent<S,T> extends AbstractDomainEvent<S>
     @Getter
     private T value;
 
-    public static enum Of {
-        /**
-         * The collection is being accessed
-         * ({@link AbstractDomainEvent.Phase#HIDE hide} and
-         * {@link AbstractDomainEvent.Phase#DISABLE disable}) checks.
-         */
-        ACCESS,
-
-        /**
-         * The collection is being added to
-         * ({@link AbstractDomainEvent.Phase#VALIDATE validity} check and
-         * {@link AbstractDomainEvent.Phase#EXECUTED execution}).
-         */
-        ADD_TO,
-
-        /**
-         * The collection is being removed from
-         * ({@link AbstractDomainEvent.Phase#VALIDATE validity} check and
-         * {@link AbstractDomainEvent.Phase#EXECUTED execution}).
-         */
-        REMOVE_FROM
-
-    }
-
-    @Getter
-    private Of of;
 
     /**
      * Not API, set by the framework.
@@ -126,14 +100,6 @@ public abstract class CollectionDomainEvent<S,T> extends AbstractDomainEvent<S>
     public void setValue(T value) {
         this.value = value;
     }
-    /**
-     * Not API; updates from {@link Of#ACCESS} to either {@link Of#ADD_TO}
-     * or {@link Of#REMOVE_FROM} when hits the
-     * {@link AbstractDomainEvent.Phase#VALIDATE validation phase}.
-     */
-    public void setOf(Of of) {
-        this.of = of;
-    }
 
 
     private static final ToString<CollectionDomainEvent<?,?>> toString =
@@ -141,7 +107,6 @@ public abstract class CollectionDomainEvent<S,T> extends AbstractDomainEvent<S>
     toString("source", CollectionDomainEvent::getSource)
     .thenToString("identifier", CollectionDomainEvent::getIdentifier)
     .thenToString("eventPhase", CollectionDomainEvent::getEventPhase)
-    .thenToString("of", CollectionDomainEvent::getOf)
     .thenToString("value", CollectionDomainEvent::getValue)
     ;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
index 8029c45..56cb6d6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
@@ -67,7 +67,7 @@ public class DomainEventHelper {
     private final MetamodelEventService metamodelEventService;
 
     // -- postEventForAction
-    
+
     // variant using eventType and no existing event
     public ActionDomainEvent<?> postEventForAction(
             final AbstractDomainEvent.Phase phase,
@@ -77,12 +77,12 @@ public class DomainEventHelper {
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
             final ManagedObject resultAdapter) {
-        
-        return postEventForAction(phase, uncheckedCast(eventType), /*existingEvent*/null, 
-                objectAction, identified, 
+
+        return postEventForAction(phase, uncheckedCast(eventType), /*existingEvent*/null,
+                objectAction, identified,
                 head, argumentAdapters, resultAdapter);
     }
-    
+
     // variant using existing event and not eventType (is derived from event)
     public ActionDomainEvent<?> postEventForAction(
             final AbstractDomainEvent.Phase phase,
@@ -92,9 +92,9 @@ public class DomainEventHelper {
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
             final ManagedObject resultAdapter) {
-        
-        return postEventForAction(phase, 
-                uncheckedCast(existingEvent.getClass()), existingEvent, objectAction, identified, 
+
+        return postEventForAction(phase,
+                uncheckedCast(existingEvent.getClass()), existingEvent, objectAction, identified,
                 head, argumentAdapters, resultAdapter);
     }
 
@@ -107,7 +107,7 @@ public class DomainEventHelper {
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
             final ManagedObject resultAdapter) {
-        
+
         _Assert.assertTypeIsInstanceOf(eventType, ActionDomainEvent.class);
 
         try {
@@ -166,7 +166,7 @@ public class DomainEventHelper {
             final Class<? extends ActionDomainEvent<S>> type,
             final Identifier identifier,
             final S source,
-            final Object... arguments) 
+            final Object... arguments)
         throws IllegalArgumentException,
             NoSuchMethodException, SecurityException {
 
@@ -174,19 +174,19 @@ public class DomainEventHelper {
 
         val noArgConstructor = constructors.filter(paramCount(0)).getFirst().orElse(null);
         if(noArgConstructor!=null) {
-            
+
             final Object event = invokeConstructor(noArgConstructor);
             final ActionDomainEvent<S> ade = uncheckedCast(event);
-            
+
             ade.initSource(source);
             ade.setIdentifier(identifier);
             ade.setArguments(asList(arguments));
             return ade;
         }
-        
+
 
         // else
-        
+
         val updateEventConstructor = constructors
                 .filter(paramCount(3)
                         .and(paramAssignableFrom(0, source.getClass()))
@@ -195,12 +195,12 @@ public class DomainEventHelper {
                         )
                 .getFirst()
                 .orElse(null);
-        
+
         if(updateEventConstructor!=null) {
             val event = invokeConstructor(updateEventConstructor, source, identifier, arguments);
-            return uncheckedCast(event);    
+            return uncheckedCast(event);
         }
-        
+
         throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", [Ljava.lang.Object;)");
     }
 
@@ -221,7 +221,7 @@ public class DomainEventHelper {
             final InteractionHead head,
             final T oldValue,
             final T newValue) {
-        
+
         _Assert.assertTypeIsInstanceOf(eventType, PropertyDomainEvent.class);
 
         try {
@@ -232,10 +232,10 @@ public class DomainEventHelper {
                 event = existingEvent;
             } else {
                 // all other phases, create a new event
-                
+
                 final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
                 final Identifier identifier = identified.getIdentifier();
-                
+
                 event = newPropertyDomainEvent(eventType, identifier, source, oldValue, newValue);
 
                 // copy over if have
@@ -271,7 +271,7 @@ public class DomainEventHelper {
         val constructors = _Reflect.getPublicConstructors(type);
 
         val noArgConstructors = constructors.filter(paramCount(0));
-        
+
         for (val constructor : noArgConstructors) {
             final Object event = invokeConstructor(constructor);
             final PropertyDomainEvent<S, T> pde = uncheckedCast(event);
@@ -292,7 +292,7 @@ public class DomainEventHelper {
                         .and(paramAssignableFromValue(2, oldValue))
                         .and(paramAssignableFromValue(3, newValue))
                         );
-        
+
         for (val constructor : updateEventConstructors) {
             val event = invokeConstructor(constructor, source, identifier, oldValue, newValue);
             return uncheckedCast(event);
@@ -308,14 +308,13 @@ public class DomainEventHelper {
     public <S, T> CollectionDomainEvent<S, T> postEventForCollection(
             AbstractDomainEvent.Phase phase,
             final Class<? extends CollectionDomainEvent<S, T>> eventType,
-                    final CollectionDomainEvent<S, T> existingEvent,
-                    final IdentifiedHolder identified,
-                    final InteractionHead head,
-                    final CollectionDomainEvent.Of of,
-                    final T reference) {
-        
+            final CollectionDomainEvent<S, T> existingEvent,
+            final IdentifiedHolder identified,
+            final InteractionHead head,
+            final T reference) {
+
         _Assert.assertTypeIsInstanceOf(eventType, CollectionDomainEvent.class);
-        
+
         try {
             final CollectionDomainEvent<S, T> event;
             if (existingEvent != null && phase.isExecuted()) {
@@ -325,7 +324,7 @@ public class DomainEventHelper {
                 // all other phases, create a new event
                 final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
                 final Identifier identifier = identified.getIdentifier();
-                event = newCollectionDomainEvent(eventType, phase, identifier, source, of, reference);
+                event = newCollectionDomainEvent(eventType, phase, identifier, source, reference);
 
                 // copy over if have
                 head.getMixedIn()
@@ -344,72 +343,49 @@ public class DomainEventHelper {
 
     <S, T> CollectionDomainEvent<S, T> newCollectionDomainEvent(
             final Class<? extends CollectionDomainEvent<S, T>> type,
-                    final AbstractDomainEvent.Phase phase,
-                    final Identifier identifier,
-                    final S source,
-                    final CollectionDomainEvent.Of of,
-                    final T value)
-                            throws NoSuchMethodException, SecurityException, InstantiationException,
-                            IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+            final AbstractDomainEvent.Phase phase,
+            final Identifier identifier,
+            final S source,
+            final T value)
+            throws NoSuchMethodException, SecurityException,
+            IllegalArgumentException {
 
         val constructors = _Reflect.getPublicConstructors(type);
 
         val noArgConstructors = constructors.filter(paramCount(0));
-        
+
         for (val constructor : noArgConstructors) {
             final Object event = invokeConstructor(constructor);
             final CollectionDomainEvent<S, T> cde = uncheckedCast(event);
 
             cde.initSource(source);
             cde.setIdentifier(identifier);
-            cde.setOf(of);
             cde.setValue(value);
             return cde;
         }
-        
+
         // else
         // search for constructor accepting source, identifier, type, value
         val updateEventConstructors = constructors
                 .filter(paramCount(4)
                         .and(paramAssignableFrom(0, source.getClass()))
                         .and(paramAssignableFrom(1, Identifier.class))
-                        .and(paramAssignableFrom(2, CollectionDomainEvent.Of.class))
-                        .and(paramAssignableFromValue(3, value))
+                        .and(paramAssignableFromValue(2, value))
                         );
-        
+
         for (val constructor : updateEventConstructors) {
-            val event = invokeConstructor(constructor, source, identifier, of, value);
+            val event = invokeConstructor(constructor, source, identifier, value);
             return uncheckedCast(event);
         }
-        
-        // else
 
-        if(phase == AbstractDomainEvent.Phase.EXECUTED) {
-            if(of == CollectionDomainEvent.Of.ADD_TO 
-                    || of == CollectionDomainEvent.Of.REMOVE_FROM) {
-                // support for annotations @PostsCollectionAddedTo and @PostsCollectionRemovedFrom:
-                // search for constructor accepting source, identifier, value
-                val eventConstructors = constructors
-                        .filter(paramCount(3)
-                                .and(paramAssignableFrom(0, source.getClass()))
-                                .and(paramAssignableFrom(1, Identifier.class))
-                                .and(paramAssignableFromValue(2, value))
-                                );
-                for (val constructor : eventConstructors) {
-                    val event = invokeConstructor(constructor, source, identifier, value);
-                    return uncheckedCast(event);
-                }
-            }
-        }
-        
         // else
         throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object)");
     }
 
     private static <T> T invokeConstructor(
-            @NonNull final Constructor<T> constructor, 
+            @NonNull final Constructor<T> constructor,
             final Object... args){
-        
+
         try {
             return constructor.newInstance(args);
         } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
@@ -418,6 +394,6 @@ public class DomainEventHelper {
                     "failed to invoke constructor %s", constructor, e);
         }
     }
-    
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
index d63ec04..e400f70 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
@@ -76,7 +76,6 @@ public abstract class CollectionDomainEventFacetAbstract
                         AbstractDomainEvent.Phase.HIDE,
                         getEventType(), null,
                         getIdentified(), ic.getHead(),
-                        CollectionDomainEvent.Of.ACCESS,
                         null);
         if (event != null && event.isHidden()) {
             return "Hidden by subscriber";
@@ -92,7 +91,6 @@ public abstract class CollectionDomainEventFacetAbstract
                         AbstractDomainEvent.Phase.DISABLE,
                         getEventType(), null,
                         getIdentified(), ic.getHead(),
-                        CollectionDomainEvent.Of.ACCESS,
                         null);
         if (event != null && event.isDisabled()) {
             final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
index d586a41..5ae89a1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
@@ -48,7 +48,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                CollectionDomainEvent.Default.class, null, identifier, sdo, CollectionDomainEvent.Of.ADD_TO, other);
+                CollectionDomainEvent.Default.class, null, identifier, sdo, other);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
@@ -63,7 +63,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.ADD_TO, other);
+                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
@@ -78,7 +78,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                SomeDomainObjectCollectionDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.ADD_TO, other);
+                SomeDomainObjectCollectionDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
index b07c9e2..dc2c6d0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
@@ -48,7 +48,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.REMOVE_FROM, other);
+                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
@@ -63,7 +63,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.REMOVE_FROM, other);
+                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
@@ -78,7 +78,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                SomeDomainObjectCollectionRemovedFromDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.REMOVE_FROM, other);
+                SomeDomainObjectCollectionRemovedFromDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));


[isis] 01/11: ISIS-2444: cleaning up domain event docs

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

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

commit bd04df898b07c633be6cd62a015f88e71cd70b59
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Mar 3 06:44:19 2021 +0000

    ISIS-2444: cleaning up domain event docs
---
 .../applib-classes/pages/events/domainevent.adoc   |  51 ++++-----
 .../events/domainevent/AbstractDomainEvent.adoc    | 109 -------------------
 .../events/domainevent/ActionDomainEvent.adoc      |  49 ---------
 .../events/domainevent/CollectionDomainEvent.adoc  |  12 --
 .../applib/events/domain/AbstractDomainEvent.java  | 121 ++++++++++++++++-----
 .../applib/events/domain/ActionDomainEvent.java    | 105 ++++++++++++++----
 .../events/domain/CollectionDomainEvent.java       |  52 ++++++---
 .../applib/events/domain/PropertyDomainEvent.java  |   7 +-
 .../main/adoc/modules/metamodel/pages/about.adoc   |   2 +-
 persistence/jpa/adoc/modules/ROOT/pages/about.adoc |   2 +-
 security/adoc/modules/ROOT/pages/about.adoc        |   4 +-
 testing/adoc/modules/ROOT/pages/about.adoc         |   4 +-
 12 files changed, 240 insertions(+), 278 deletions(-)

diff --git a/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc
index 8be777f..a26d546 100644
--- a/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc
@@ -7,54 +7,43 @@
 This section catalogues the various domain event classes defined by Apache Isis.
 
 These events are broadcast on the xref:refguide:applib:index/services/eventbus/EventBusService.adoc[EventBusService].
-The domain events are broadcast as a result of being specified in the xref:refguide:applib:index/annotation/Action.adoc#domainEvent[@Action#domainEvent()],  xref:refguide:applib:index/annotation/Property.adoc#domainEvent[@Property#domainEvent()] or xref:refguide:applib:index/annotation/Collection.adoc#domainEvent[@Collection#domainEvent()] attributes.
+The domain events are broadcast as a result of being specified in the ,   or xref:refguide:applib:index/annotation/Collection.adoc#domainEvent[@Collection#domainEvent()] attributes.
 
 They are listed in the table below.
 
 .Domain Event Classes
-[cols="1a,2a,2a", options="header"]
+[cols="1a,2a,2a,2a", options="header"]
 |===
 
 |API
-|Implementation
-|Notes
+|Raised by
+|Fallback +
+Implementation
+|Published when
 
 
-|xref:applib-classes:events.adoc#AbstractDomainEvent[`o.a.i.applib.` +
-`AbstractDomainEvent`]
+|xref:refguide:applib:index/events/domain/AbstractDomainEvent.adoc[AbstractDomainEvent]
+|n/a
 |(abstract class)
 |Superclass of the other domain events, listed below in this table.
 
 
-|xref:applib-classes:events.adoc#ActionDomainEvent[`o.a.i.applib.` +
-`ActionDomainEvent`]
-|(abstract class). +
-`ActionDomainEvent.Default` is the concrete implementation used if no `@Action#domainEvent` attribute is specified
-|Broadcast whenever there is an interaction (hide/disable/validate/pre-execute/post-execute) with an object's action.
+|xref:refguide:applib:index/events/domain/ActionDomainEvent.adoc[ActionDomainEvent]
+|xref:refguide:applib:index/annotation/Action.adoc#domainEvent[@Action#domainEvent()]
+|`ActionDomainEvent.Default`
+|(hide/disable/validate/pre-execute/post-execute) with an object's action.
 
+|xref:refguide:applib:index/events/domain/CollectionDomainEvent.adoc[CollectionDomainEvent]
+|xref:refguide:applib:index/annotation/Collection.adoc#domainEvent[@Collection#domainEvent()]
+|`CollectionDomainEvent.Default`
+|hide an object's collection.
 
-|xref:applib-classes:events.adoc#CollectionDomainEvent[`o.a.i.applib.` +
-`CollectionDomainEvent`]
-|(abstract class). +
-`CollectionDomainEvent.Default` is the concrete implementation used if no `@Collection#domainEvent` attribute
-is specified.
-|Broadcast whenever there is an interaction (hide/disable/validate/access) with an object's collection.
 
-
-|xref:applib-classes:events.adoc#PropertyDomainEvent[`o.a.i.applib.` +
-`PropertyDomainEvent`]
-|(abstract class). +
-`PropertyDomainEvent.Default` is the concrete implementation used if no `@Propert#domainEvent` attribute is specified
-|Broadcast whenever there is an interaction (hide/disable/validate/access) with an object's property.
+|xref:refguide:applib:index/events/domain/PropertyDomainEvent.adoc[PropertyDomainEvent]
+|xref:refguide:applib:index/annotation/Property.adoc#domainEvent[@Property#domainEvent()]
+|`PropertyDomainEvent.Default`
+|hide/disable/validate/pre-edit/post-edit with an object's property.
 
 
 |===
 
-
-
-
-
-include::domainevent/AbstractDomainEvent.adoc[leveloffset=+1]
-include::domainevent/ActionDomainEvent.adoc[leveloffset=+1]
-include::domainevent/CollectionDomainEvent.adoc[leveloffset=+1]
-include::domainevent/PropertyDomainEvent.adoc[leveloffset=+1]
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/AbstractDomainEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/domainevent/AbstractDomainEvent.adoc
deleted file mode 100644
index a20d5d8..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/AbstractDomainEvent.adoc
+++ /dev/null
@@ -1,109 +0,0 @@
-[[AbstractDomainEvent]]
-= `AbstractDomainEvent`
-
-: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 [...]
-:page-partial:
-
-
-This class is the superclass for all domain events that are raised by the framework when interacting with actions, properties or collections.
-
-Its immediate subclasses are:
-
-* xref:applib-classes:events.adoc#ActionDomainEvent[ActionDomainEvent]
-* xref:applib-classes:events.adoc#PropertyDomainEvent[PropertyDomainEvent]
-* xref:applib-classes:events.adoc#CollectionDomainEvent[CollectionDomainEvent]
-
-The main purpose of the class is to define the protocol by which subscribers can influence an interaction (eg hide a collection, disable a property, validate action arguments).
-It class also provides a simple mechanism to allow adhoc sharing of user data between different phases.
-
-== API
-
-The API of the class is:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public abstract class AbstractDomainEvent<S> extends java.util.EventObject {
-
-    public S getSource();                                           // <.>
-    public Object getMixedIn();                                     // <.>
-    public Object getSubject();                                     // <.>
-
-    public Identifier getIdentifier();                              // <.>
-
-    public Phase getEventPhase();                                   // <.>
-
-    public void hide();                                             // <.>
-    public boolean isHidden();                                      // <.>
-
-    public void disable(final String reason);                       // <.>
-    public void disable(final TranslatableString reason);
-    public String getDisabledReason();                              // <.>
-    public TranslatableString getDisabledReasonTranslatable();
-    public boolean isDisabled();
-
-    public void invalidate(final String reason);                    // <.>
-    public void invalidate(final TranslatableString reason);
-    public String getInvalidityReason();                            // <.>
-    public TranslatableString getInvalidityReasonTranslatable();
-    public boolean isInvalid();
-
-    public void veto(final String reason, final Object... args);    // <.>
-    public void veto(final TranslatableString translatableReason);
-
-    public Object get(Object key);                                  // <.>
-    public void put(Object key, Object value);
-}
-----
-
-<.> The domain object raising this event.
-+
-For a "regular" action, property or collection then this will be the target domain object.
-But for a "mixin" action, this will be an instance of the mixin itself.
-
-<.> For a "mixin", this will be the target object that is being contributed to.
-+
-For a "regular" action, this will return `null`.
-
-<.> Returns the domain object being interacted with, irrespective of whether this is a "regular" action/property/collection or a "mixin".
-+
-* For a regular member, this will return the same as `getSource()`.
-+
-* For a mixin, this will return the same as `getMixedIn()`.
-
-<.> Identifier of the action, property or collection being interacted with.
-
-<.> Whether the framework is checking visibility, enablement, validity or actually executing (invoking action, editing property), as per the `Phase` enum (defined below).
-
-<.> API for subscribers to hide the member
-
-<.> Used by the framework to determine if the member should be hidden (not rendered)
-
-<.> API for subscribers to disable the member, specifying the reason why (possibly translated)
-
-<.> Used by the framework to determine whether the member should be disabled (greyed out) when rendered.
-
-<.> API for subscribers to invalidate an interaction, eg invalid arguments to an action
-
-<.> Used by the framework to determine whether the interaction is invalid and should be blocked (eg pressing OK shows message)
-
-<.> Convenience API for subscribers to veto; will automatically call either `hide()`, `disable(...)` or `invalidate(...)` based on the phase
-
-<.> Mechanism to allow subscribers to share arbitrary information between phases.
-One event instance is used for both the hide and disable phases, and a different event instance is shared between validate/pre-execute/post-execute.
-
-The referenced `Phase` enum is in turn:
-
-[source,java]
-----
-public enum Phase {
-    HIDE,
-    DISABLE,
-    VALIDATE,
-    EXECUTING,
-    EXECUTED;
-    public boolean isValidatingOrLater();    // <.>
-}
-----
-<.> The significance being that at this point the proposed values/arguments are known, and so the event can be fully populated.
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/ActionDomainEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/domainevent/ActionDomainEvent.adoc
deleted file mode 100644
index d647dcf..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/ActionDomainEvent.adoc
+++ /dev/null
@@ -1,49 +0,0 @@
-[[ActionDomainEvent]]
-= `ActionDomainEvent`
-
-: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 [...]
-:page-partial:
-
-
-Subclass of xref:applib-classes:events.adoc#AbstractDomainEvent[AbstractDomainEvent] for actions.
-
-The class has a number of responsibilities (in addition to those it inherits):
-
-* capture the target object being interacted with
-* capture the arguments for each of the action's parameters
-* provide selected metadata about the action parameters from the metamodel (names, types)
-
-The class itself is instantiated automatically by the framework whenever interacting with a rendered object's action.
-
-== API
-
-The API of the class is:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public abstract class ActionDomainEvent<S> extends AbstractDomainEvent<S> {
-
-    public static class Default extends ActionDomainEvent<Object> { }   // <.>
-    public static class Noop extends ActionDomainEvent<Object> { }      // <.>
-    public static class Doop extends ActionDomainEvent<Object> { }      // <.>
-
-    public SemanticsOf getSemantics();
-
-    public List<String> getParameterNames();
-    public List<Class<?>> getParameterTypes();
-
-    public List<Object> getArguments();                                 // <.>
-    public Object getReturnValue();                                     // <.>
-    public void setReturnValue();                                       // <.>
-}
-----
-<.> The `Default` nested static class is the default for the xref:refguide:applib:index/annotation/Action.adoc#domainEvent[@Action#domainEvent()]
-annotation attribute.
-Whether this raises an event or not depends upon the `isis.reflector.facet.actionAnnotation.domainEvent.postForDefault` configuration property.
-<.> The `Noop` class is provided as a convenience to indicate that an event should _not_ be posted (irrespective of the configuration property setting).
-<.> Similarly, the `Doop` class is provided as a convenience to indicate that an event _should_ be raised (irrespective of the configuration property setting).
-<.> The arguments being used to invoke the action; populated during validate phase and subsequent phases.
-<.> The value returned by the action; populated only in the executed phase.
-<.> Allows the subscriber to effectively change the value returned by the action; may only be called in the executed phase.
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/CollectionDomainEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/domainevent/CollectionDomainEvent.adoc
index 02826ac..e35af06 100644
--- a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/CollectionDomainEvent.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/events/domainevent/CollectionDomainEvent.adoc
@@ -5,18 +5,6 @@
 :page-partial:
 
 
-Subclass of xref:applib-classes:events.adoc#AbstractDomainEvent[AbstractDomainEvent] for collections.
-
-The class has a couple of responsibilities (in addition to those it inherits):
-
-* capture the target object being interacted with
-
-* indicate whether the interaction is to add or remove an object from the collection (or simply to indicate that the collection is being accessed/read)
-
-* capture the object reference being added or removed
-
-
-The class itself is instantiated automatically by the framework whenever interacting with a rendered object's collection.
 
 == API
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/AbstractDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/AbstractDomainEvent.java
index 08ddedf..2bfa27e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/AbstractDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/AbstractDomainEvent.java
@@ -21,6 +21,8 @@ package org.apache.isis.applib.events.domain;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.events.EventObjectBase;
 import org.apache.isis.applib.services.i18n.TranslatableString;
@@ -31,6 +33,24 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 import lombok.Getter;
 
 /**
+ * Superclass for all domain events that are raised by the framework when
+ * interacting with actions, properties or collections.
+ *
+ * <p>
+ *     The main purpose of the class is to define the protocol by which
+ *     subscribers can influence an interaction (eg hide a collection,
+ *     disable a property, validate action arguments).
+ * </p>
+ *
+ * <p>
+ *     The class also provides a simple mechanism to allow adhoc sharing of
+ *     user data between different phases.
+ * </p>
+ *
+ * @see ActionDomainEvent
+ * @see PropertyDomainEvent
+ * @see CollectionDomainEvent
+ *
  * @since 1.x {@index}
  */
 public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
@@ -55,7 +75,31 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
     }
 
     /**
-     * Populated only for mixins; holds the underlying domain object that the mixin contributes to.
+     * The domain object raising this event.
+     *
+     * <p>
+     * For a "regular" action, property or collection then this will be the
+     * target domain object.
+     * </p>
+     *
+     * <p>
+     *     But for a "mixin" action, this will be an instance of the mixin
+     *     itself.
+     * </p>
+     */
+    @Nullable
+    @Override
+    public S getSource() {
+        return super.getSource();
+    }
+
+    /**
+     * Populated only for mixins; holds the underlying domain object that the
+     * mixin contributes to.
+     *
+     * <p>
+     * For a "regular" action, this will return <code>null</code>.
+     * </p>
      */
     @Getter
     private Object mixedIn;
@@ -69,7 +113,8 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
 
 
     /**
-     * The subject of the event, which will be either the {@link #getSource() source} for a regular action, or the
+     * The subject of the event, which will be either the
+     * {@link #getSource() source} for a regular action, or the
      * {@link #getMixedIn() mixed-in} domain object for a mixin.
      */
     public Object getSubject() {
@@ -77,6 +122,10 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
         return mixedIn != null ? mixedIn : getSource();
     }
 
+    /**
+     *
+     * {@index}
+     */
     public enum Phase {
 
         HIDE,
@@ -132,7 +181,8 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
     }
 
     /**
-     * If the no-arg constructor is used, then the framework will populate this field reflectively.
+     * Identifier of the action, property or collection being interacted with.
+     *
      */
     @Getter
     private Identifier identifier;
@@ -144,21 +194,25 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
         this.identifier = identifier;
     }
 
+    /**
+     * Used by the framework to determine if the member should be hidden (not
+     * rendered).
+     */
     @Getter
     private boolean hidden;
 
     /**
+     * API for subscribers to hide the member.
+     *
      * @see #veto(String, Object...)
      */
     public void hide() {
-
         this.hidden = true;
-
-        // ...
     }
 
     /**
-     * If {@link #isDisabled() disabled}, then either this method returns non-null or {@link #getDisabledReasonTranslatable()} will.
+     * If {@link #isDisabled() disabled}, then either this method returns
+     * non-null or {@link #getDisabledReasonTranslatable()} will.
      */
     @Getter
     private String disabledReason;
@@ -175,36 +229,47 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
 
 
     /**
+     * API for subscribers to disable the member, specifying the reason why.
+     *
      * @see #disable(org.apache.isis.applib.services.i18n.TranslatableString)
      * @see #veto(String, Object...)
      */
     public void disable(final String reason) {
-
         this.disabledReason = reason;
-
-        // ...
     }
 
     /**
+     * API for subscribers to disable the member, specifying the reason why as
+     * a {@link TranslatableString}.
+     *
      * @see #disable(java.lang.String)
      * @see #veto(org.apache.isis.applib.services.i18n.TranslatableString)
      */
     public void disable(final TranslatableString reason) {
-
         this.disabledReasonTranslatable = reason;
-
-        // ...
     }
 
 
     /**
-     * If {@link #isInvalid() invalid}, then either this method returns non-null or {@link #getInvalidityReasonTranslatable()} will.
+     * Used by the framework to determine whether the interaction is invalid
+     * and should be blocked (eg pressing OK shows message).
+     *
+     * <p>
+     * If {@link #isInvalid() invalid}, then either this method returns
+     * non-null or {@link #getInvalidityReasonTranslatable()} will.
+     * </p>
      */
     @Getter
     private String invalidityReason;
 
     /**
-     * If {@link #isInvalid() invalid}, then either this method returns non-null or {@link #getInvalidityReason()} will.
+     * Used by the framework to determine whether the interaction is invalid
+     * and should be blocked (eg pressing OK shows message).
+     *
+     * <p>
+     * If {@link #isInvalid() invalid}, then either this method returns non-null
+     * or {@link #getInvalidityReason()} will.
+     * </p>
      */
     @Getter
     private TranslatableString invalidityReasonTranslatable;
@@ -214,36 +279,38 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
     }
 
     /**
+     * API for subscribers to invalidate an interaction, eg invalid arguments
+     * to an action.
+     *
      * @see #invalidate(org.apache.isis.applib.services.i18n.TranslatableString)
      * @see #veto(String, Object...)
      */
     public void invalidate(final String reason) {
-
         this.invalidityReason = reason;
-
-        // ...
     }
 
     /**
+     * API for subscribers to invalidate an interaction, specifying the reason
+     * as a {@link TranslatableString}.
+     *
      * @see #invalidate(String)
      * @see #veto(org.apache.isis.applib.services.i18n.TranslatableString)
      */
     public void invalidate(final TranslatableString reason) {
-
         this.invalidityReasonTranslatable = reason;
-
-        // ...
     }
 
     /**
-     * Use instead of {@link #hide()}, {@link #disable(String)} and {@link #invalidate(String)}; just delegates to
+     * Use instead of {@link #hide()}, {@link #disable(String)} and
+     * {@link #invalidate(String)}; just delegates to
      * appropriate vetoing method based upon the {@link #getEventPhase() phase}.
      *
      * <p>
      *     If hiding, just pass <tt>null</tt> for the parameter.
      * </p>
      *
-     * @param reason - reason why the interaction is being invalidated (ignored if in {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#HIDE hide} phase).
+     * @param reason - reason why the interaction is being invalidated (ignored
+     *              if in {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#HIDE hide} phase).
      * @param args
      *
      * @see #veto(org.apache.isis.applib.services.i18n.TranslatableString)
@@ -272,8 +339,6 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
         default:
             throw _Exceptions.unmatchedCase(getEventPhase());
         }
-
-        // ...
     }
 
     /**
@@ -306,8 +371,6 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
         default:
             throw _Exceptions.unmatchedCase(getEventPhase());
         }
-
-        // ...
     }
 
     /**
@@ -323,6 +386,10 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
     }
 
     /**
+     * Mechanism to allow subscribers to share arbitrary information between
+     * phases. One event instance is used for both the hide and disable phases,
+     * and a different event instance is shared between validate/pre-execute/post-execute.
+     *
      * Set user-data, for the use of a subsequent {@link #getEventPhase() phase}.
      */
     public void put(Object key, Object value) {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java
index a327141..983b711 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java
@@ -20,6 +20,7 @@ package org.apache.isis.applib.events.domain;
 
 import java.util.List;
 
+import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
@@ -28,47 +29,97 @@ import lombok.Getter;
 import lombok.Setter;
 
 /**
+ * Subclass of {@link AbstractDomainEvent} for actions.
+ *
+ * <p>
+ * The class has a number of responsibilities (in addition to those it inherits):
+ * </p>
+ *
+ * <ul>
+ *     <li>
+ *          capture the target object being interacted with
+ *     </li>
+ *     <li>
+ *          capture the arguments for each of the action's parameters
+ *     </li>
+ *     <li>
+ *          provide selected metadata about the action parameters from the
+ *          metamodel (names, types)
+ *     </li>
+ * </ul>
+ *
+ * <p>
+ * The class itself is instantiated automatically by the framework whenever
+ * interacting with a rendered object's action.
+ * </p>
+ *
  * @since 1.x {@index}
  */
 public abstract class ActionDomainEvent<S> extends AbstractDomainEvent<S> {
 
     /**
      * This class is the default for the
-     * {@link org.apache.isis.applib.annotation.Action#domainEvent()} annotation attribute.  Whether this
-     * raises an event or not depends upon the 
+     * {@link org.apache.isis.applib.annotation.Action#domainEvent()} annotation attribute.
+     *
+     * <p>
+     * Whether this raises an event or not depends upon the
      * <tt>isis.core.meta-model.annotation.action.domain-event.post-for-default</tt>
      * configuration property.
+     * </p>
      */
     public static class Default extends ActionDomainEvent<Object> {}
 
     /**
-     * Convenience class to use indicating that an event should <i>not</i> be posted 
-     * (irrespective of the configuration property setting for the {@link Default} event.
+     * Convenience class to use indicating that an event should <i>not</i> be
+     * posted (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Noop extends ActionDomainEvent<Object> {}
 
     /**
-     * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event..
+     * Convenience class meaning that an event <i>should</i> be posted
+     * (irrespective of the configuration property setting for the
+     * {@link Default} event..
      */
     public static class Doop extends ActionDomainEvent<Object> {}
 
     /**
-     * If used then the framework will set state via (non-API) setters.
-     *
-     * <p>
-     *     Recommended because it reduces the amount of boilerplate in the domain object classes.
-     * </p>
+     * Subtypes can define a no-arg constructor; the framework sets state
+     * via (non-API) setters.
      */
     public ActionDomainEvent() {
     }
 
+    /**
+     * The semantics of the action being invoked.
+     *
+     * <p>
+     *     Copied over from {@link Action#semantics()}
+     * </p>
+     */
     @Getter
     private SemanticsOf semantics;
 
+    /**
+     * The names of the parameters of the actions.
+     *
+     * @see #getParameterTypes()
+     * @see #getArguments()
+     */
     @Getter
     private List<String> parameterNames;
 
+    /**
+     * The types of the parameters of the actions.
+     *
+     * <p>
+     *     The {@link #getArguments() arguments} will be castable to the
+     *     parameter types here.
+     * </p>
+     *
+     * @see #getParameterNames()
+     * @see #getArguments()
+     */
     @Getter
     private List<Class<?>> parameterTypes;
 
@@ -79,17 +130,23 @@ public abstract class ActionDomainEvent<S> extends AbstractDomainEvent<S> {
     private Object mixedIn;
 
     /**
-     * The arguments being used to invoke the action;
-     * populated at {@link AbstractDomainEvent.Phase#VALIDATE} and subsequent phases
-     * (but null for {@link AbstractDomainEvent.Phase#HIDE hidden} and 
+     * The arguments being used to invoke the action.
+     *
+     * <p>
+     * Populated at {@link AbstractDomainEvent.Phase#VALIDATE} and subsequent
+     * phases (but null for {@link AbstractDomainEvent.Phase#HIDE hidden} and
      * {@link AbstractDomainEvent.Phase#DISABLE disable} phases).
+     * </p>
      *
      * <p>
      *     The argument values can also be modified by event handlers
-     *     during the {@link AbstractDomainEvent.Phase#EXECUTING} phase. The new value must be
-     *     the same type as the expected value; the framework performs
-     *     no sanity checks.
+     *     during the {@link AbstractDomainEvent.Phase#EXECUTING} phase. The
+     *     new value must be the same type as the expected value; the framework
+     *     performs no sanity checks.
      * </p>
+     *
+     * @see #getParameterNames()
+     * @see #getParameterTypes()
      */
     @Getter @Setter
     private List<Object> arguments;
@@ -108,33 +165,35 @@ public abstract class ActionDomainEvent<S> extends AbstractDomainEvent<S> {
     /**
      * Set by the framework.
      *
-     * Event subscribers can replace the value with some other value if they wish, though only in the
-     * {@link AbstractDomainEvent.Phase#EXECUTED} phase.
+     * <p>
+     * Event subscribers can replace the value with some other value if they
+     * wish, though only in the {@link AbstractDomainEvent.Phase#EXECUTED} phase.
+     * </p>
      */
     public void setReturnValue(final Object returnValue) {
         this.returnValue = returnValue;
     }
 
     /**
-     * Not API - set by the framework.
+     * @apiNote : NOT API, set by the framework
      */
     public void setSemantics(SemanticsOf semantics) {
         this.semantics = semantics;
     }
     /**
-     * Not API - set by the framework.
+     * @apiNote : NOT API, set by the framework
      */
     public void setParameterNames(final List<String> parameterNames) {
         this.parameterNames = parameterNames;
     }
     /**
-     * Not API - set by the framework.
+     * @apiNote : NOT API, set by the framework
      */
     public void setParameterTypes(final List<Class<?>> parameterTypes) {
         this.parameterTypes = parameterTypes;
     }
     /**
-     * Not API - set by the framework.
+     * @apiNote : NOT API, set by the framework
      */
     @Override
     public void setMixedIn(final Object mixedIn) {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
index 8b843e6..6d4c57c 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
@@ -24,37 +24,59 @@ import org.apache.isis.applib.util.ToString;
 import lombok.Getter;
 
 /**
+ * Subclass of {@link AbstractDomainEvent} for collections.
+ *
+ * <p>
+ * The class has a couple of responsibilities (in addition to those it
+ * inherits):
+ * </p>
+ *
+ * <ul>
+ *     <li>
+ *      capture the target object being interacted with
+ *     </li>
+ * </ul>
+ *
+ * <p>
+ * The class itself is instantiated automatically by the framework whenever
+ * interacting with a rendered object's collection.
+ * </p>
+ *
  * @since 1.x {@index}
  */
 public abstract class CollectionDomainEvent<S,T> extends AbstractDomainEvent<S> {
 
     /**
      * This class is the default for the
-     * {@link org.apache.isis.applib.annotation.Collection#domainEvent()} annotation attribute.  Whether this
-     * raises an event or not depends upon the <tt>isis.core.meta-model.annotation.collection.domain-event.post-for-default</tt>
+     * {@link org.apache.isis.applib.annotation.Collection#domainEvent()}
+     * annotation attribute.
+     *
+     * <p>
+     * Whether this raises an event or not depends upon the
+     * <tt>isis.core.meta-model.annotation.collection.domain-event.post-for-default</tt>
      * configuration property.
+     * </p>
      */
     public static class Default extends CollectionDomainEvent<Object, Object> { }
 
     /**
-     * Convenience class to use indicating that an event should <i>not</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event.
+     * Convenience class to use indicating that an event should <i>not</i> be
+     * posted (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Noop extends CollectionDomainEvent<Object, Object> {}
 
     /**
-     * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event..
+     * Convenience class meaning that an event <i>should</i> be posted
+     * (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Doop extends CollectionDomainEvent<Object, Object> {}
 
 
     /**
-     * If used then the framework will set state via (non-API) setters.
-     *
-     * <p>
-     *     Recommended because it reduces the amount of boilerplate in the domain object classes.
-     * </p>
+     * Subtypes can define a no-arg constructor; the framework sets state
+     * via (non-API) setters.
      */
     public CollectionDomainEvent() {
     }
@@ -62,10 +84,10 @@ public abstract class CollectionDomainEvent<S,T> extends AbstractDomainEvent<S>
 
 
     /**
-     * The proposed reference to either add or remove (per {@link #getOf()}), populated at 
+     * The proposed reference to either add or remove (per {@link #getOf()}), populated at
      * {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#VALIDATE}
-     * and subsequent phases (is null for 
-     * {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#HIDE hidden} 
+     * and subsequent phases (is null for
+     * {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#HIDE hidden}
      * and {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#DISABLE disable} phases).
      */
     @Getter
@@ -105,7 +127,7 @@ public abstract class CollectionDomainEvent<S,T> extends AbstractDomainEvent<S>
         this.value = value;
     }
     /**
-     * Not API; updates from {@link Of#ACCESS} to either {@link Of#ADD_TO} 
+     * Not API; updates from {@link Of#ACCESS} to either {@link Of#ADD_TO}
      * or {@link Of#REMOVE_FROM} when hits the
      * {@link AbstractDomainEvent.Phase#VALIDATE validation phase}.
      */
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/PropertyDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/PropertyDomainEvent.java
index 43c390f..2801a66 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/PropertyDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/PropertyDomainEvent.java
@@ -50,11 +50,8 @@ public abstract class PropertyDomainEvent<S,T> extends AbstractDomainEvent<S> {
     public static class Doop extends PropertyDomainEvent<Object, Object> {}
 
     /**
-     * If used then the framework will set state via (non-API) setters.
-     *
-     * <p>
-     *     Recommended because it reduces the amount of boilerplate in the domain object classes.
-     * </p>
+     * Subtypes can define a no-arg constructor; the framework sets state
+     * via (non-API) setters.
      */
     public PropertyDomainEvent() {
     }
diff --git a/legacy/extensions/core/metamodel/src/main/adoc/modules/metamodel/pages/about.adoc b/legacy/extensions/core/metamodel/src/main/adoc/modules/metamodel/pages/about.adoc
index 8c28ea0..1bf059a 100644
--- a/legacy/extensions/core/metamodel/src/main/adoc/modules/metamodel/pages/about.adoc
+++ b/legacy/extensions/core/metamodel/src/main/adoc/modules/metamodel/pages/about.adoc
@@ -2,5 +2,5 @@
 
 :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 [...]
 
-WARNING: TODO: v2: placeholder for documentation about legacy/metamodel
+WARNING: TODO: v2: to document
 
diff --git a/persistence/jpa/adoc/modules/ROOT/pages/about.adoc b/persistence/jpa/adoc/modules/ROOT/pages/about.adoc
index ecb2a85..b977118 100644
--- a/persistence/jpa/adoc/modules/ROOT/pages/about.adoc
+++ b/persistence/jpa/adoc/modules/ROOT/pages/about.adoc
@@ -4,5 +4,5 @@
 
 :page-toc: ~
 
-WARNING: TODO: v2 - in development.
+WARNING: TODO: v2 - to document.
 
diff --git a/security/adoc/modules/ROOT/pages/about.adoc b/security/adoc/modules/ROOT/pages/about.adoc
index 0905a6b..b48aa37 100644
--- a/security/adoc/modules/ROOT/pages/about.adoc
+++ b/security/adoc/modules/ROOT/pages/about.adoc
@@ -70,11 +70,11 @@ The framework provides a "bypass" implementation, useful for quick-n-dirty proto
 
 === KeyCloak
 
-WARNING: TODO: v2 - not yet documented.
+WARNING: TODO: v2 - to document.
 
 === Spring
 
-WARNING: TODO: v2 - WIP, not yet documented.
+WARNING: TODO: v2 - WIP, to document
 
 == SecMan
 
diff --git a/testing/adoc/modules/ROOT/pages/about.adoc b/testing/adoc/modules/ROOT/pages/about.adoc
index 6c3897e..a1074c0 100644
--- a/testing/adoc/modules/ROOT/pages/about.adoc
+++ b/testing/adoc/modules/ROOT/pages/about.adoc
@@ -131,12 +131,10 @@ Apache Isis provides the xref:testing:fakedata:about.adoc[Fake Data] library to
 Using fake data works very well with fixture scripts; the fixture script can invoke the business action with sensible (fake/random) defaults, and only require that the essential information is passed into it by the test.
 ====
 
-
 == Feature Toggles
 
 Writing automated tests is just good development practice.
-Also good practice is developing on the mainline (master, trunk); so that your continuous integration system really is integrating all code.
-Said another way: link:http://martinfowler.com/bliki/FeatureBranch.html[don't use branches]!
+Also good practice is developing on the mainline (main, trunk); so that your continuous integration system really is integrating all code.
 
 Sometimes, though, a feature will take longer to implement than your iteration cycle.
 In such a case, how do you use continuous integration to keep everyone working on the mainline without revealing a half-implemented feature on your releases?


[isis] 09/11: ISIS-439: fixes further compile issues

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

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

commit 8934fb267bac33071fb59ca9c4ed5c9d1e0e041f
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Mar 4 17:31:12 2021 +0000

    ISIS-439: fixes further compile issues
---
 .../core/interaction/InteractionDefaultTest_next.java     | 15 ++++++++-------
 ...inEventHelperTest_newCollectionDomainEvent_forAdd.java |  6 ------
 ...ventHelperTest_newCollectionDomainEvent_forRemove.java |  6 ------
 3 files changed, 8 insertions(+), 19 deletions(-)

diff --git a/core/interaction/src/test/java/org/apache/isis/core/interaction/InteractionDefaultTest_next.java b/core/interaction/src/test/java/org/apache/isis/core/interaction/InteractionDefaultTest_next.java
index cb31c8f..1559096 100644
--- a/core/interaction/src/test/java/org/apache/isis/core/interaction/InteractionDefaultTest_next.java
+++ b/core/interaction/src/test/java/org/apache/isis/core/interaction/InteractionDefaultTest_next.java
@@ -26,6 +26,7 @@ import org.junit.Test;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
+import org.apache.isis.applib.services.iactn.SequenceType;
 import org.apache.isis.core.interaction.session.IsisInteraction;
 
 import lombok.val;
@@ -36,13 +37,13 @@ public class InteractionDefaultTest_next {
     public void test() {
         val interaction = new IsisInteraction(UUID.randomUUID());
 
-        assertThat(interaction.next("foo"), is(0));
-        assertThat(interaction.next("foo"), is(1));
-        assertThat(interaction.next("bar"), is(0));
-        assertThat(interaction.next("bar"), is(1));
-        assertThat(interaction.next("foo"), is(2));
-        assertThat(interaction.next("bar"), is(2));
-        assertThat(interaction.next("bar"), is(3));
+        assertThat(interaction.next(SequenceType.EXECUTION), is(0));
+        assertThat(interaction.next(SequenceType.EXECUTION), is(1));
+        assertThat(interaction.next(SequenceType.TRANSACTION), is(0));
+        assertThat(interaction.next(SequenceType.TRANSACTION), is(1));
+        assertThat(interaction.next(SequenceType.EXECUTION), is(2));
+        assertThat(interaction.next(SequenceType.TRANSACTION), is(2));
+        assertThat(interaction.next(SequenceType.TRANSACTION), is(3));
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
index 5abc008..4451113 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
@@ -51,8 +51,6 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
                 CollectionDomainEvent.Default.class, null, identifier, sdo);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
-        assertSame(ev.getValue(), other);
     }
 
     @Test
@@ -66,8 +64,6 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
                 CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
-        assertSame(ev.getValue(), other);
     }
 
     @Test
@@ -81,8 +77,6 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
                 SomeDomainObjectCollectionDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
-        assertThat(ev.getValue(), is(other));
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
index b4e2a52..913207d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
@@ -51,8 +51,6 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
                 CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
-        assertSame(ev.getValue(), other);
     }
 
     @Test
@@ -66,8 +64,6 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
                 CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
-        assertSame(ev.getValue(), other);
     }
 
     @Test
@@ -81,8 +77,6 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
                 SomeDomainObjectCollectionRemovedFromDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
-        assertThat(ev.getValue(), is(other));
     }
 
 }


[isis] 04/11: ISIS-439: further work removing dead code re: mutable collections

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

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

commit a38e35b8baa3fc1a55e32ea261ee38dd24bf2795
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Mar 3 07:09:21 2021 +0000

    ISIS-439: further work removing dead code re: mutable collections
---
 .../events/domain/CollectionDomainEvent.java       | 31 -------------------
 .../core/metamodel/facets/DomainEventHelper.java   | 36 ++++++++--------------
 .../modify/CollectionDomainEventFacetAbstract.java | 12 ++++----
 ...HelperTest_newCollectionDomainEvent_forAdd.java |  6 ++--
 ...perTest_newCollectionDomainEvent_forRemove.java |  6 ++--
 5 files changed, 25 insertions(+), 66 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
index 7b1c489..a126c76 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
@@ -27,17 +27,6 @@ import lombok.Getter;
  * Subclass of {@link AbstractDomainEvent} for collections.
  *
  * <p>
- * The class has a couple of responsibilities (in addition to those it
- * inherits):
- * </p>
- *
- * <ul>
- *     <li>
- *      capture the target object being interacted with
- *     </li>
- * </ul>
- *
- * <p>
  * The class itself is instantiated automatically by the framework whenever
  * interacting with a rendered object's collection.
  * </p>
@@ -83,31 +72,11 @@ public abstract class CollectionDomainEvent<S,T> extends AbstractDomainEvent<S>
 
 
 
-    /**
-     * The proposed reference to either add or remove (per {@link #getOf()}), populated at
-     * {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#VALIDATE}
-     * and subsequent phases (is null for
-     * {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#HIDE hidden}
-     * and {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#DISABLE disable} phases).
-     */
-    @Getter
-    private T value;
-
-
-    /**
-     * Not API, set by the framework.
-     */
-    public void setValue(T value) {
-        this.value = value;
-    }
-
-
     private static final ToString<CollectionDomainEvent<?,?>> toString =
             ObjectContracts.<CollectionDomainEvent<?,?>>
     toString("source", CollectionDomainEvent::getSource)
     .thenToString("identifier", CollectionDomainEvent::getIdentifier)
     .thenToString("eventPhase", CollectionDomainEvent::getEventPhase)
-    .thenToString("value", CollectionDomainEvent::getValue)
     ;
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
index 56cb6d6..2eb6e2c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
@@ -306,31 +306,24 @@ public class DomainEventHelper {
     // -- postEventForCollection, newCollectionDomainEvent
 
     public <S, T> CollectionDomainEvent<S, T> postEventForCollection(
-            AbstractDomainEvent.Phase phase,
+            final AbstractDomainEvent.Phase phase,
             final Class<? extends CollectionDomainEvent<S, T>> eventType,
-            final CollectionDomainEvent<S, T> existingEvent,
             final IdentifiedHolder identified,
-            final InteractionHead head,
-            final T reference) {
+            final InteractionHead head) {
 
         _Assert.assertTypeIsInstanceOf(eventType, CollectionDomainEvent.class);
 
         try {
             final CollectionDomainEvent<S, T> event;
-            if (existingEvent != null && phase.isExecuted()) {
-                // reuse existing event from the executing phase
-                event = existingEvent;
-            } else {
-                // all other phases, create a new event
-                final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
-                final Identifier identifier = identified.getIdentifier();
-                event = newCollectionDomainEvent(eventType, phase, identifier, source, reference);
 
-                // copy over if have
-                head.getMixedIn()
-                .ifPresent(mixedInAdapter->
-                    event.setMixedIn(mixedInAdapter.getPojo()));
-            }
+            final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
+            final Identifier identifier = identified.getIdentifier();
+            event = newCollectionDomainEvent(eventType, phase, identifier, source);
+
+            // copy over if have
+            head.getMixedIn()
+            .ifPresent(mixedInAdapter->
+                event.setMixedIn(mixedInAdapter.getPojo()));
 
             event.setEventPhase(phase);
 
@@ -345,8 +338,7 @@ public class DomainEventHelper {
             final Class<? extends CollectionDomainEvent<S, T>> type,
             final AbstractDomainEvent.Phase phase,
             final Identifier identifier,
-            final S source,
-            final T value)
+            final S source)
             throws NoSuchMethodException, SecurityException,
             IllegalArgumentException {
 
@@ -360,21 +352,19 @@ public class DomainEventHelper {
 
             cde.initSource(source);
             cde.setIdentifier(identifier);
-            cde.setValue(value);
             return cde;
         }
 
         // else
-        // search for constructor accepting source, identifier, type, value
+        // search for constructor accepting source, identifier
         val updateEventConstructors = constructors
                 .filter(paramCount(4)
                         .and(paramAssignableFrom(0, source.getClass()))
                         .and(paramAssignableFrom(1, Identifier.class))
-                        .and(paramAssignableFromValue(2, value))
                         );
 
         for (val constructor : updateEventConstructors) {
-            val event = invokeConstructor(constructor, source, identifier, value);
+            val event = invokeConstructor(constructor, source, identifier);
             return uncheckedCast(event);
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
index e400f70..7046627 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
@@ -74,9 +74,9 @@ public abstract class CollectionDomainEventFacetAbstract
         final CollectionDomainEvent<?, ?> event =
                 domainEventHelper.postEventForCollection(
                         AbstractDomainEvent.Phase.HIDE,
-                        getEventType(), null,
-                        getIdentified(), ic.getHead(),
-                        null);
+                        getEventType(),
+                        getIdentified(), ic.getHead()
+                );
         if (event != null && event.isHidden()) {
             return "Hidden by subscriber";
         }
@@ -89,9 +89,9 @@ public abstract class CollectionDomainEventFacetAbstract
         final CollectionDomainEvent<?, ?> event =
                 domainEventHelper.postEventForCollection(
                         AbstractDomainEvent.Phase.DISABLE,
-                        getEventType(), null,
-                        getIdentified(), ic.getHead(),
-                        null);
+                        getEventType(),
+                        getIdentified(), ic.getHead()
+                );
         if (event != null && event.isDisabled()) {
             final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable();
             if(reasonTranslatable != null) {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
index 5ae89a1..5abc008 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
@@ -48,7 +48,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                CollectionDomainEvent.Default.class, null, identifier, sdo, other);
+                CollectionDomainEvent.Default.class, null, identifier, sdo);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
@@ -63,7 +63,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
+                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
@@ -78,7 +78,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                SomeDomainObjectCollectionDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
+                SomeDomainObjectCollectionDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
index dc2c6d0..b4e2a52 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
@@ -48,7 +48,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
+                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
@@ -63,7 +63,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
+                CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
@@ -78,7 +78,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
                 LogicalType.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = Utils.domainEventHelper().newCollectionDomainEvent(
-                SomeDomainObjectCollectionRemovedFromDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, other);
+                SomeDomainObjectCollectionRemovedFromDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));


[isis] 05/11: ISIS-2444: more on domain event docs

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

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

commit 09c4072859f19398b2c0fc0f2baedd328d575222
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Mar 3 07:22:48 2021 +0000

    ISIS-2444: more on domain event docs
---
 .../applib-classes/pages/events/domainevent.adoc   |  4 +-
 .../events/domainevent/CollectionDomainEvent.adoc  | 50 ---------------
 .../events/domainevent/PropertyDomainEvent.adoc    | 46 --------------
 .../applib/events/domain/ActionDomainEvent.java    | 19 +++---
 .../events/domain/CollectionDomainEvent.java       | 13 ++--
 .../applib/events/domain/PropertyDomainEvent.java  | 73 +++++++++++++++++-----
 6 files changed, 80 insertions(+), 125 deletions(-)

diff --git a/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc
index a26d546..8dcc604 100644
--- a/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc
@@ -6,10 +6,8 @@
 
 This section catalogues the various domain event classes defined by Apache Isis.
 
-These events are broadcast on the xref:refguide:applib:index/services/eventbus/EventBusService.adoc[EventBusService].
-The domain events are broadcast as a result of being specified in the ,   or xref:refguide:applib:index/annotation/Collection.adoc#domainEvent[@Collection#domainEvent()] attributes.
+These events are broadcast through the xref:refguide:applib:index/services/eventbus/EventBusService.adoc[EventBusService] whenever the framework interacts with the domain object members
 
-They are listed in the table below.
 
 .Domain Event Classes
 [cols="1a,2a,2a,2a", options="header"]
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/CollectionDomainEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/domainevent/CollectionDomainEvent.adoc
deleted file mode 100644
index e35af06..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/CollectionDomainEvent.adoc
+++ /dev/null
@@ -1,50 +0,0 @@
-[[CollectionDomainEvent]]
-= `CollectionDomainEvent`
-
-: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 [...]
-:page-partial:
-
-
-
-== API
-
-The API of the class is:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public abstract class CollectionDomainEvent<S,T> extends AbstractDomainEvent<S> {
-
-    public static class Default                                 // <.>
-        extends CollectionDomainEvent<Object, Object> { }
-    public static class Noop                                    // <.>
-        extends CollectionDomainEvent<Object, Object> { }
-    public static class Doop                                    // <.>
-        extends CollectionDomainEvent<Object, Object> { }
-
-    public T getValue();                                        // <.>
-    public Of getOf();                                          // <.>
-}
-----
-<1> The `Default` nested static class is the default for the xref:refguide:applib:index/annotation/Collection.adoc#domainEvent[@Collection#domainEvent()] annotation attribute.
-Whether this raises an event or not depends upon the
-`isis.reflector.facet.collectionAnnotation.domainEvent.postForDefault` configuration property.
-<2> The `Noop` class is provided as a convenience to indicate that an event should _not_ be posted (irrespective of the configuration property setting).
-<3> Similarly, the `Doop` class is provided as a convenience to indicate that an event _should_ be raised (irrespective of the configuration property setting).
-<4> the object being added or removed
-<5> whether this is to add or to remove
-
-where the `Of` enum indicates in turn how the collection is being interacted with:
-
-[source,java]
-----
-public static enum Of {
-    ACCESS,         // <1>
-    ADD_TO,         // <2>
-    REMOVE_FROM     // <3>
-}
-----
-<1> collection is being rendered; set during for hide and disable phases
-<2> collection is being added to; set for validate, executing and executed phases
-<3> or, collection is being removed from; set for validate, executing and executed phases
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/PropertyDomainEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/domainevent/PropertyDomainEvent.adoc
deleted file mode 100644
index 6f37046..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/domainevent/PropertyDomainEvent.adoc
+++ /dev/null
@@ -1,46 +0,0 @@
-[[PropertyDomainEvent]]
-= `PropertyDomainEvent`
-
-: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 [...]
-:page-partial:
-
-
-Subclass of xref:applib-classes:events.adoc#AbstractDomainEvent[AbstractDomainEvent] for properties.
-
-The class has a couple of responsibilities (in addition to those it inherits):
-
-* capture the target object being interacted with
-
-* capture the old and new values of the property
-
-
-The class itself is instantiated automatically by the framework whenever interacting with a rendered object's property.
-
-== API
-
-The API of the class is:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public abstract class PropertyDomainEvent<S,T> extends AbstractDomainEvent<S> {
-
-    public static class Default                                 // <.>
-        extends PropertyDomainEvent<Object, Object> { }
-    public static class Noop                                    // <.>
-        extends PropertyDomainEvent<Object, Object> { }
-    public static class Doop                                    // <.>
-        extends PropertyDomainEvent<Object, Object> { }
-
-    public T getOldValue();                                     // <.>
-    public T getNewValue();                                     // <.>
-}
-----
-<1> The `Default` nested static class is the default for the xref:refguide:applib:index/annotation/Property.adoc#domainEvent[@Property#domainEvent()] annotation attribute.
-Whether this raises an event or not depends upon the
-`isis.reflector.facet.propertyAnnotation.domainEvent.postForDefault` configuration property.
-<2> The `Noop` class is provided as a convenience to indicate that an event should _not_ be posted (irrespective of the configuration property setting).
-<3> Similarly, the `Doop` class is provided as a convenience to indicate that an event _should_ be raised (irrespective of the configuration property setting).
-<4> The pre-modification value of the property; populated at validate and subsequent phases.
-<5> The proposed (post-modification) value of the property; populated at validate and subsequent phases
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java
index 983b711..fb21014 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java
@@ -29,17 +29,20 @@ import lombok.Getter;
 import lombok.Setter;
 
 /**
- * Subclass of {@link AbstractDomainEvent} for actions.
+ * Fired whenever the framework interacts with a domain object's action.
  *
  * <p>
- * The class has a number of responsibilities (in addition to those it inherits):
+ * This is the specialization of {@link AbstractDomainEvent}, for actions,
+ * which should then be further subclassed by domain application.
+ * </p>
+ *
+ * <p>
+ * The class has a number of responsibilities (in addition to those it
+ * inherits):
  * </p>
  *
  * <ul>
  *     <li>
- *          capture the target object being interacted with
- *     </li>
- *     <li>
  *          capture the arguments for each of the action's parameters
  *     </li>
  *     <li>
@@ -49,8 +52,8 @@ import lombok.Setter;
  * </ul>
  *
  * <p>
- * The class itself is instantiated automatically by the framework whenever
- * interacting with a rendered object's action.
+ * The class itself is instantiated automatically by the framework using a
+ * no-arg constructor; fields are set reflectively.
  * </p>
  *
  * @since 1.x {@index}
@@ -63,7 +66,7 @@ public abstract class ActionDomainEvent<S> extends AbstractDomainEvent<S> {
      *
      * <p>
      * Whether this raises an event or not depends upon the
-     * <tt>isis.core.meta-model.annotation.action.domain-event.post-for-default</tt>
+     * <tt>isis.applib.annotation.action.domain-event.post-for-default</tt>
      * configuration property.
      * </p>
      */
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
index a126c76..91ee8b8 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/CollectionDomainEvent.java
@@ -24,11 +24,16 @@ import org.apache.isis.applib.util.ToString;
 import lombok.Getter;
 
 /**
- * Subclass of {@link AbstractDomainEvent} for collections.
+ * Fired whenever the framework interacts with a domain object's collection.
  *
  * <p>
- * The class itself is instantiated automatically by the framework whenever
- * interacting with a rendered object's collection.
+ * This is the specialization of {@link AbstractDomainEvent}, for collections,
+ *  * which should then be further subclassed by domain application. .
+ * </p>
+ *
+ * <p>
+ * The class itself is instantiated automatically by the framework using a
+ * no-arg constructor; fields are set reflectively.
  * </p>
  *
  * @since 1.x {@index}
@@ -42,7 +47,7 @@ public abstract class CollectionDomainEvent<S,T> extends AbstractDomainEvent<S>
      *
      * <p>
      * Whether this raises an event or not depends upon the
-     * <tt>isis.core.meta-model.annotation.collection.domain-event.post-for-default</tt>
+     * <tt>isis.applib.annotation.collection.domain-event.post-for-default</tt>
      * configuration property.
      * </p>
      */
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/PropertyDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/PropertyDomainEvent.java
index 2801a66..5886dfa 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/PropertyDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/PropertyDomainEvent.java
@@ -25,27 +25,57 @@ import lombok.Getter;
 import lombok.Setter;
 
 /**
+ * Fired whenever the framework interacts with a domain object's property.
+ *
+ * <p>
+ * This is the specialization of {@link AbstractDomainEvent}, for properties,
+ *  * which should then be further subclassed by domain application.
+ * </p>
+ *
+ * <p>
+ * The class has a number of responsibilities (in addition to those it
+ * inherits):
+ * </p>
+ *
+ * <ul>
+ *     <li>
+ *          capture the old and new values of the property
+ *     </li>
+ * </ul>
+ *
+ * <p>
+ * The class itself is instantiated automatically by the framework using a
+ * no-arg constructor; fields are set reflectively.
+ * </p>
+ *
  * @since 1.x {@index}
  */
 public abstract class PropertyDomainEvent<S,T> extends AbstractDomainEvent<S> {
 
     /**
      * This class is the default for the
-     * {@link org.apache.isis.applib.annotation.Property#domainEvent()} annotation attribute.  Whether this
-     * raises an event or not depends upon the <tt>isis.core.meta-model.annotation.property.domain-event.post-for-default</tt>
+     * {@link org.apache.isis.applib.annotation.Property#domainEvent()}
+     * annotation attribute.
+     *
+     * <p>
+     * Whether this raises an event or not depends upon the
+     * <tt>isis.applib.annotation.property.domain-event.post-for-default</tt>
      * configuration property.
+     * </p>
      */
     public static class Default extends PropertyDomainEvent<Object, Object> {}
 
     /**
-     * Convenience class to use indicating that an event should <i>not</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event.
+     * Convenience class to use indicating that an event should <i>not</i> be
+     * posted (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Noop extends PropertyDomainEvent<Object, Object> {}
 
     /**
-     * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event..
+     * Convenience class meaning that an event <i>should</i> be posted
+     * (irrespective of the configuration property setting for the
+     * {@link Default} event..
      */
     public static class Doop extends PropertyDomainEvent<Object, Object> {}
 
@@ -57,21 +87,37 @@ public abstract class PropertyDomainEvent<S,T> extends AbstractDomainEvent<S> {
     }
 
     /**
-     * The current (pre-modification) value of the property; populated at {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#VALIDATE} and subsequent phases
-     * (but null for {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#HIDE hidden} and {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#DISABLE disable} phases).
+     * The current (pre-modification) value of the property.
+     *
+     * <p>
+     * Populated at {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#VALIDATE} and subsequent
+     * phases (but null for
+     * {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#HIDE hidden}
+     * and {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#DISABLE disable}
+     * phases).
+     * </p>
      */
     @Getter @Setter
     private T oldValue;
 
     /**
-     * The proposed (post-modification) value of the property; populated at {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#VALIDATE} and subsequent phases
-     * (but null for {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#HIDE hidden} and {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#DISABLE disable} phases).
+     * The proposed (post-modification) value of the property.
+     *
+     * <p>
+     * Populated at
+     * {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#VALIDATE}
+     * and subsequent phases (but null for
+     * {@link Phase#HIDE hidden}
+     * and {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#DISABLE disable}
+     * phases).
+     * </p>
      *
      * <p>
      *     The proposed new value can also be modified by event handlers
-     *     during the {@link Phase#EXECUTING} phase.  The new value must be
-     *     the same type as the expected value; the framework performs
-     *     no sanity checks.
+     *     during the
+     *     {@link org.apache.isis.applib.events.domain.AbstractDomainEvent.Phase#EXECUTING executing}
+     *     phase.  The new value must be the same type as the expected value;
+     *     the framework performs no sanity checks.
      * </p>
      */
     @Getter @Setter
@@ -79,7 +125,6 @@ public abstract class PropertyDomainEvent<S,T> extends AbstractDomainEvent<S> {
 
 
 
-
     private static final ToString<PropertyDomainEvent<?,?>> toString =
             ObjectContracts.<PropertyDomainEvent<?,?>>
     toString("source", PropertyDomainEvent::getSource)


[isis] 07/11: ISIS-2444: event docs

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

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

commit 9b307c7bdcf2af5cef919e4931da80b0856cb3ff
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Mar 3 22:07:08 2021 +0000

    ISIS-2444: event docs
---
 .../applib-classes/pages/events/domainevent.adoc   | 21 ++---
 .../pages/events/lifecycleevent.adoc               | 99 +++++++++-------------
 .../lifecycleevent/AbstractLifecycleEvent.adoc     | 20 -----
 .../events/lifecycleevent/ObjectCreatedEvent.adoc  | 14 ---
 .../events/lifecycleevent/ObjectLoadedEvent.adoc   | 12 ---
 .../lifecycleevent/ObjectPersistedEvent.adoc       | 11 ---
 .../lifecycleevent/ObjectPersistingEvent.adoc      | 12 ---
 .../events/lifecycleevent/ObjectRemovingEvent.adoc | 12 ---
 .../events/lifecycleevent/ObjectUpdatedEvent.adoc  | 13 ---
 .../events/lifecycleevent/ObjectUpdatingEvent.adoc | 13 ---
 .../applib-classes/pages/events/uievent.adoc       | 76 ++++++++---------
 .../pages/events/uievent/CssClassUiEvent.adoc      | 17 ----
 .../pages/events/uievent/IconUiEvent.adoc          | 19 -----
 .../pages/events/uievent/TitleUiEvent.adoc         | 17 ----
 ...ng.adoc => TranslatableString_usage-notes.adoc} |  0
 .../events/lifecycle/AbstractLifecycleEvent.java   |  5 ++
 .../events/lifecycle/ObjectCreatedEvent.java       | 25 ++++--
 .../applib/events/lifecycle/ObjectLoadedEvent.java | 21 +++--
 .../events/lifecycle/ObjectPersistedEvent.java     |  8 ++
 .../events/lifecycle/ObjectPersistingEvent.java    |  8 ++
 .../events/lifecycle/ObjectRemovingEvent.java      |  8 ++
 .../events/lifecycle/ObjectUpdatedEvent.java       |  5 ++
 .../events/lifecycle/ObjectUpdatingEvent.java      |  5 ++
 .../isis/applib/events/ui/CssClassUiEvent.java     | 40 +++++++--
 .../apache/isis/applib/events/ui/IconUiEvent.java  | 51 ++++++++---
 .../isis/applib/events/ui/LayoutUiEvent.java       | 38 +++++++--
 .../apache/isis/applib/events/ui/TitleUiEvent.java | 39 +++++++--
 27 files changed, 290 insertions(+), 319 deletions(-)

diff --git a/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc
index 8dcc604..b5f9e1b 100644
--- a/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/events/domainevent.adoc
@@ -4,43 +4,38 @@
 :page-partial:
 
 
-This section catalogues the various domain event classes defined by Apache Isis.
+Domain events are broadcast through the xref:refguide:applib:index/services/eventbus/EventBusService.adoc[EventBusService] whenever the framework interacts with the domain object members.
+
+They allow subscribers to change either veto the interaction, or to trigger other operations as a result of the interaction.
 
-These events are broadcast through the xref:refguide:applib:index/services/eventbus/EventBusService.adoc[EventBusService] whenever the framework interacts with the domain object members
 
 
 .Domain Event Classes
-[cols="1a,2a,2a,2a", options="header"]
+[cols="2a,2a,2a", options="header"]
 |===
 
 |API
-|Raised by
-|Fallback +
-Implementation
+|Event class defined by
 |Published when
 
 
 |xref:refguide:applib:index/events/domain/AbstractDomainEvent.adoc[AbstractDomainEvent]
 |n/a
-|(abstract class)
-|Superclass of the other domain events, listed below in this table.
+|n/a - superclass of the other domain events.
 
 
 |xref:refguide:applib:index/events/domain/ActionDomainEvent.adoc[ActionDomainEvent]
 |xref:refguide:applib:index/annotation/Action.adoc#domainEvent[@Action#domainEvent()]
-|`ActionDomainEvent.Default`
-|(hide/disable/validate/pre-execute/post-execute) with an object's action.
+|interact with (hide, disable, validate, pre-execute, post-execute) an object's action.
 
 |xref:refguide:applib:index/events/domain/CollectionDomainEvent.adoc[CollectionDomainEvent]
 |xref:refguide:applib:index/annotation/Collection.adoc#domainEvent[@Collection#domainEvent()]
-|`CollectionDomainEvent.Default`
 |hide an object's collection.
 
 
 |xref:refguide:applib:index/events/domain/PropertyDomainEvent.adoc[PropertyDomainEvent]
 |xref:refguide:applib:index/annotation/Property.adoc#domainEvent[@Property#domainEvent()]
-|`PropertyDomainEvent.Default`
-|hide/disable/validate/pre-edit/post-edit with an object's property.
+|interact with (hide, disable, validate, pre-edit, post-edit) an object's property.
 
 
 |===
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent.adoc
index 969c9b4..b6717b6 100644
--- a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent.adoc
@@ -5,95 +5,74 @@
 :page-partial:
 
 
-This section catalogues the various lifecycle event classes defined by Apache Isis.
-These events are fired automatically when a domain object is loaded, created, updated and so forth.
+Lifecycle events are broadcast through the xref:refguide:applib:index/services/eventbus/EventBusService.adoc[EventBusService] when a domain entity is loaded, created, updated to/from the database.
 
-The lifecycle event classes are listed in the table below:
+They allow subscribers to trigger other operations as a result of these persistence operations.
+One use case is to maintain an alternate data store.
 
 
 .Lifecycle Event Classes
-[cols="1a,2a,2a", options="header"]
+[cols="2a,2a,2a", options="header"]
 |===
 
 |API
-|Implementation
-|Notes
+|Event class defined by
+|Raised when
 
 
-|xref:applib-classes:events.adoc#AbstractLifecycleEvent[`o.a.i.applib.` +
-`AbstractLifecycleEvent`]
-|(abstract class)
-|Superclass of the other lifecycle events, listed below in this table.
+|xref:refguide:applib:index/events/lifecycle/AbstractLifecycleEvent.adoc[AbstractLifecycleEvent]
+|n/a
+|n/a - superclass of the other lifecycle events.
 
 
-|xref:applib-classes:events.adoc#ObjectCreatedEvent[`o.a.i.applib.` +
-`ObjectCreatedEvent`]
-|(abstract class). +
-`ObjectCreatedEvent.Default` is the concrete implementation that is used.
-|Broadcast when an object is first instantiated using the xref:refguide:applib:index/services/factory/FactoryService.adoc[FactoryService]'s
-`#instantiate(...)` method.
+|xref:refguide:applib:index/events/lifecycle/ObjectCreatedEvent.adoc[ObjectCreatedEvent]
+|xref:refguide:applib:index/annotation/DomainObject.adoc#createdLifecycleEvent[DomainObject +
+#createdLifecycleEvent()]
+|entity is first instantiated using  xref:refguide:applib:index/services/factory/FactoryService.adoc[FactoryService] +
 
+Also raised for view models.
 
-|xref:applib-classes:events.adoc#ObjectLoadedEvent[`o.a.i.applib.` +
-`ObjectLoadedEvent`]
-|(abstract class). +
-`ObjectLoadedEvent.Default` is the concrete implementation that is used.
-|Broadcast when an object is retrieved from the database.
 
+|xref:refguide:applib:index/events/lifecycle/ObjectLoadedEvent.adoc[ObjectLoadedEvent]
+|xref:refguide:applib:index/annotation/DomainObject.adoc#loadedLifecycleEvent[DomainObject +
+#loadedLifecycleEvent()]
+|entity is retrieved from the database.
 
-|xref:applib-classes:events.adoc#ObjectPersistedEvent[`o.a.i.applib.` +
-`ObjectPersistedEvent`]
-|(abstract class). +
-`ObjectPersistedEvent.Default` is the concrete implementation that is used.
-|Broadcast when an object is first saved (inserted) into the database using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s
+
+|xref:refguide:applib:index/events/lifecycle/ObjectPersistedEvent.adoc[ObjectPersistedEvent]
+|xref:refguide:applib:index/annotation/DomainObject.adoc#persistedLifecycleEvent[DomainObject +
+#persistedLifecycleEvent()]
+|entity is first saved (inserted) into the database using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s
 `#persist(...)` method.
 
 
-|xref:applib-classes:events.adoc#ObjectPersistingEvent[`o.a.i.applib.` +
-`ObjectPersistingEvent`]
-|(abstract class). +
-`ObjectPersistingEvent.Default` is the concrete implementation that is used.
-|Broadcast when an object is about to be saved (inserted) into the database using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s
+|xref:refguide:applib:index/events/lifecycle/ObjectPersistingEvent.adoc[ObjectPersistingEvent]
+|xref:refguide:applib:index/annotation/DomainObject.adoc#persistingLifecycleEvent[DomainObject +
+#persistingLifecycleEvent()]
+|entity is about to be saved (inserted) into the database using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s
 `#persist(...)` method.
 
 
-|xref:applib-classes:events.adoc#ObjectRemovingEvent[`o.a.i.applib.` +
-`ObjectRemovingEvent`]
-|(abstract class). +
-`ObjectRemovingEvent.Default` is the concrete implementation that is used.
-|Broadcast when an object is about to be deleted from the database using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s
+|xref:refguide:applib:index/events/lifecycle/ObjectRemovingEvent.adoc[ObjectRemovingEvent]
+|xref:refguide:applib:index/annotation/DomainObject.adoc#removingLifecycleEvent[DomainObject +
+#removingLifecycleEvent()]
+|entity is about to be deleted from the database using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s
 `#remove(...)` method.
 
 
-|xref:applib-classes:events.adoc#ObjectUpdatedEvent[`o.a.i.applib.` +
-`ObjectUpdatedEvent`]
-|(abstract class). +
-`ObjectUpdatedEvent.Default` is the concrete implementation that is used.
-|Broadcast when an object has just been updated in the database.
-This is done either explicitly when the current transaction is flushed using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s `#flush(...)` method, else is done implicitly when the transaction commits at the end of the user request.
+|xref:refguide:applib:index/events/lifecycle/ObjectUpdatedEvent.adoc[ObjectUpdatedEvent]
+|xref:refguide:applib:index/annotation/DomainObject.adoc#updatingLifecycleEvent[DomainObject +
+#updatingLifecycleEvent()]
+|entity has just been updated in the database.
 
 
-|xref:applib-classes:events.adoc#ObjectUpdatingEvent[`o.a.i.applib.` +
-`ObjectUpdatingEvent`]
-|``o.a.i.core`` +
-``events.lifecycle`` +
-``isis-applib``
-|(abstract class). +
-`ObjectUpdatingEvent.Default` is the concrete implementation that is used.
-|Broadcast when an object is about to be updated in the database.
-This is done either explicitly when the current transaction is flushed using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s `#flush(...)` method, else is done implicitly when the transaction commits at the end of the user request.
+|xref:refguide:applib:index/events/lifecycle/ObjectUpdatingEvent.adoc[ObjectUpdatingEvent]
+|xref:refguide:applib:index/annotation/DomainObject.adoc#updatedLifecycleEvent[DomainObject +
+#updatedLifecycleEvent()]
+|entity is about to be updated in the database.
 
 
 |===
 
 
 
-
-include::lifecycleevent/AbstractLifecycleEvent.adoc[leveloffset=+1]
-include::lifecycleevent/ObjectCreatedEvent.adoc[leveloffset=+1]
-include::lifecycleevent/ObjectLoadedEvent.adoc[leveloffset=+1]
-include::lifecycleevent/ObjectPersistedEvent.adoc[leveloffset=+1]
-include::lifecycleevent/ObjectPersistingEvent.adoc[leveloffset=+1]
-include::lifecycleevent/ObjectRemovingEvent.adoc[leveloffset=+1]
-include::lifecycleevent/ObjectUpdatedEvent.adoc[leveloffset=+1]
-include::lifecycleevent/ObjectUpdatingEvent.adoc[leveloffset=+1]
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/AbstractLifecycleEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/AbstractLifecycleEvent.adoc
deleted file mode 100644
index 2fff7df..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/AbstractLifecycleEvent.adoc
+++ /dev/null
@@ -1,20 +0,0 @@
-[[AbstractLifecycleEvent]]
-= `AbstractLifecycleEvent`
-
-: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 [...]
-:page-partial:
-
-
-This class is the superclass for all lifecycle events that are raised by the framework when loading, saving, updating or deleting objects from the database.
-
-Its immediate subclasses are:
-
-* xref:applib-classes:events.adoc#ObjectCreatedEvent[ObjectCreatedEvent]
-* xref:applib-classes:events.adoc#ObjectLoadedEvent[ObjectLoadedEvent]
-* xref:applib-classes:events.adoc#ObjectPersistedEvent[ObjectPersistedEvent]
-* xref:applib-classes:events.adoc#ObjectPersistingEvent[ObjectPersistingEvent]
-* xref:applib-classes:events.adoc#ObjectRemovingEvent[ObjectRemovingEvent]
-* xref:applib-classes:events.adoc#ObjectUpdatedEvent[ObjectUpdatedEvent]
-* xref:applib-classes:events.adoc#ObjectUpdatingEvent[ObjectUpdatingEvent]
-
-
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectCreatedEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectCreatedEvent.adoc
deleted file mode 100644
index 913bc4f..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectCreatedEvent.adoc
+++ /dev/null
@@ -1,14 +0,0 @@
-[[ObjectCreatedEvent]]
-= `ObjectCreatedEvent`
-
-: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 [...]
-:page-partial:
-
-
-
-Subclass of xref:applib-classes:events.adoc#AbstractLifecycleEvent[AbstractLifecycleEvent], broadcast when an object is first instantiated using the xref:refguide:applib:index/services/factory/FactoryService.adoc[FactoryServuce]'s `#instantiate(...)` method.
-
-`ObjectCreatedEvent.Default` is the implementation that is used by default, but this can be overridden using xref:refguide:applib:index/annotation/DomainObject.adoc#createdLifecycleEvent[@DomainObject#createdLifecycleEvent].
-
-
-
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectLoadedEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectLoadedEvent.adoc
deleted file mode 100644
index e49f0e5..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectLoadedEvent.adoc
+++ /dev/null
@@ -1,12 +0,0 @@
-[[ObjectLoadedEvent]]
-= `ObjectLoadedEvent`
-
-: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 [...]
-:page-partial:
-
-
-
-Subclass of xref:applib-classes:events.adoc#AbstractLifecycleEvent[AbstractLifecycleEvent], broadcast when an object is retrieved from the database.
-
-`ObjectLoadedEvent.Default` is the concrete implementation that is used.
-
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectPersistedEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectPersistedEvent.adoc
deleted file mode 100644
index 38dc32f..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectPersistedEvent.adoc
+++ /dev/null
@@ -1,11 +0,0 @@
-[[ObjectPersistedEvent]]
-= `ObjectPersistedEvent`
-
-: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 [...]
-:page-partial:
-
-
-Subclass of xref:applib-classes:events.adoc#AbstractLifecycleEvent[AbstractLifecycleEvent], broadcast when an object is first saved (inserted) into the database using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s `#persist(...)` method.
-
-
-`ObjectPersistedEvent.Default` is the implementation that is used by default, but this can be overridden using xref:refguide:applib:index/annotation/DomainObject.adoc#persistedLifecycleEvent[@DomainObject#persistedLifecycleEvent].
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectPersistingEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectPersistingEvent.adoc
deleted file mode 100644
index 1d122be..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectPersistingEvent.adoc
+++ /dev/null
@@ -1,12 +0,0 @@
-[[ObjectPersistingEvent]]
-= `ObjectPersistingEvent`
-
-: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 [...]
-:page-partial:
-
-
-Subclass of xref:applib-classes:events.adoc#AbstractLifecycleEvent[AbstractLifecycleEvent], broadcast when an object is about to be saved (inserted) into the database using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s `#persist(...)` method.
-
-
-`ObjectPersistingEvent.Default` is the implementation that is used by default, but this can be overridden using xref:refguide:applib:index/annotation/DomainObject.adoc#persistingLifecycleEvent[@DomainObject#persistingLifecycleEvent].
-
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectRemovingEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectRemovingEvent.adoc
deleted file mode 100644
index 776575d..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectRemovingEvent.adoc
+++ /dev/null
@@ -1,12 +0,0 @@
-[[ObjectRemovingEvent]]
-= `ObjectRemovingEvent`
-
-: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 [...]
-:page-partial:
-
-
-Subclass of xref:applib-classes:events.adoc#AbstractLifecycleEvent[AbstractLifecycleEvent], broadcast when an object is about to be deleted from the database using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s `#remove(...)` method.
-
-
-`ObjectRemovingEvent.Default` is the implementation that is used by default, but this can be overridden using xref:refguide:applib:index/annotation/DomainObject.adoc#removingLifecycleEvent[@DomainObject#removingLifecycleEvent].
-
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectUpdatedEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectUpdatedEvent.adoc
deleted file mode 100644
index 235f5ff..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectUpdatedEvent.adoc
+++ /dev/null
@@ -1,13 +0,0 @@
-[[ObjectUpdatedEvent]]
-= `ObjectUpdatedEvent`
-
-: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 [...]
-:page-partial:
-
-
-
-Subclass of xref:applib-classes:events.adoc#AbstractLifecycleEvent[AbstractLifecycleEvent], broadcast when an object has just been updated in the database.
-This is done either explicitly when the current transaction is flushed using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s `#flush(...)` method, else is done implicitly when the transaction commits at the end of the user request.
-
-`ObjectUpdatedEvent.Default` is the implementation that is used by default, but this can be overridden using xref:refguide:applib:index/annotation/DomainObject.adoc#updatedLifecycleEvent[@DomainObject#updatedLifecycleEvent].
-
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectUpdatingEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectUpdatingEvent.adoc
deleted file mode 100644
index 21611d7..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/lifecycleevent/ObjectUpdatingEvent.adoc
+++ /dev/null
@@ -1,13 +0,0 @@
-[[ObjectUpdatingEvent]]
-= `ObjectUpdatingEvent`
-
-: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 [...]
-:page-partial:
-
-
-
-Subclass of xref:applib-classes:events.adoc#AbstractLifecycleEvent[AbstractLifecycleEvent], broadcast when an object is about to be updated in the database.
-This is done either explicitly when the current transaction is flushed using the xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService]'s `#flush(...)` method, else is done implicitly when the transaction commits at the end of the user request.
-
-
-`ObjectUpdatingEvent.Default` is the implementation that is used by default, but this can be overridden using xref:refguide:applib:index/annotation/DomainObject.adoc#updatingLifecycleEvent[@DomainObject#updatingLifecycleEvent].
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/uievent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/uievent.adoc
index 4ad6ff7..ac3033a 100644
--- a/antora/components/refguide/modules/applib-classes/pages/events/uievent.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/events/uievent.adoc
@@ -4,58 +4,50 @@
 :page-partial:
 
 
-This section catalogues the various UI event classes defined by Apache Isis.
+UI events are broadcast on the xref:refguide:applib:index/services/eventbus/EventBusService.adoc[EventBusService] as the result of rendering a domain object.
+
+They allow subscribers to change various presentation aspects of the rendered object.
+
+Note that if the domain object defines its own layout preferences (for example, a xref:refguide:applib-methods:reserved.adoc#title[title()] supporting method) then these will take precedence.
 
-These events are broadcast on the xref:refguide:applib:index/services/eventbus/EventBusService.adoc[EventBusService].  The domain
-events are broadcast as a result of being specified in the xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#titleUiEvent[@DomainObjectLayout#titleUiEvent()],  xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#iconUiEvent[@DomainObjectLayout#iconUiEvent()] or xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#cssClassUiEvent[@DomainObjectLayout#cssClassUiEvent()] attributes.
 
-They are listed in the table below.
 
 .UI Event Classes
-[cols="1a,2a,2a", options="header"]
+[cols="2a,2a,2a,2a", options="header"]
 |===
 
 |API
-|Implementation
-|Notes
-
-
-|xref:applib-classes:events.adoc#TitleUiEvent[`o.a.i.applib.` +
-`TitleUiEvent`]
-|(abstract class). +
-`TitleUiEvent.Default` is the concrete implementation used if no `@DomainObjectLayout#titleUiEvent` attribute is specified
-|Broadcast whenever there is a requirement to obtain a title for a domain object.
-Note that if the domain object defines its own xref:refguide:applib-methods:reserved.adoc#title[title()] supporting method, or has xref:refguide:applib:index/annotation/Title.adoc[@Title] annotation(s) on its properties, then these will take precedence.
-
-|xref:applib-classes:events.adoc#IconUiEvent[`o.a.i.applib.` +
-`IconUiEvent`]
-|(abstract class). +
-`IconUiEvent.Default` is the concrete implementation used if no `@DomainObjectLayout#iconUiEvent` attribute is specified
-|Broadcast whenever there is a requirement to obtain an icon (or rather, the name of an icon) for a domain object.
-Note that if the domain object defines its own xref:refguide:applib-methods:reserved.adoc#iconName[iconName()] supporting method, or if it has the xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#cssClassFa[@DomainObjectLayout#cssClassFa()] attribute, then these will take precedence.
-
-|xref:applib-classes:events.adoc#CssClassUiEvent[`o.a.i.applib.` +
-`CssClassUiEvent`]
-|(abstract class). +
-`CssClassUiEvent.Default` is the concrete implementation used if no `@DomainObjectLayout#cssClassUiEvent` attribute is specified
-|Broadcast whenever there is a requirement to obtain a CSS class hint for a domain object.
-Note that if the domain object defines its own xref:refguide:applib-methods:reserved.adoc#cssClass[cssClass()] supporting method then this
-will take precedence.
-
-|xref:applib-classes:events.adoc#LayoutUiEvent[`o.a.i.applib.` +
-`LayoutUiEvent`]
-|(abstract class). +
-`LayoutUiEvent.Default` is the concrete implementation used if no `@DomainObjectLayout#layoutUiEvent` attribute is specified
-|Broadcast whenever there is a requirement to obtain an alternative layout for a domain object.
-Note that if the domain object defines its own xref:refguide:applib-methods:reserved.adoc#layout[layout()] supporting method then this
-will take precedence.
+|Event class defined by
+|Raised when
+|Overridden by
+
+
+|xref:refguide:applib:index/events/ui/TitleUiEvent.adoc[TitleUiEvent]
+|xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#titleUiEvent[@DomainObjectLayout#titleUiEvent()]
+|\... rendering the title for a domain object.
+|xref:refguide:applib-methods:reserved.adoc#title[title()] +
+xref:refguide:applib:index/annotation/Title.adoc[@Title]
+
 
-|===
 
+|xref:refguide:applib:index/events/ui/IconUiEvent.adoc[IconUiEvent]
+|xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#iconUiEvent[@DomainObjectLayout#iconUiEvent()]
+|\... rendering an icon for a domain object.
+|xref:refguide:applib-methods:reserved.adoc#iconName[iconName()]
+
+
+|xref:refguide:applib:index/events/ui/CssClassUiEvent.adoc[CssClassUiEvent]
+|xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#cssClassUiEvent[@DomainObjectLayout#cssClassUiEvent()]
+|\... obtaining a CSS class hint for a domain object.
+|xref:refguide:applib-methods:reserved.adoc#cssClass[cssClass()]
+
+|xref:refguide:applib:index/events/ui/LayoutUiEvent.adoc[LayoutUiEvent]
+|xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#layoutUiEvent[@DomainObjectLayout#layoutUiEvent()]
+|\... obtain an alternative layout for a domain object.
+|xref:refguide:applib-methods:reserved.adoc#layout[layout()]
+
+|===
 
 
 
 
-include::uievent/TitleUiEvent.adoc[leveloffset=+1]
-include::uievent/IconUiEvent.adoc[leveloffset=+1]
-include::uievent/CssClassUiEvent.adoc[leveloffset=+1]
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/uievent/CssClassUiEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/uievent/CssClassUiEvent.adoc
deleted file mode 100644
index 9d92bac..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/uievent/CssClassUiEvent.adoc
+++ /dev/null
@@ -1,17 +0,0 @@
-[[CssClassUiEvent]]
-= `CssClassUiEvent`
-
-: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 [...]
-:page-partial:
-
-
-This event class represents a request to obtain the a CSS class hint of a domain object.
-The class has a number of responsibilities:
-
-* capture the target object being interacted with
-
-* capture the CSS class, if any, as specified to one of the subscribers
-
-The class itself is instantiated automatically by the framework whenever interacting with a rendered object's action.
-
-If the domain object defines its own xref:refguide:applib-methods:reserved.adoc#cssClass[cssClass()] supporting method then this will take precedence.
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/uievent/IconUiEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/uievent/IconUiEvent.adoc
deleted file mode 100644
index 5d086d2..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/uievent/IconUiEvent.adoc
+++ /dev/null
@@ -1,19 +0,0 @@
-[[IconUiEvent]]
-= `IconUiEvent`
-
-: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 [...]
-:page-partial:
-
-
-This event class represents a request to obtain the icon (or rather, name of icon) of a domain object.
-The class has a number of responsibilities:
-
-* capture the target object being interacted with
-
-* capture the icon (name), if any, as specified to one of the subscribers
-
-The class itself is instantiated automatically by the framework whenever interacting with a rendered object's action.
-
-If the domain object defines its own xref:refguide:applib-methods:reserved.adoc#iconName[iconName()] supporting method, or if it has the
-xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#cssClassFa[@DomainObjectLayout#cssClassFa()] attribute, then these will take precedence.
-r
diff --git a/antora/components/refguide/modules/applib-classes/pages/events/uievent/TitleUiEvent.adoc b/antora/components/refguide/modules/applib-classes/pages/events/uievent/TitleUiEvent.adoc
deleted file mode 100644
index 55a7fb2..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/events/uievent/TitleUiEvent.adoc
+++ /dev/null
@@ -1,17 +0,0 @@
-[[TitleUiEvent]]
-= `TitleUiEvent`
-
-: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 [...]
-:page-partial:
-
-
-This event class represents a request to obtain the title of a domain object.
-The class has a number of responsibilities:
-
-* capture the target object being interacted with
-
-* capture the title, if any, as specified to one of the subscribers
-
-The class itself is instantiated automatically by the framework whenever interacting with a rendered object's action.
-
-If the domain object defines its own xref:refguide:applib-methods:reserved.adoc#title[title()] supporting method, or has xref:refguide:applib:index/annotation/Title.adoc[@Title] annotation(s) on its properties, then these will take precedence.
diff --git a/antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString.adoc b/antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString_usage-notes.adoc
similarity index 100%
rename from antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString.adoc
rename to antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString_usage-notes.adoc
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/AbstractLifecycleEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/AbstractLifecycleEvent.java
index 2d1c726..33b9a45 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/AbstractLifecycleEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/AbstractLifecycleEvent.java
@@ -18,9 +18,14 @@
  */
 package org.apache.isis.applib.events.lifecycle;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.applib.events.EventObjectBase;
 
 /**
+ * Superclass for all lifecycle events that are raised by the framework when
+ * loading, saving, updating or deleting objects from the database.
+ *
  * @since 1.x {@index}
  */
 public abstract class AbstractLifecycleEvent<S> extends EventObjectBase<S> {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectCreatedEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectCreatedEvent.java
index 831c2e5..87bc51d 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectCreatedEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectCreatedEvent.java
@@ -19,27 +19,40 @@
 package org.apache.isis.applib.events.lifecycle;
 
 /**
+ * Broadcast when an object (entiy or view model) is first instantiated using
+ * the {@link org.apache.isis.applib.services.factory.FactoryService}.
+ *
+ * @see org.apache.isis.applib.services.factory.FactoryService#detachedEntity(Class)
+ * @see org.apache.isis.applib.services.factory.FactoryService#viewModel(Class)
+ *
  * @since 1.x {@index}
  */
 public abstract class ObjectCreatedEvent<S> extends AbstractLifecycleEvent<S> {
 
     /**
      * This class is the default for the
-     * {@link org.apache.isis.applib.annotation.DomainObject#createdLifecycleEvent()} annotation attribute.  Whether this
-     * raises an event or not depends upon the <tt>isis.core.meta-model.annotation.domain-object.created-lifecycle-event.post-for-default</tt>
+     * {@link org.apache.isis.applib.annotation.DomainObject#createdLifecycleEvent()}
+     * annotation element.
+     *
+     * <p>
+     * Whether this raises an event or not depends upon the
+     * <tt>isis.applib.annotation.domain-object.created-lifecycle-event.post-for-default</tt>
      * configuration property.
+     * </p>
      */
     public static class Default extends ObjectCreatedEvent<Object> {}
 
     /**
-     * Convenience class to use indicating that an event should <i>not</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event.
+     * Convenience class to use indicating that an event should <i>not</i> be
+     * posted (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Noop extends ObjectCreatedEvent<Object> {}
 
     /**
-     * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event..
+     * Convenience class meaning that an event <i>should</i> be posted
+     * (irrespective of the configuration property setting for the
+     * {@link Default} event..
      */
     public static class Doop extends ObjectCreatedEvent<Object> {}
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectLoadedEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectLoadedEvent.java
index 82aaf11..4463f0b 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectLoadedEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectLoadedEvent.java
@@ -19,27 +19,36 @@
 package org.apache.isis.applib.events.lifecycle;
 
 /**
+ * Broadcast when an entity is retrieved from the database.
+ *
  * @since 1.x {@index}
  */
 public abstract class ObjectLoadedEvent<S> extends AbstractLifecycleEvent<S> {
 
     /**
      * This class is the default for the
-     * {@link org.apache.isis.applib.annotation.DomainObject#loadedLifecycleEvent()} annotation attribute.  Whether this
-     * raises an event or not depends upon the <tt>isis.core.meta-model.annotation.domain-object.loaded-lifecycle-event.post-for-default</tt>
+     * {@link org.apache.isis.applib.annotation.DomainObject#loadedLifecycleEvent()}
+     * annotation element.
+     *
+     * <p>
+     * Whether this raises an event or not depends upon the
+     * <tt>isis.applib.annotation.domain-object.loaded-lifecycle-event.post-for-default</tt>
      * configuration property.
+     * </p>
      */
     public static class Default extends ObjectLoadedEvent<Object> {}
 
     /**
-     * Convenience class to use indicating that an event should <i>not</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event.
+     * Convenience class to use indicating that an event should <i>not</i> be
+     * posted (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Noop extends ObjectLoadedEvent<Object> {}
 
     /**
-     * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event..
+     * Convenience class meaning that an event <i>should</i> be posted
+     * (irrespective of the configuration property setting for the
+     * {@link Default} event..
      */
     public static class Doop extends ObjectLoadedEvent<Object> {}
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectPersistedEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectPersistedEvent.java
index 9f1d5f6..43f900f 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectPersistedEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectPersistedEvent.java
@@ -19,6 +19,14 @@
 package org.apache.isis.applib.events.lifecycle;
 
 /**
+ * Broadcast when an entity is first saved (inserted) into the database either
+ * explicitly using the
+ * {@link org.apache.isis.applib.services.repository.RepositoryService}, or
+ * implicitly, for example due to persistence-by-reachability or similar
+ * persistence mechanisms.
+ *
+ * @see ObjectPersistingEvent
+ *
  * @since 1.x {@index}
  */
 public abstract class ObjectPersistedEvent<S> extends AbstractLifecycleEvent<S> {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectPersistingEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectPersistingEvent.java
index 74c0dcb..d7518ba 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectPersistingEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectPersistingEvent.java
@@ -19,6 +19,14 @@
 package org.apache.isis.applib.events.lifecycle;
 
 /**
+ * Broadcast when an entity is about to be saved (inserted) into the database
+ * either explicitly using the
+ * {@link org.apache.isis.applib.services.repository.RepositoryService}, or
+ * implicitly, for example due to persistence-by-reachability or similar
+ * persistence mechanisms.
+ *
+ * @see ObjectPersistedEvent
+ *
  * @since 1.x {@index}
  */
 public abstract class ObjectPersistingEvent<S> extends AbstractLifecycleEvent<S> {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectRemovingEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectRemovingEvent.java
index aa23e84..0ff9995 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectRemovingEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectRemovingEvent.java
@@ -19,6 +19,14 @@
 package org.apache.isis.applib.events.lifecycle;
 
 /**
+ * Broadcast when an entity is about to be removed (deleted) into the database
+ * either explicitly using the
+ * {@link org.apache.isis.applib.services.repository.RepositoryService}, or
+ * implicitly, for example due to cascade delete or similar
+ * persistence mechanisms.
+ *
+ * @see ObjectRemovingEvent
+ *
  * @since 1.x {@index}
  */
 public abstract class ObjectRemovingEvent<S> extends AbstractLifecycleEvent<S> {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectUpdatedEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectUpdatedEvent.java
index b835a38..860873b 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectUpdatedEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectUpdatedEvent.java
@@ -19,6 +19,11 @@
 package org.apache.isis.applib.events.lifecycle;
 
 /**
+ * Broadcast when an entity has just been updated in the database, usually
+ * as the result of the ORM dirty tracking mechanisms.
+ *
+ * @see ObjectUpdatingEvent
+ *
  * @since 1.x {@index}
  */
 public abstract class ObjectUpdatedEvent<S> extends AbstractLifecycleEvent<S> {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectUpdatingEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectUpdatingEvent.java
index ca3ff49..1c6764d 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectUpdatingEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/lifecycle/ObjectUpdatingEvent.java
@@ -19,6 +19,11 @@
 package org.apache.isis.applib.events.lifecycle;
 
 /**
+ * Broadcast when an entity is about to be updated in the database, usually
+ * as the result of the ORM dirty tracking mechanisms.
+ *
+ * @see ObjectUpdatedEvent
+ *
  * @since 1.x {@index}
  */
 public abstract class ObjectUpdatingEvent<S> extends AbstractLifecycleEvent<S> {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/ui/CssClassUiEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/ui/CssClassUiEvent.java
index bc84e18..cee48d0 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/ui/CssClassUiEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/ui/CssClassUiEvent.java
@@ -23,7 +23,26 @@ import org.apache.isis.applib.annotation.DomainObjectLayout;
 import lombok.Getter;
 
 /**
- * Emitted for subscribers to obtain a cssClass hint (equivalent to the <tt>cssClass()</tt> supporting method or the {@link DomainObjectLayout#cssClass()} attribute).
+ * Emitted for subscribers to provide a cssClass hint (equivalent to the
+ * <tt>cssClass()</tt> supporting method or the
+ * {@link DomainObjectLayout#cssClass()} element).
+ *
+ * <p>
+ * The class has a number of responsibilities:
+ * </p>
+ *
+ * <ul>
+ *     <li>
+ *          capture the target object being interacted with
+ *     </li>
+ *     <li>
+ *          capture the CSS class, if any, as specified to one of the subscribers
+ *     </li>
+ * </ul>
+ *
+ * <p>
+ *  The class itself is instantiated automatically by the framework.
+ * </p>
  *
  * @since 1.x {@index}
  */
@@ -31,21 +50,28 @@ public abstract class CssClassUiEvent<S> extends AbstractUiEvent<S> {
 
     /**
      * This class is the default for the
-     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#cssClassUiEvent()} annotation attribute.  Whether this
-     * raises an event or not depends upon the <tt>isis.core.meta-model.annotation.domain-object-layout.css-class-ui-event.post-for-default</tt>
+     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#cssClassUiEvent()}
+     * annotation element.
+     *
+     * <p>
+     * Whether this raises an event or not depends upon the
+     * <tt>isis.applib.annotation.domain-object-layout.css-class-ui-event.post-for-default</tt>
      * configuration property.
+     * </p>
      */
     public static class Default extends CssClassUiEvent<Object> {}
 
     /**
-     * Convenience class to use indicating that an event should <i>not</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event.
+     * Convenience class to use indicating that an event should <i>not</i> be
+     * posted (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Noop extends CssClassUiEvent<Object> {}
 
     /**
-     * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event..
+     * Convenience class meaning that an event <i>should</i> be posted
+     * (irrespective of the configuration property setting for the
+     * {@link Default} event..
      */
     public static class Doop extends CssClassUiEvent<Object> {}
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/ui/IconUiEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/ui/IconUiEvent.java
index fc70cab..2173e88 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/ui/IconUiEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/ui/IconUiEvent.java
@@ -21,13 +21,38 @@ package org.apache.isis.applib.events.ui;
 import java.util.EventObject;
 
 /**
- * Emitted for subscribers to obtain a cssClass hint (equivalent to the <tt>iconName()</tt> supporting method).
+ * Emitted for subscribers to provide a cssClass hint (equivalent to the
+ * <tt>iconName()</tt> supporting method).
+ *
+ * <p>
+ * The class has a number of responsibilities:
+ * </p>
+ *
+ * <ul>
+ *     <li>
+ *       capture the target object being interacted with
+ *     </li>
+ *     <li>
+ *      capture the icon (name), if any, as specified to one of the subscribers
+ *     </li>
+ * </ul>
+ *
+ * <p>
+ * The class itself is instantiated automatically by the framework.
+ * </p>
+ *
+ *
+ * *
+ *
+ *
+ * If the domain object defines its own xref:refguide:applib-methods:reserved.adoc#iconName[iconName()] supporting method, or if it has the
+ * xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#cssClassFa[@DomainObjectLayout#cssClassFa()] attribute, then these will take precedence.
+ * </p>
  *
  * @since 1.x {@index}
  */
 public abstract class IconUiEvent<S> extends AbstractUiEvent<S> {
 
-    // -- constructors
     /**
      * If used then the framework will set state via (non-API) setters.
      *
@@ -45,21 +70,24 @@ public abstract class IconUiEvent<S> extends AbstractUiEvent<S> {
 
 
 
-    // -- Default class
     /**
      * This class is the default for the
-     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent()} annotation attribute.  Whether this
-     * raises an event or not depends upon the <tt>isis.core.meta-model.annotation.domain-object-layout.icon-ui-event.post-for-default</tt>
+     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent()}
+     * annotation element.
+     *
+     * <p>
+     * Whether this raises an event or not depends upon the
+     * <tt>isis.applib.annotation.domain-object-layout.icon-ui-event.post-for-default</tt>
      * configuration property.
+     * </p>
      */
     public static class Default extends IconUiEvent<Object> { }
 
 
-    // -- Noop class
-
     /**
-     * Convenience class to use indicating that an event should <i>not</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event.
+     * Convenience class to use indicating that an event should <i>not</i> be
+     * posted (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Noop extends IconUiEvent<Object> { }
 
@@ -67,8 +95,9 @@ public abstract class IconUiEvent<S> extends AbstractUiEvent<S> {
     // -- Doop class
 
     /**
-     * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event..
+     * Convenience class meaning that an event <i>should</i> be posted
+     * (irrespective of the configuration property setting for the
+     * {@link Default} event..
      */
     public static class Doop extends IconUiEvent<Object> { }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/ui/LayoutUiEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/ui/LayoutUiEvent.java
index 06be512..610e0c2 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/ui/LayoutUiEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/ui/LayoutUiEvent.java
@@ -25,7 +25,25 @@ import org.apache.isis.applib.annotation.DomainObjectLayout;
 import lombok.Getter;
 
 /**
- * Emitted for subscribers to obtain a layout hint (equivalent to the <tt>layout()</tt> supporting method).
+ * Emitted for subscribers to obtain a layout hint (equivalent to the
+ * <tt>layout()</tt> supporting method).
+ *
+ * <p>
+ * The class has a number of responsibilities:
+ * </p>
+ *
+ * <ul>
+ *     <li>
+ *          capture the target object being interacted with
+ *     </li>
+ *     <li>
+ *          capture the layout, if any, as specified to one of the subscribers
+ *     </li>
+ * </ul>
+ *
+ * <p>
+ *  The class itself is instantiated automatically by the framework.
+ * </p>
  *
  * @since 1.x {@index}
  */
@@ -33,21 +51,27 @@ public abstract class LayoutUiEvent<S> extends AbstractUiEvent<S> {
 
     /**
      * This class is the default for the
-     * {@link DomainObjectLayout#layoutUiEvent()} annotation attribute.  Whether this
-     * raises an event or not depends upon the <tt>isis.core.meta-model.annotation.domain-object-layout.layout-ui-event.post-for-default</tt>
+     * {@link DomainObjectLayout#layoutUiEvent()} annotation element.
+     *
+     * <p>
+     * Whether this raises an event or not depends upon the
+     * <tt>isis.applib.annotation.domain-object-layout.layout-ui-event.post-for-default</tt>
      * configuration property.
+     * </p>
      */
     public static class Default extends LayoutUiEvent<Object> { }
 
     /**
-     * Convenience class to use indicating that an event should <i>not</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event.
+     * Convenience class to use indicating that an event should <i>not</i> be
+     * posted (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Noop extends LayoutUiEvent<Object> { }
 
     /**
-     * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event..
+     * Convenience class meaning that an event <i>should</i> be posted
+     * (irrespective of the configuration property setting for the
+     * {@link Default} event..
      */
     public static class Doop extends LayoutUiEvent<Object> { }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/ui/TitleUiEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/ui/TitleUiEvent.java
index 121f281..f8332e7 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/ui/TitleUiEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/ui/TitleUiEvent.java
@@ -25,7 +25,25 @@ import org.apache.isis.applib.services.i18n.TranslatableString;
 import lombok.Getter;
 
 /**
- * Emitted for subscribers to obtain a cssClass hint (equivalent to the <tt>title()</tt> supporting method).
+ * Emitted for subscribers to obtain a title hint (equivalent to the
+ * <tt>title()</tt> supporting method).
+ *
+ * <p>
+ * The class has a number of responsibilities:
+ * </p>
+ *
+ * <ul>
+ *     <li>
+ *          capture the target object being interacted with
+ *     </li>
+ *     <li>
+ *          capture the title, if any, as specified to one of the subscribers
+ *     </li>
+ * </ul>
+ *
+ * <p>
+ *  The class itself is instantiated automatically by the framework.
+ * </p>
  *
  * @since 1.x {@index}
  */
@@ -33,21 +51,28 @@ public abstract class TitleUiEvent<S> extends AbstractUiEvent<S> {
 
     /**
      * This class is the default for the
-     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#titleUiEvent()} annotation attribute.  Whether this
-     * raises an event or not depends upon the <tt>isis.core.meta-model.annotation.domain-object-layout.title-ui-event.post-for-default</tt>
+     * {@link org.apache.isis.applib.annotation.DomainObjectLayout#titleUiEvent()}
+     * annotation element.
+     *
+     * <p>
+     * Whether this raises an event or not depends upon the
+     * <tt>isis.applib.annotation.domain-object-layout.title-ui-event.post-for-default</tt>
      * configuration property.
+     * </p>
      */
     public static class Default extends TitleUiEvent<Object> {}
 
     /**
-     * Convenience class to use indicating that an event should <i>not</i> be posted (irrespective of the configuration
-     * property seting for the {@link Default} event.
+     * Convenience class to use indicating that an event should <i>not</i> be
+     * posted (irrespective of the configuration property seting for the
+     * {@link Default} event.
      */
     public static class Noop extends TitleUiEvent<Object> {}
 
     /**
-     * Convenience class meaning that an event <i>should</i> be posted (irrespective of the configuration
-     * property setting for the {@link Default} event..
+     * Convenience class meaning that an event <i>should</i> be posted
+     * (irrespective of the configuration property setting for the
+     * {@link Default} event.
      */
     public static class Doop extends TitleUiEvent<Object> {}
 


[isis] 02/11: ISIS-439: further work removing dead code re: mutable collections

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

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

commit 1bba29d2ee299c885634dd10eb43840ee79e82ec
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Mar 3 06:56:44 2021 +0000

    ISIS-439: further work removing dead code re: mutable collections
---
 .../modify/CollectionDomainEventFacet.java         |  2 +-
 .../modify/CollectionDomainEventFacetAbstract.java | 41 +----------
 .../validate/CollectionValidateAddToFacet.java     | 40 -----------
 .../CollectionValidateAddToFacetAbstract.java      | 47 ------------
 .../CollectionValidateAddToFacetViaMethod.java     | 83 ---------------------
 .../CollectionValidateRemoveFromFacet.java         | 39 ----------
 .../CollectionValidateRemoveFromFacetAbstract.java | 46 ------------
 ...CollectionValidateRemoveFromFacetViaMethod.java | 84 ----------------------
 .../interactions/CollectionAddToContext.java       | 62 ----------------
 .../interactions/CollectionRemoveFromContext.java  | 62 ----------------
 .../services/metamodel/DomainMemberDefault.java    | 17 ++---
 .../rendering/domainobjects/MemberType.java        |  2 -
 12 files changed, 10 insertions(+), 515 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java
index da2afed..6ebc17a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java
@@ -28,7 +28,7 @@ import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
  * Corresponds to <tt>@Collection(domainEvent=...)</tt> annotation in the Isis programming model.
  */
 public interface CollectionDomainEventFacet
-extends SingleClassValueFacet, HidingInteractionAdvisor, DisablingInteractionAdvisor, ValidatingInteractionAdvisor {
+extends SingleClassValueFacet, HidingInteractionAdvisor, DisablingInteractionAdvisor {
 
 }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
index 23cb8b9..d63ec04 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
@@ -28,13 +28,12 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.interactions.CollectionAddToContext;
-import org.apache.isis.core.metamodel.interactions.ProposedHolder;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 
-public abstract class CollectionDomainEventFacetAbstract extends SingleClassValueFacetAbstract implements CollectionDomainEventFacet {
+public abstract class CollectionDomainEventFacetAbstract
+        extends SingleClassValueFacetAbstract
+        implements CollectionDomainEventFacet {
 
     private final DomainEventHelper domainEventHelper;
     private final TranslationService translationService;
@@ -105,38 +104,4 @@ public abstract class CollectionDomainEventFacetAbstract extends SingleClassValu
         return null;
     }
 
-    @Override
-    public String invalidates(final ValidityContext ic) {
-
-        // if this is a mixin, then this ain't true.
-        if(!(ic instanceof ProposedHolder)) {
-            return null;
-        }
-        final ProposedHolder catc = (ProposedHolder) ic;
-        final Object proposed = catc.getProposed().getPojo();
-
-        final CollectionDomainEvent.Of of =
-                ic instanceof CollectionAddToContext
-                ? CollectionDomainEvent.Of.ADD_TO
-                        : CollectionDomainEvent.Of.REMOVE_FROM;
-
-        final CollectionDomainEvent<?, ?> event =
-                domainEventHelper.postEventForCollection(
-                        AbstractDomainEvent.Phase.VALIDATE,
-                        getEventType(), null,
-                        getIdentified(), ic.getHead(),
-                        of,
-                        proposed);
-        if (event != null && event.isInvalid()) {
-            final TranslatableString reasonTranslatable = event.getInvalidityReasonTranslatable();
-            if(reasonTranslatable != null) {
-                return reasonTranslatable.translate(translationService, translationContext);
-            }
-            return event.getInvalidityReason();
-        }
-
-        return null;
-    }
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateAddToFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateAddToFacet.java
deleted file mode 100644
index b6a97f0..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateAddToFacet.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 org.apache.isis.core.metamodel.facets.collections.validate;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-/**
- * Validate that an object can be added to a collection.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to invoking the
- * <tt>validateAddToXxx</tt> support method for a collection.
- *
- */
-public interface CollectionValidateAddToFacet extends Facet, ValidatingInteractionAdvisor {
-
-    /**
-     * Reason the object cannot be added, or <tt>null</tt> if okay.
-     */
-    public String invalidReason(ManagedObject target, ManagedObject proposedArgument);
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateAddToFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateAddToFacetAbstract.java
deleted file mode 100644
index 0cdeb01..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateAddToFacetAbstract.java
+++ /dev/null
@@ -1,47 +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 org.apache.isis.core.metamodel.facets.collections.validate;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.interactions.CollectionAddToContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
-
-public abstract class CollectionValidateAddToFacetAbstract extends FacetAbstract implements CollectionValidateAddToFacet {
-
-    public static Class<? extends Facet> type() {
-        return CollectionValidateAddToFacet.class;
-    }
-
-    public CollectionValidateAddToFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
-    }
-
-    @Override
-    public String invalidates(final ValidityContext context) {
-        if (!(context instanceof CollectionAddToContext)) {
-            return null;
-        }
-        final CollectionAddToContext collectionAddToContext = (CollectionAddToContext) context;
-        return invalidReason(context.getTarget(), collectionAddToContext.getProposed());
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateAddToFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateAddToFacetViaMethod.java
deleted file mode 100644
index 7d1427b..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateAddToFacetViaMethod.java
+++ /dev/null
@@ -1,83 +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 org.apache.isis.core.metamodel.facets.collections.validate;
-
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.applib.services.i18n.TranslatableString;
-import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-
-public class CollectionValidateAddToFacetViaMethod extends CollectionValidateAddToFacetAbstract implements ImperativeFacet {
-
-    private final Method method;
-    private final TranslationService translationService;
-    private final String translationContext;
-
-    public CollectionValidateAddToFacetViaMethod(final Method method, final TranslationService translationService, final String translationContext, final FacetHolder holder) {
-        super(holder);
-        this.method = method;
-        this.translationService = translationService;
-        this.translationContext = translationContext;
-    }
-
-    /**
-     * Returns a singleton list of the {@link Method} provided in the
-     * constructor.
-     */
-    @Override
-    public List<Method> getMethods() {
-        return Collections.singletonList(method);
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.CHECK_IF_VALID;
-    }
-
-    @Override
-    public String invalidReason(final ManagedObject owningAdapter, final ManagedObject proposedAdapter) {
-        final Object returnValue = ManagedObjects.InvokeUtil.invoke(method, owningAdapter, proposedAdapter);
-        if(returnValue instanceof String) {
-            return (String) returnValue;
-        }
-        if(returnValue instanceof TranslatableString) {
-            final TranslatableString ts = (TranslatableString) returnValue;
-            return ts.translate(translationService, translationContext);
-        }
-        return null;
-    }
-
-    @Override
-    protected String toStringValues() {
-        return "method=" + method;
-    }
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateRemoveFromFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateRemoveFromFacet.java
deleted file mode 100644
index e097440..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateRemoveFromFacet.java
+++ /dev/null
@@ -1,39 +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 org.apache.isis.core.metamodel.facets.collections.validate;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-/**
- * Validate that an object can be removed to a collection.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to invoking the
- * <tt>validateRemoveFromXxx</tt> support method for a collection.
- */
-public interface CollectionValidateRemoveFromFacet extends Facet, ValidatingInteractionAdvisor {
-
-    /**
-     * Reason the object cannot be removed, or <tt>null</tt> if okay.
-     */
-    public String invalidReason(ManagedObject inObject, ManagedObject value);
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateRemoveFromFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateRemoveFromFacetAbstract.java
deleted file mode 100644
index 97a779b..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateRemoveFromFacetAbstract.java
+++ /dev/null
@@ -1,46 +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 org.apache.isis.core.metamodel.facets.collections.validate;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.interactions.CollectionRemoveFromContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
-
-public abstract class CollectionValidateRemoveFromFacetAbstract extends FacetAbstract implements CollectionValidateRemoveFromFacet {
-
-    public static Class<? extends Facet> type() {
-        return CollectionValidateRemoveFromFacet.class;
-    }
-
-    public CollectionValidateRemoveFromFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
-    }
-
-    @Override
-    public String invalidates(final ValidityContext context) {
-        if (!(context instanceof CollectionRemoveFromContext)) {
-            return null;
-        }
-        final CollectionRemoveFromContext collectionRemoveFromContext = (CollectionRemoveFromContext) context;
-        return invalidReason(context.getTarget(), collectionRemoveFromContext.getProposed());
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateRemoveFromFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateRemoveFromFacetViaMethod.java
deleted file mode 100644
index 978287b..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/validate/CollectionValidateRemoveFromFacetViaMethod.java
+++ /dev/null
@@ -1,84 +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 org.apache.isis.core.metamodel.facets.collections.validate;
-
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.applib.services.i18n.TranslatableString;
-import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-
-public class CollectionValidateRemoveFromFacetViaMethod extends CollectionValidateRemoveFromFacetAbstract implements ImperativeFacet {
-
-    private final Method method;
-    private final TranslationService translationService;
-    private final String translationContext;
-
-    public CollectionValidateRemoveFromFacetViaMethod(final Method method, final TranslationService translationService, final String translationContext, final FacetHolder holder) {
-        super(holder);
-        this.method = method;
-        this.translationService = translationService;
-        this.translationContext = translationContext;
-    }
-
-    /**
-     * Returns a singleton list of the {@link Method} provided in the
-     * constructor.
-     */
-    @Override
-    public List<Method> getMethods() {
-        return Collections.singletonList(method);
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.CHECK_IF_VALID;
-    }
-
-    @Override
-    public String invalidReason(final ManagedObject owningAdapter, final ManagedObject proposedAdapter) {
-        final Object returnValue = ManagedObjects.InvokeUtil.invoke(method, owningAdapter, proposedAdapter);
-        if(returnValue instanceof String) {
-            return (String) returnValue;
-        }
-        if(returnValue instanceof TranslatableString) {
-            final TranslatableString ts = (TranslatableString) returnValue;
-            return ts.translate(translationService, translationContext);
-        }
-        return null;
-    }
-
-    @Override
-    protected String toStringValues() {
-        return "method=" + method;
-    }
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java
deleted file mode 100644
index 9ac9bfc..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java
+++ /dev/null
@@ -1,62 +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 org.apache.isis.core.metamodel.interactions;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.wrapper.events.CollectionAddToEvent;
-import org.apache.isis.core.metamodel.consent.InteractionContextType;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
-
-/**
- * See {@link InteractionContext} for overview; analogous to
- * {@link CollectionAddToEvent}.
- */
-public class CollectionAddToContext 
-extends ValidityContext 
-implements ProposedHolder {
-
-    private final ManagedObject proposed;
-
-    public CollectionAddToContext(
-            final InteractionHead head,
-            final Identifier id,
-            final ManagedObject proposed,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        super(InteractionContextType.COLLECTION_ADD_TO, head, id, interactionInitiatedBy);
-
-        this.proposed = proposed;
-    }
-
-    @Override
-    public ManagedObject getProposed() {
-        return proposed;
-    }
-
-    @Override
-    public CollectionAddToEvent createInteractionEvent() {
-        return new CollectionAddToEvent(
-                UnwrapUtil.single(getTarget()), 
-                getIdentifier(), 
-                UnwrapUtil.single(getProposed()));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java
deleted file mode 100644
index 088cf24..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java
+++ /dev/null
@@ -1,62 +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 org.apache.isis.core.metamodel.interactions;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.wrapper.events.CollectionRemoveFromEvent;
-import org.apache.isis.core.metamodel.consent.InteractionContextType;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
-
-/**
- * See {@link InteractionContext} for overview; analogous to
- * {@link CollectionRemoveFromEvent}.
- */
-public class CollectionRemoveFromContext 
-extends ValidityContext 
-implements ProposedHolder{
-
-    private final ManagedObject proposed;
-
-    public CollectionRemoveFromContext(
-            final InteractionHead head,
-            final Identifier identifier,
-            final ManagedObject proposed,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        super(InteractionContextType.COLLECTION_REMOVE_FROM, head, identifier, interactionInitiatedBy);
-
-        this.proposed = proposed;
-    }
-
-    @Override
-    public ManagedObject getProposed() {
-        return proposed;
-    }
-
-    @Override
-    public CollectionRemoveFromEvent createInteractionEvent() {
-        return new CollectionRemoveFromEvent(
-                UnwrapUtil.single(getTarget()), 
-                getIdentifier(), 
-                UnwrapUtil.single(getProposed()));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java
index 253704c..c5287a9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java
@@ -37,8 +37,6 @@ import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
 import org.apache.isis.core.metamodel.facets.actions.validate.ActionValidationFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
@@ -69,7 +67,7 @@ public class DomainMemberDefault implements DomainMember {
     private final ObjectMember member;
     private ObjectAction action;
 
-    // to support JAX-B marshaling 
+    // to support JAX-B marshaling
     DomainMemberDefault(){
         throw _Exceptions.unexpectedCodeReach();
     }
@@ -209,7 +207,7 @@ public class DomainMemberDefault implements DomainMember {
                 addIfNotEmpty(interpretFacet(facet), interpretations);
             }
             return !interpretations.isEmpty()
-                    ? interpretations.stream().collect(Collectors.joining(";"))
+                    ? String.join(";", interpretations)
                             : interpretRowAndFacet(ActionDefaultsFacet.class);
         }
     }
@@ -219,10 +217,7 @@ public class DomainMemberDefault implements DomainMember {
         if(memberType == MemberType.PROPERTY) {
             return interpretRowAndFacet(PropertyValidateFacet.class);
         } else if(memberType == MemberType.COLLECTION) {
-            final SortedSet<String> interpretations = _Sets.newTreeSet();
-            addIfNotEmpty(interpretRowAndFacet(CollectionValidateAddToFacet.class), interpretations);
-            addIfNotEmpty(interpretRowAndFacet(CollectionValidateRemoveFromFacet.class), interpretations);
-            return interpretations.stream().collect(Collectors.joining(";"));
+            return String.join(";", _Sets.newTreeSet());
         } else {
             return interpretRowAndFacet(ActionValidationFacet.class);
         }
@@ -264,7 +259,7 @@ public class DomainMemberDefault implements DomainMember {
         if (ignore(name)) {
             return "";
         }
-        //[ahuber] not sure why abbreviated, so I disabled abbreviation        
+        //[ahuber] not sure why abbreviated, so I disabled abbreviation
         //        final String abbr = StringExtensions.toAbbreviation(name);
         //        return abbr.length()>0 ? abbr : name;
 
@@ -276,11 +271,11 @@ public class DomainMemberDefault implements DomainMember {
                 .contains(name);
     }
 
-    private static final Comparator<DomainMember> comparator = 
+    private static final Comparator<DomainMember> comparator =
             Comparator.comparing(DomainMember::getClassType)
             .thenComparing(DomainMember::getClassName)
             .thenComparing(DomainMember::getType, Comparator.reverseOrder()) // desc
             .thenComparing(DomainMember::getMemberName);
 
 
-}
\ No newline at end of file
+}
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java
index 42207b7..3e35181 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java
@@ -25,8 +25,6 @@ import org.apache.isis.applib.util.Enums;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.facets.actions.validate.ActionValidationFacet;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.isis.core.metamodel.facets.properties.validating.PropertyValidateFacet;


[isis] 06/11: ISIS-439: removes disabled interaction advisor reponsibility from CollectionDomainEventFacet (dead code)

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

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

commit 0ac313b1864c6e2ae86042a8d024391f60b2f166
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Mar 3 09:06:11 2021 +0000

    ISIS-439: removes disabled interaction advisor reponsibility from CollectionDomainEventFacet (dead code)
---
 .../modify/CollectionDomainEventFacet.java         |  2 +-
 .../modify/CollectionDomainEventFacetAbstract.java | 29 ----------------------
 2 files changed, 1 insertion(+), 30 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java
index 6ebc17a..8d79acb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java
@@ -28,7 +28,7 @@ import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
  * Corresponds to <tt>@Collection(domainEvent=...)</tt> annotation in the Isis programming model.
  */
 public interface CollectionDomainEventFacet
-extends SingleClassValueFacet, HidingInteractionAdvisor, DisablingInteractionAdvisor {
+extends SingleClassValueFacet, HidingInteractionAdvisor {
 
 }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
index 7046627..39c1bdc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
@@ -21,14 +21,10 @@ package org.apache.isis.core.metamodel.facets.collections.collection.modify;
 
 import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
-import org.apache.isis.applib.services.i18n.TranslatableString;
-import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 
 public abstract class CollectionDomainEventFacetAbstract
@@ -36,8 +32,6 @@ public abstract class CollectionDomainEventFacetAbstract
         implements CollectionDomainEventFacet {
 
     private final DomainEventHelper domainEventHelper;
-    private final TranslationService translationService;
-    private final String translationContext;
 
     public CollectionDomainEventFacetAbstract(
             final Class<? extends CollectionDomainEvent<?, ?>> eventType,
@@ -46,10 +40,6 @@ public abstract class CollectionDomainEventFacetAbstract
         super(CollectionDomainEventFacet.class, holder, eventType);
         this.eventType = eventType;
 
-        this.translationService = getTranslationService();
-        // sadness: same as in TranslationFactory
-        this.translationContext = ((IdentifiedHolder)holder).getIdentifier().getTranslationContext();
-
         domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry());
     }
 
@@ -83,23 +73,4 @@ public abstract class CollectionDomainEventFacetAbstract
         return null;
     }
 
-    @Override
-    public String disables(final UsabilityContext ic) {
-
-        final CollectionDomainEvent<?, ?> event =
-                domainEventHelper.postEventForCollection(
-                        AbstractDomainEvent.Phase.DISABLE,
-                        getEventType(),
-                        getIdentified(), ic.getHead()
-                );
-        if (event != null && event.isDisabled()) {
-            final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable();
-            if(reasonTranslatable != null) {
-                return reasonTranslatable.translate(translationService, translationContext);
-            }
-            return event.getDisabledReason();
-        }
-        return null;
-    }
-
 }


[isis] 10/11: ISIS-2444 : regen index

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

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

commit 434ef2f593ee8efb5f550cd0a6b42f52a7062166
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Mar 5 08:05:57 2021 +0000

    ISIS-2444 : regen index
---
 .../modules/_overview/pages/about.adoc             |  33 +-----
 .../modules/applib/pages/index/Identifier.adoc     |  10 +-
 .../index/events/domain/AbstractDomainEvent.adoc   |  55 +++++++++-
 .../index/events/domain/ActionDomainEvent.adoc     |  47 +++-----
 .../index/events/domain/CollectionDomainEvent.adoc |  34 ++----
 .../index/events/domain/PropertyDomainEvent.adoc   |  16 ++-
 .../events/lifecycle/AbstractLifecycleEvent.adoc   |   2 +
 .../index/events/lifecycle/ObjectCreatedEvent.adoc |   2 +
 .../index/events/lifecycle/ObjectLoadedEvent.adoc  |   2 +
 .../events/lifecycle/ObjectPersistedEvent.adoc     |   2 +
 .../events/lifecycle/ObjectPersistingEvent.adoc    |   2 +
 .../events/lifecycle/ObjectRemovingEvent.adoc      |   2 +
 .../index/events/lifecycle/ObjectUpdatedEvent.adoc |   2 +
 .../events/lifecycle/ObjectUpdatingEvent.adoc      |   2 +
 .../pages/index/events/ui/CssClassUiEvent.adoc     |   9 +-
 .../applib/pages/index/events/ui/IconUiEvent.adoc  |   9 +-
 .../pages/index/events/ui/LayoutUiEvent.adoc       |   7 ++
 .../applib/pages/index/events/ui/TitleUiEvent.adoc |   9 +-
 .../HasLogicalType.adoc}                           |  16 ++-
 .../modules/applib/pages/index/id/LogicalType.adoc | 120 +++++++++++++++++++++
 .../modules/applib/pages/index/mixins/dto/Dto.adoc |   9 ++
 .../DtoMixinConstants.adoc}                        |   7 +-
 .../pages/index/mixins/dto/Dto_downloadXml.adoc    |   4 +
 .../pages/index/mixins/dto/Dto_downloadXsd.adoc    |  20 +++-
 .../layout/LayoutMixinConstants.adoc}              |   9 +-
 .../mixins/layout/Object_downloadLayoutXml.adoc    |   3 +
 .../index/mixins/layout/Object_openRestApi.adoc    |   3 +
 .../mixins/layout/Object_rebuildMetamodel.adoc     |   3 +
 .../security/HasUsername.adoc}                     |  24 +++--
 .../system}/DomainChangeRecord.adoc                |  14 +--
 .../DomainChangeRecord_openTargetObject.adoc}      |  17 ++-
 .../system/DomainChangeRecord~ChangeType.adoc}     |  14 ++-
 .../system/HasInteractionId.adoc}                  |  23 ++--
 .../index/mixins/system/HasTransactionId.adoc      |  31 ++++++
 .../updates/OnUpdatedAt.adoc}                      |  11 +-
 .../updates/OnUpdatedBy.adoc}                      |  16 ++-
 .../updates/OnUpdatedByAndAt.adoc}                 |  10 +-
 .../services/appfeat/ApplicationFeatureId.adoc     | 105 ++++++++++++++++++
 .../appfeat/ApplicationFeatureRepository.adoc      |   8 +-
 .../appfeat/ApplicationFeatureSort.adoc}           |  43 ++++++--
 .../appfeat/ApplicationMemberSort.adoc}            |  12 ++-
 .../pages/index/services/bookmark/Bookmark.adoc    |  17 ++-
 .../index/services/confview/ConfigurationMenu.adoc |   4 +-
 .../confview/ConfigurationViewService.adoc         |   9 +-
 .../pages/index/services/iactn/Interaction.adoc    |  24 ++---
 .../pages/index/services/iactn/SequenceType.adoc   |  45 ++++++++
 .../services/publishing/spi/EntityChanges.adoc     |  16 +--
 .../pages/index/services/xactn/TransactionId.adoc  |  14 ++-
 .../impl/mixins/HasUniqueId_command.adoc           |   4 +-
 .../api/permission/ApplicationPermission.adoc      |   4 +-
 .../ApplicationPermissionRepository.adoc           |   7 +-
 .../mixins/Persistable_datanucleusIdLong.adoc      |   4 +
 .../mixins/Persistable_datanucleusVersionLong.adoc |   4 +
 .../Persistable_datanucleusVersionTimestamp.adoc   |   4 +
 .../mixins/Persistable_downloadJdoMetadata.adoc    |   2 +
 55 files changed, 699 insertions(+), 226 deletions(-)

diff --git a/antora/components/refguide-index/modules/_overview/pages/about.adoc b/antora/components/refguide-index/modules/_overview/pages/about.adoc
index 2701bf5..333266c 100644
--- a/antora/components/refguide-index/modules/_overview/pages/about.adoc
+++ b/antora/components/refguide-index/modules/_overview/pages/about.adoc
@@ -1244,7 +1244,7 @@ org.yaml:snakeyaml:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:commons:index/collections/Can.adoc[Can], xref:refguide:commons:index/collections/Cardinality.adoc[Cardinality], xref:refguide:commons:index/functional/Result.adoc[Result], xref:refguide:commons:index/having/HasUniqueId.adoc[HasUniqueId], xref:refguide:commons:index/having/HasUpdatedAt.adoc[HasUpdatedAt], xref:refguide:commons:index/having/HasUpdatedBy.adoc[HasUpdatedBy], xref:refguide:commons:index/having/HasUsername.adoc[HasUsername], xref:refguide:commons:index/resource/R [...]
+xref:refguide:commons:index/collections/Can.adoc[Can], xref:refguide:commons:index/collections/Cardinality.adoc[Cardinality], xref:refguide:commons:index/functional/Result.adoc[Result], xref:refguide:commons:index/resource/ResourceCoordinates.adoc[ResourceCoordinates]
 ****
 |===
 
@@ -1424,7 +1424,7 @@ org.jmock:jmock:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:applib:index/AbstractViewModel.adoc[AbstractViewModel], xref:refguide:applib:index/Identifier.adoc[Identifier], xref:refguide:applib:index/IsisModuleApplib.adoc[IsisModuleApplib], xref:refguide:applib:index/RecreatableDomainObject.adoc[RecreatableDomainObject], xref:refguide:applib:index/ViewModel.adoc[ViewModel], xref:refguide:applib:index/adapters/AbstractValueSemanticsProvider.adoc[AbstractValueSemanticsProvider], xref:refguide:applib:index/adapters/DefaultsProvider.adoc [...]
+xref:refguide:applib:index/AbstractViewModel.adoc[AbstractViewModel], xref:refguide:applib:index/Identifier.adoc[Identifier], xref:refguide:applib:index/IsisModuleApplib.adoc[IsisModuleApplib], xref:refguide:applib:index/RecreatableDomainObject.adoc[RecreatableDomainObject], xref:refguide:applib:index/ViewModel.adoc[ViewModel], xref:refguide:applib:index/adapters/AbstractValueSemanticsProvider.adoc[AbstractValueSemanticsProvider], xref:refguide:applib:index/adapters/DefaultsProvider.adoc [...]
 ****
 
 |Apache Isis Core - Code Gen (ByteBuddy)
@@ -3754,12 +3754,12 @@ skinparam {
 }
 hide stereotype
 left to right direction
-skinparam rectangle<<11>> {
+skinparam rectangle<<22>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<22>> {
+skinparam rectangle<<11>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
@@ -5842,30 +5842,7 @@ Artifact: isis-viewer-javafx-ui
 Type: jar
 Directory: /incubator/viewers/javafx/ui
 ----
-|.Components
-****
-o.a.i.incubator.viewer.javafx.ui.components.UiComponentFactoryFx +
-o.a.i.incubator.viewer.javafx.ui.components.markup.MarkupFieldFactory +
-o.a.i.incubator.viewer.javafx.ui.components.number.NumberFieldFactory +
-o.a.i.incubator.viewer.javafx.ui.components.objectref.ObjectReferenceFieldFactory +
-o.a.i.incubator.viewer.javafx.ui.components.other.FallbackFieldFactory +
-o.a.i.incubator.viewer.javafx.ui.components.temporal.TemporalFieldFactory +
-o.a.i.incubator.viewer.javafx.ui.components.text.TextFieldFactory +
-o.a.i.incubator.viewer.javafx.ui.decorator.disabling.DisablingDecoratorForButton +
-o.a.i.incubator.viewer.javafx.ui.decorator.disabling.DisablingDecoratorForFormField +
-o.a.i.incubator.viewer.javafx.ui.decorator.icon.IconDecoratorForLabeled +
-o.a.i.incubator.viewer.javafx.ui.decorator.icon.IconDecoratorForMenuItem +
-o.a.i.incubator.viewer.javafx.ui.decorator.icon.IconServiceDefault +
-o.a.i.incubator.viewer.javafx.ui.decorator.prototyping.PrototypingDecoratorForButton +
-o.a.i.incubator.viewer.javafx.ui.decorator.prototyping.PrototypingDecoratorForFormField +
-o.a.i.incubator.viewer.javafx.ui.decorator.prototyping.PrototypingInfoPopupProvider +
-o.a.i.incubator.viewer.javafx.ui.main.MainViewFx +
-o.a.i.incubator.viewer.javafx.ui.main.UiActionHandlerFx +
-o.a.i.incubator.viewer.javafx.ui.main.UiBuilderFx +
-o.a.i.incubator.viewer.javafx.ui.main.UiContextFxDefault +
-****
-
-.Dependencies
+|.Dependencies
 ****
 org.apache.isis.core:isis-core-runtimeservices:jar:<managed> +
 org.apache.isis.incubator.viewer:isis-viewer-javafx-model:jar:<managed> +
diff --git a/antora/components/refguide-index/modules/applib/pages/index/Identifier.adoc b/antora/components/refguide-index/modules/applib/pages/index/Identifier.adoc
index b448428..42b7e6a 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/Identifier.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/Identifier.adoc
@@ -1,7 +1,7 @@
 = Identifier
 :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 [...]
 
-Combines xref:refguide:applib:index/id/TypeIdentifier.adoc[TypeIdentifier] and member identification (from properties, collections or actions), to a fully qualified _feature_ identifier.
+Combines xref:refguide:applib:index/id/LogicalType.adoc[LogicalType] and member identification (from properties, collections or actions), to a fully qualified _feature_ identifier.
 
 For xref:refguide:applib:index/Identifier.adoc[Identifier] (s) of type _Identifier.Type#CLASS_ member information is left empty.
 
@@ -11,10 +11,10 @@ For xref:refguide:applib:index/Identifier.adoc[Identifier] (s) of type _Identifi
 .Identifier.java
 ----
 class Identifier {
-  Identifier classIdentifier(final TypeIdentifier typeIdentifier)
-  Identifier propertyOrCollectionIdentifier(final TypeIdentifier typeIdentifier, final String propertyOrCollectionName)
-  Identifier actionIdentifier(final TypeIdentifier typeIdentifier, final String actionName, final Class<?>... parameterClasses)
-  Identifier actionIdentifier(final TypeIdentifier typeIdentifier, final String actionName, final Can<String> parameterClassNames)
+  Identifier classIdentifier(final LogicalType typeIdentifier)
+  Identifier propertyOrCollectionIdentifier(final LogicalType typeIdentifier, final String propertyOrCollectionName)
+  Identifier actionIdentifier(final LogicalType typeIdentifier, final String actionName, final Class<?>... parameterClasses)
+  Identifier actionIdentifier(final LogicalType typeIdentifier, final String actionName, final Can<String> parameterClassNames)
   String getLogicalIdentityString(final String delimiter)
   String getClassNaturalName()
   String getMemberNaturalName()
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/domain/AbstractDomainEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/domain/AbstractDomainEvent.adoc
index 656f2ee..0486927 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/domain/AbstractDomainEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/domain/AbstractDomainEvent.adoc
@@ -1,6 +1,12 @@
 = AbstractDomainEvent
 :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 [...]
 
+Superclass for all domain events that are raised by the framework when interacting with actions, properties or collections.
+
+The main purpose of the class is to define the protocol by which subscribers can influence an interaction (eg hide a collection, disable a property, validate action arguments).
+
+The class also provides a simple mechanism to allow adhoc sharing of user data between different phases.
+
 == API
 
 [source,java]
@@ -9,6 +15,7 @@
 class AbstractDomainEvent<S> {
   AbstractDomainEvent()     // <.>
   AbstractDomainEvent(final S source, final Identifier identifier)
+  S getSource()     // <.>
   void setMixedIn(final Object mixedIn)     // <.>
   Object getSubject()     // <.>
   void setEventPhase(Phase phase)     // <.>
@@ -33,6 +40,11 @@ class AbstractDomainEvent<S> {
 --
 If used then the framework will set state via (non-API) setters.
 --
+<.> xref:#getSource__[getSource()]
++
+--
+The domain object raising this event.
+--
 <.> xref:#setMixedIn__Object[setMixedIn(Object)]
 +
 --
@@ -54,10 +66,30 @@ Not API, set by the framework.
 Not API, set by the framework if the no-arg constructor is used.
 --
 <.> xref:#hide__[hide()]
++
+--
+API for subscribers to hide the member.
+--
 <.> xref:#disable__String[disable(String)]
++
+--
+API for subscribers to disable the member, specifying the reason why.
+--
 <.> xref:#disable__TranslatableString[disable(TranslatableString)]
++
+--
+API for subscribers to disable the member, specifying the reason why as a xref:refguide:applib:index/services/i18n/TranslatableString.adoc[TranslatableString] .
+--
 <.> xref:#invalidate__String[invalidate(String)]
++
+--
+API for subscribers to invalidate an interaction, eg invalid arguments to an action.
+--
 <.> xref:#invalidate__TranslatableString[invalidate(TranslatableString)]
++
+--
+API for subscribers to invalidate an interaction, specifying the reason as a xref:refguide:applib:index/services/i18n/TranslatableString.adoc[TranslatableString] .
+--
 <.> xref:#veto__String_Object[veto(String, Object)]
 +
 --
@@ -76,7 +108,7 @@ Obtain user-data, as set by a previous _#getEventPhase() phase_ .
 <.> xref:#put__Object_Object[put(Object, Object)]
 +
 --
-Set user-data, for the use of a subsequent _#getEventPhase() phase_ .
+Mechanism to allow subscribers to share arbitrary information between phases. One event instance is used for both the hide and disable phases, and a different event instance is shared between validate/pre-execute/post-execute. Set user-data, for the use of a subsequent _#getEventPhase() phase_ .
 --
 
 == Members
@@ -88,6 +120,15 @@ If used then the framework will set state via (non-API) setters.
 
 Because the xref:refguide:applib:index/events/EventObjectBase.adoc[EventObjectBase] superclass prohibits a null source, a dummy value is temporarily used.
 
+[#getSource__]
+=== getSource()
+
+The domain object raising this event.
+
+For a "regular" action, property or collection then this will be the target domain object.
+
+But for a "mixin" action, this will be an instance of the mixin itself.
+
 [#setMixedIn__Object]
 === setMixedIn(Object)
 
@@ -111,18 +152,28 @@ Not API, set by the framework if the no-arg constructor is used.
 [#hide__]
 === hide()
 
+API for subscribers to hide the member.
+
 [#disable__String]
 === disable(String)
 
+API for subscribers to disable the member, specifying the reason why.
+
 [#disable__TranslatableString]
 === disable(TranslatableString)
 
+API for subscribers to disable the member, specifying the reason why as a xref:refguide:applib:index/services/i18n/TranslatableString.adoc[TranslatableString] .
+
 [#invalidate__String]
 === invalidate(String)
 
+API for subscribers to invalidate an interaction, eg invalid arguments to an action.
+
 [#invalidate__TranslatableString]
 === invalidate(TranslatableString)
 
+API for subscribers to invalidate an interaction, specifying the reason as a xref:refguide:applib:index/services/i18n/TranslatableString.adoc[TranslatableString] .
+
 [#veto__String_Object]
 === veto(String, Object)
 
@@ -145,4 +196,4 @@ Obtain user-data, as set by a previous _#getEventPhase() phase_ .
 [#put__Object_Object]
 === put(Object, Object)
 
-Set user-data, for the use of a subsequent _#getEventPhase() phase_ .
+Mechanism to allow subscribers to share arbitrary information between phases. One event instance is used for both the hide and disable phases, and a different event instance is shared between validate/pre-execute/post-execute. Set user-data, for the use of a subsequent _#getEventPhase() phase_ .
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/domain/ActionDomainEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/domain/ActionDomainEvent.adoc
index c6afbc3..f039de0 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/domain/ActionDomainEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/domain/ActionDomainEvent.adoc
@@ -1,6 +1,17 @@
 = ActionDomainEvent
 :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 [...]
 
+Fired whenever the framework interacts with a domain object's action.
+
+This is the specialization of xref:refguide:applib:index/events/domain/AbstractDomainEvent.adoc[AbstractDomainEvent] , for actions, which should then be further subclassed by domain application.
+
+The class has a number of responsibilities (in addition to those it inherits):
+
+* capture the arguments for each of the action's parameters
+* provide selected metadata about the action parameters from the metamodel (names, types)
+
+The class itself is instantiated automatically by the framework using a no-arg constructor; fields are set reflectively.
+
 == API
 
 [source,java]
@@ -20,64 +31,40 @@ class ActionDomainEvent<S> {
 <.> xref:#ActionDomainEvent__[ActionDomainEvent()]
 +
 --
-If used then the framework will set state via (non-API) setters.
+Subtypes can define a no-arg constructor; the framework sets state via (non-API) setters.
 --
 <.> xref:#setReturnValue__Object[setReturnValue(Object)]
 +
 --
-Set by the framework. Event subscribers can replace the value with some other value if they wish, though only in the _AbstractDomainEvent.Phase#EXECUTED_ phase.
+Set by the framework.
 --
 <.> xref:#setSemantics__SemanticsOf[setSemantics(SemanticsOf)]
-+
---
-Not API - set by the framework.
---
 <.> xref:#setParameterNames__List[setParameterNames(List)]
-+
---
-Not API - set by the framework.
---
 <.> xref:#setParameterTypes__List[setParameterTypes(List)]
-+
---
-Not API - set by the framework.
---
 <.> xref:#setMixedIn__Object[setMixedIn(Object)]
-+
---
-Not API - set by the framework.
---
 
 == Members
 
 [#ActionDomainEvent__]
 === ActionDomainEvent()
 
-If used then the framework will set state via (non-API) setters.
-
-Recommended because it reduces the amount of boilerplate in the domain object classes.
+Subtypes can define a no-arg constructor; the framework sets state via (non-API) setters.
 
 [#setReturnValue__Object]
 === setReturnValue(Object)
 
-Set by the framework. Event subscribers can replace the value with some other value if they wish, though only in the _AbstractDomainEvent.Phase#EXECUTED_ phase.
+Set by the framework.
+
+Event subscribers can replace the value with some other value if they wish, though only in the _AbstractDomainEvent.Phase#EXECUTED_ phase.
 
 [#setSemantics__SemanticsOf]
 === setSemantics(SemanticsOf)
 
-Not API - set by the framework.
-
 [#setParameterNames__List]
 === setParameterNames(List)
 
-Not API - set by the framework.
-
 [#setParameterTypes__List]
 === setParameterTypes(List)
 
-Not API - set by the framework.
-
 [#setMixedIn__Object]
 === setMixedIn(Object)
-
-Not API - set by the framework.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/domain/CollectionDomainEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/domain/CollectionDomainEvent.adoc
index 4a7733e..8dae20e 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/domain/CollectionDomainEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/domain/CollectionDomainEvent.adoc
@@ -1,6 +1,12 @@
 = CollectionDomainEvent
 :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 [...]
 
+Fired whenever the framework interacts with a domain object's collection.
+
+This is the specialization of xref:refguide:applib:index/events/domain/AbstractDomainEvent.adoc[AbstractDomainEvent] , for collections, * which should then be further subclassed by domain application. .
+
+The class itself is instantiated automatically by the framework using a no-arg constructor; fields are set reflectively.
+
 == API
 
 [source,java]
@@ -8,8 +14,6 @@
 ----
 class CollectionDomainEvent<S, T> {
   CollectionDomainEvent()     // <.>
-  void setValue(T value)     // <.>
-  void setOf(Of of)     // <.>
   String toString()
 }
 ----
@@ -17,17 +21,7 @@ class CollectionDomainEvent<S, T> {
 <.> xref:#CollectionDomainEvent__[CollectionDomainEvent()]
 +
 --
-If used then the framework will set state via (non-API) setters.
---
-<.> xref:#setValue__T[setValue(T)]
-+
---
-Not API, set by the framework.
---
-<.> xref:#setOf__Of[setOf(Of)]
-+
---
-Not API; updates from _Of#ACCESS_ to either _Of#ADD_TO_ or _Of#REMOVE_FROM_ when hits the _AbstractDomainEvent.Phase#VALIDATE validation phase_ .
+Subtypes can define a no-arg constructor; the framework sets state via (non-API) setters.
 --
 
 == Members
@@ -35,16 +29,4 @@ Not API; updates from _Of#ACCESS_ to either _Of#ADD_TO_ or _Of#REMOVE_FROM_ when
 [#CollectionDomainEvent__]
 === CollectionDomainEvent()
 
-If used then the framework will set state via (non-API) setters.
-
-Recommended because it reduces the amount of boilerplate in the domain object classes.
-
-[#setValue__T]
-=== setValue(T)
-
-Not API, set by the framework.
-
-[#setOf__Of]
-=== setOf(Of)
-
-Not API; updates from _Of#ACCESS_ to either _Of#ADD_TO_ or _Of#REMOVE_FROM_ when hits the _AbstractDomainEvent.Phase#VALIDATE validation phase_ .
+Subtypes can define a no-arg constructor; the framework sets state via (non-API) setters.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc
index bd15f24..d7f7238 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc
@@ -1,6 +1,16 @@
 = PropertyDomainEvent
 :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 [...]
 
+Fired whenever the framework interacts with a domain object's property.
+
+This is the specialization of xref:refguide:applib:index/events/domain/AbstractDomainEvent.adoc[AbstractDomainEvent] , for properties, * which should then be further subclassed by domain application.
+
+The class has a number of responsibilities (in addition to those it inherits):
+
+* capture the old and new values of the property
+
+The class itself is instantiated automatically by the framework using a no-arg constructor; fields are set reflectively.
+
 == API
 
 [source,java]
@@ -15,7 +25,7 @@ class PropertyDomainEvent<S, T> {
 <.> xref:#PropertyDomainEvent__[PropertyDomainEvent()]
 +
 --
-If used then the framework will set state via (non-API) setters.
+Subtypes can define a no-arg constructor; the framework sets state via (non-API) setters.
 --
 
 == Members
@@ -23,6 +33,4 @@ If used then the framework will set state via (non-API) setters.
 [#PropertyDomainEvent__]
 === PropertyDomainEvent()
 
-If used then the framework will set state via (non-API) setters.
-
-Recommended because it reduces the amount of boilerplate in the domain object classes.
+Subtypes can define a no-arg constructor; the framework sets state via (non-API) setters.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/AbstractLifecycleEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/AbstractLifecycleEvent.adoc
index 001cdfe..55839b1 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/AbstractLifecycleEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/AbstractLifecycleEvent.adoc
@@ -1,6 +1,8 @@
 = AbstractLifecycleEvent
 :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 [...]
 
+Superclass for all lifecycle events that are raised by the framework when loading, saving, updating or deleting objects from the database.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectCreatedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectCreatedEvent.adoc
index db18d3f..58edd87 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectCreatedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectCreatedEvent.adoc
@@ -1,6 +1,8 @@
 = ObjectCreatedEvent
 :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 [...]
 
+Broadcast when an object (entiy or view model) is first instantiated using the _org.apache.isis.applib.services.factory.FactoryService_ .
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
index 7260199..0e11712 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
@@ -1,6 +1,8 @@
 = ObjectLoadedEvent
 :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 [...]
 
+Broadcast when an entity is retrieved from the database.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectPersistedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectPersistedEvent.adoc
index 1f7a3b2..df581b1 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectPersistedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectPersistedEvent.adoc
@@ -1,6 +1,8 @@
 = ObjectPersistedEvent
 :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 [...]
 
+Broadcast when an entity is first saved (inserted) into the database either explicitly using the _org.apache.isis.applib.services.repository.RepositoryService_ , or implicitly, for example due to persistence-by-reachability or similar persistence mechanisms.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectPersistingEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectPersistingEvent.adoc
index abf8b50..3ba1ce9 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectPersistingEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectPersistingEvent.adoc
@@ -1,6 +1,8 @@
 = ObjectPersistingEvent
 :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 [...]
 
+Broadcast when an entity is about to be saved (inserted) into the database either explicitly using the _org.apache.isis.applib.services.repository.RepositoryService_ , or implicitly, for example due to persistence-by-reachability or similar persistence mechanisms.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectRemovingEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectRemovingEvent.adoc
index f7bfa79..24a018d 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectRemovingEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectRemovingEvent.adoc
@@ -1,6 +1,8 @@
 = ObjectRemovingEvent
 :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 [...]
 
+Broadcast when an entity is about to be removed (deleted) into the database either explicitly using the _org.apache.isis.applib.services.repository.RepositoryService_ , or implicitly, for example due to cascade delete or similar persistence mechanisms.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectUpdatedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectUpdatedEvent.adoc
index ee8ce80..ba1d9ca 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectUpdatedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectUpdatedEvent.adoc
@@ -1,6 +1,8 @@
 = ObjectUpdatedEvent
 :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 [...]
 
+Broadcast when an entity has just been updated in the database, usually as the result of the ORM dirty tracking mechanisms.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectUpdatingEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectUpdatingEvent.adoc
index 5a4d97c..d53eedb 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectUpdatingEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectUpdatingEvent.adoc
@@ -1,6 +1,8 @@
 = ObjectUpdatingEvent
 :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 [...]
 
+Broadcast when an entity is about to be updated in the database, usually as the result of the ORM dirty tracking mechanisms.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/ui/CssClassUiEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/ui/CssClassUiEvent.adoc
index 860c7df..02ea467 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/ui/CssClassUiEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/ui/CssClassUiEvent.adoc
@@ -1,7 +1,14 @@
 = CssClassUiEvent
 :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 [...]
 
-Emitted for subscribers to obtain a cssClass hint (equivalent to the `cssClass()` supporting method or the _DomainObjectLayout#cssClass()_ attribute).
+Emitted for subscribers to provide a cssClass hint (equivalent to the `cssClass()` supporting method or the _DomainObjectLayout#cssClass()_ element).
+
+The class has a number of responsibilities:
+
+* capture the target object being interacted with
+* capture the CSS class, if any, as specified to one of the subscribers
+
+The class itself is instantiated automatically by the framework.
 
 == API
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/ui/IconUiEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/ui/IconUiEvent.adoc
index 5e84c61..a377408 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/ui/IconUiEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/ui/IconUiEvent.adoc
@@ -1,7 +1,14 @@
 = IconUiEvent
 :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 [...]
 
-Emitted for subscribers to obtain a cssClass hint (equivalent to the `iconName()` supporting method).
+Emitted for subscribers to provide a cssClass hint (equivalent to the `iconName()` supporting method).* If the domain object defines its own xref:refguide:applib-methods:reserved.adoc#iconName[iconName()] supporting method, or if it has the xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#cssClassFa[@DomainObjectLayout#cssClassFa()] attribute, then these will take precedence.
+
+The class has a number of responsibilities:
+
+* capture the target object being interacted with
+* capture the icon (name), if any, as specified to one of the subscribers
+
+The class itself is instantiated automatically by the framework.
 
 == API
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/ui/LayoutUiEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/ui/LayoutUiEvent.adoc
index ffb2642..bf734038 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/ui/LayoutUiEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/ui/LayoutUiEvent.adoc
@@ -3,6 +3,13 @@
 
 Emitted for subscribers to obtain a layout hint (equivalent to the `layout()` supporting method).
 
+The class has a number of responsibilities:
+
+* capture the target object being interacted with
+* capture the layout, if any, as specified to one of the subscribers
+
+The class itself is instantiated automatically by the framework.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/ui/TitleUiEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/events/ui/TitleUiEvent.adoc
index 4582567..b454187 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/ui/TitleUiEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/events/ui/TitleUiEvent.adoc
@@ -1,7 +1,14 @@
 = TitleUiEvent
 :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 [...]
 
-Emitted for subscribers to obtain a cssClass hint (equivalent to the `title()` supporting method).
+Emitted for subscribers to obtain a title hint (equivalent to the `title()` supporting method).
+
+The class has a number of responsibilities:
+
+* capture the target object being interacted with
+* capture the title, if any, as specified to one of the subscribers
+
+The class itself is instantiated automatically by the framework.
 
 == API
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/id/HasLogicalType.adoc
similarity index 74%
copy from antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/id/HasLogicalType.adoc
index 7260199..326758d 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/id/HasLogicalType.adoc
@@ -1,14 +1,20 @@
-= ObjectLoadedEvent
+= HasLogicalType _(interface)_
 :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 [...]
 
 == API
 
 [source,java]
-.ObjectLoadedEvent.java
+.HasLogicalType.java
 ----
-class ObjectLoadedEvent<S> {
-  ObjectLoadedEvent()
-  ObjectLoadedEvent(final S source)
+interface HasLogicalType {
+  LogicalType getLogicalType()
+  String getLogicalTypeName()     // <.>
 }
 ----
 
+<.> xref:#getLogicalTypeName__[getLogicalTypeName()]
+
+== Members
+
+[#getLogicalTypeName__]
+=== getLogicalTypeName()
diff --git a/antora/components/refguide-index/modules/applib/pages/index/id/LogicalType.adoc b/antora/components/refguide-index/modules/applib/pages/index/id/LogicalType.adoc
new file mode 100644
index 0000000..c903813
--- /dev/null
+++ b/antora/components/refguide-index/modules/applib/pages/index/id/LogicalType.adoc
@@ -0,0 +1,120 @@
+= LogicalType
+: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 [...]
+
+A generalization of Java's class type to also hold a logical name, which can be supplied lazily.
+
+Equality is driven by the corresponding class exclusively, meaning the logical name is ignored in order to not cause any side-effects on logical name memoization eg. it happening too early.
+
+Meta-model validators will take care, that there is no logical name ambiguity: There cannot be any LogicalTypes sharing the same corresponding class while having different logical names.
+
+== API
+
+[source,java]
+.LogicalType.java
+----
+class LogicalType {
+  LogicalType lazy(final Class<?> correspondingClass, final Supplier<String> logicalNameProvider)     // <.>
+  LogicalType eager(final Class<?> correspondingClass, final String logicalName)     // <.>
+  LogicalType fqcn(final Class<?> correspondingClass)     // <.>
+  String getClassName()     // <.>
+  String getLogicalTypeName()     // <.>
+  String getLogicalTypeSimpleName()     // <.>
+  String getNamespace()     // <.>
+  String getLogicalTypeNameFormatted(final String root, final String delimiter)     // <.>
+  boolean equals(final Object obj)
+  boolean isEqualTo(final LogicalType other)
+  int hashCode()
+  int compareTo(final LogicalType other)
+}
+----
+
+<.> xref:#lazy__Class_Supplier[lazy(Class, Supplier)]
++
+--
+Returns a new TypeIdentifier based on the corresponding class and a _logicalNameProvider_ for lazy logical name lookup.
+--
+<.> xref:#eager__Class_String[eager(Class, String)]
++
+--
+Returns a new TypeIdentifier based on the corresponding class and (ahead of time) known _logicalName_ .
+--
+<.> xref:#fqcn__Class[fqcn(Class)]
++
+--
+Use the corresponding class's fully qualified name for the _logicalName_ . Most likely used in testing scenarios.
+--
+<.> xref:#getClassName__[getClassName()]
++
+--
+Canonical name of the corresponding class.
+--
+<.> xref:#getLogicalTypeName__[getLogicalTypeName()]
++
+--
+Returns the (unique) logical-type-name, as per the _ObjectSpecIdFacet_ .
+--
+<.> xref:#getLogicalTypeSimpleName__[getLogicalTypeSimpleName()]
++
+--
+The logical type name consists of 2 parts, the _namespace_ and the _logical simple name_ .
+--
+<.> xref:#getNamespace__[getNamespace()]
++
+--
+The logical type name consists of 2 parts, the _namespace_ and the _logical simple name_ .
+--
+<.> xref:#getLogicalTypeNameFormatted__String_String[getLogicalTypeNameFormatted(String, String)]
++
+--
+The logical type name consists of 2 parts, the _namespace_ and the _logical simple name_ . Returns a concatenation of _namespace_ , _delimiter_ and the _logical simple name_ , whereas in the absence of a _namespace_ returns a concatenation of _root_ and the _logical simple name_ .
+--
+
+== Members
+
+[#lazy__Class_Supplier]
+=== lazy(Class, Supplier)
+
+Returns a new TypeIdentifier based on the corresponding class and a _logicalNameProvider_ for lazy logical name lookup.
+
+[#eager__Class_String]
+=== eager(Class, String)
+
+Returns a new TypeIdentifier based on the corresponding class and (ahead of time) known _logicalName_ .
+
+[#fqcn__Class]
+=== fqcn(Class)
+
+Use the corresponding class's fully qualified name for the _logicalName_ . Most likely used in testing scenarios.
+
+[#getClassName__]
+=== getClassName()
+
+Canonical name of the corresponding class.
+
+[#getLogicalTypeName__]
+=== getLogicalTypeName()
+
+Returns the (unique) logical-type-name, as per the _ObjectSpecIdFacet_ .
+
+This will typically be the value of the _DomainObject#objectType()_ annotation attribute. If none has been specified then will default to the fully qualified class name (with _ClassSubstitutorRegistry class name substituted_ if necessary to allow for runtime bytecode enhancement.
+
+The _ObjectSpecification_ can be retrieved using _SpecificationLoader#lookupBySpecIdElseLoad(String)_ } passing the logical-type-name as argument.
+
+[#getLogicalTypeSimpleName__]
+=== getLogicalTypeSimpleName()
+
+The logical type name consists of 2 parts, the _namespace_ and the _logical simple name_ .
+
+Returns the _logical simple name_ part.
+
+[#getNamespace__]
+=== getNamespace()
+
+The logical type name consists of 2 parts, the _namespace_ and the _logical simple name_ .
+
+Returns the _namespace_ part.
+
+[#getLogicalTypeNameFormatted__String_String]
+=== getLogicalTypeNameFormatted(String, String)
+
+The logical type name consists of 2 parts, the _namespace_ and the _logical simple name_ . Returns a concatenation of _namespace_ , _delimiter_ and the _logical simple name_ , whereas in the absence of a _namespace_ returns a concatenation of _root_ and the _logical simple name_ .
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto.adoc
index 955735a..61df241 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto.adoc
@@ -1,6 +1,14 @@
 = Dto _(interface)_
 :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 [...]
 
+Allows JAXB-annotated view models to act as a mixee in order that other modules (and the core framework) can contribute behaviour.
+
+A JAXB view model is one annotated with _javax.xml.bind.annotation.XmlRootElement_ .
+
+The two mixin behaviours contributed by the core framework are the ability to download the view model as XML (using xref:refguide:applib:index/mixins/dto/Dto_downloadXml.adoc[Dto_downloadXml] ) and to download the XSD schema for that XML (using xref:refguide:applib:index/mixins/dto/Dto_downloadXsd.adoc[Dto_downloadXsd] ).
+
+The interface is just a marker interface (with no members).
+
 == API
 
 [source,java]
@@ -10,3 +18,4 @@ interface Dto {
 }
 ----
 
+include::hooks/Dto_see-also.adoc[]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/MixinConstants.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/DtoMixinConstants.adoc
similarity index 88%
rename from antora/components/refguide-index/modules/applib/pages/index/mixins/MixinConstants.adoc
rename to antora/components/refguide-index/modules/applib/pages/index/mixins/dto/DtoMixinConstants.adoc
index 7514082..cfc34bd 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/MixinConstants.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/DtoMixinConstants.adoc
@@ -1,13 +1,12 @@
-= MixinConstants
+= DtoMixinConstants
 :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 [...]
 
 == API
 
 [source,java]
-.MixinConstants.java
+.DtoMixinConstants.java
 ----
-class MixinConstants {
-  public static final String METADATA_LAYOUT_GROUPNAME;
+class DtoMixinConstants {
   public static final String FILENAME_PROPERTY_NAME;
   public static final String FILENAME_PROPERTY_DESCRIPTION;
 }
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto_downloadXml.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto_downloadXml.adoc
index eba4f41..1c28cd8 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto_downloadXml.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto_downloadXml.adoc
@@ -1,6 +1,10 @@
 = Dto_downloadXml
 :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 [...]
 
+Mixin that provides the ability to download a view model as XML.
+
+Requires that the view model is a JAXB view model, and implements the xref:refguide:applib:index/mixins/dto/Dto.adoc[Dto] marker interface.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto_downloadXsd.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto_downloadXsd.adoc
index cd483db..e468692 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto_downloadXsd.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/Dto_downloadXsd.adoc
@@ -1,6 +1,12 @@
 = Dto_downloadXsd
 :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 [...]
 
+Mixin that provides the ability to download the XSD schema for a view model can be downloaded as XML.
+
+Requires that the view model is a JAXB view model, and implements the xref:refguide:applib:index/mixins/dto/Dto.adoc[Dto] marker interface.
+
+If the domain object's JAXB annotations reference only a single XSD schema then this will return that XML text as a xref:refguide:applib:index/value/Clob.adoc[Clob] of that XSD. If there are multiple XSD schemas referenced then the action will return a zip of those schemas, wrapped up in a xref:refguide:applib:index/value/Blob.adoc[Blob] .
+
 == API
 
 [source,java]
@@ -11,9 +17,21 @@ class Dto_downloadXsd {
 MessageService messageService;
   @Inject
 JaxbService jaxbService;
-  Object act(final String fileName, final IsisSchemas isisSchemas)
+  Object act(final String fileName, final IsisSchemas isisSchemas)     // <.>
   String default0Act()
   IsisSchemas default1Act()
 }
 ----
 
+<.> xref:#act__String_IsisSchemas[act(String, IsisSchemas)]
++
+--
+The _IsisSchemas_ parameter can be used to optionally ignore the common Apache Isis schemas; useful if there is only one other XSD schema referenced by the DTO.
+--
+
+== Members
+
+[#act__String_IsisSchemas]
+=== act(String, IsisSchemas)
+
+The _IsisSchemas_ parameter can be used to optionally ignore the common Apache Isis schemas; useful if there is only one other XSD schema referenced by the DTO.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/LayoutMixinConstants.adoc
similarity index 85%
copy from antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/layout/LayoutMixinConstants.adoc
index 7260199..0ba5c30 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/LayoutMixinConstants.adoc
@@ -1,14 +1,13 @@
-= ObjectLoadedEvent
+= LayoutMixinConstants
 :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 [...]
 
 == API
 
 [source,java]
-.ObjectLoadedEvent.java
+.LayoutMixinConstants.java
 ----
-class ObjectLoadedEvent<S> {
-  ObjectLoadedEvent()
-  ObjectLoadedEvent(final S source)
+class LayoutMixinConstants {
+  public static final String METADATA_LAYOUT_GROUPNAME;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_downloadLayoutXml.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_downloadLayoutXml.adoc
index c690555..7ea956c 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_downloadLayoutXml.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_downloadLayoutXml.adoc
@@ -1,6 +1,8 @@
 = Object_downloadLayoutXml
 :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 [...]
 
+Provides a mixin to download the layout XML for any domain object.
+
 == API
 
 [source,java]
@@ -15,3 +17,4 @@ LayoutService layoutService;
 }
 ----
 
+include::hooks/Object_downloadLayoutXml_see-also.adoc[]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_openRestApi.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_openRestApi.adoc
index 46d67cc..e1749cb 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_openRestApi.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_openRestApi.adoc
@@ -1,6 +1,8 @@
 = Object_openRestApi
 :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 [...]
 
+Provides the ability to navigate to the corresponding URL of this domain object in the REST API provided by the _Restful Objects_ viewer.
+
 == API
 
 [source,java]
@@ -15,3 +17,4 @@ RestfulPathProvider restfulPathProvider;
 }
 ----
 
+include::hooks/Object_openRestApi_see-also.adoc[]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_rebuildMetamodel.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_rebuildMetamodel.adoc
index 5c88115..bd41993 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_rebuildMetamodel.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_rebuildMetamodel.adoc
@@ -1,6 +1,8 @@
 = Object_rebuildMetamodel
 :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 [...]
 
+Provides the ability to discard the current internal metamodel data for the domain class of the rendered object, and recreate from code and other sources (most notably, layout XML data).
+
 == API
 
 [source,java]
@@ -13,3 +15,4 @@ MetaModelService metaModelService;
 }
 ----
 
+include::hooks/Object_rebuildMetamodel_see-also.adoc[]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/RepresentsInteractionMemberExecution.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/security/HasUsername.adoc
similarity index 53%
rename from antora/components/refguide-index/modules/applib/pages/index/services/RepresentsInteractionMemberExecution.adoc
rename to antora/components/refguide-index/modules/applib/pages/index/mixins/security/HasUsername.adoc
index faba1dd..8a78914 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/RepresentsInteractionMemberExecution.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/security/HasUsername.adoc
@@ -1,17 +1,29 @@
-= RepresentsInteractionMemberExecution _(interface)_
+= HasUsername _(interface)_
 :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 [...]
 
-Extends xref:refguide:commons:index/having/HasUniqueId.adoc[HasUniqueId] , where the _HasUniqueId#getUniqueId()_ is interpreted as an interaction (cf _InteractionDto_ ) that has at least one member execution (cf _MemberExecutionDto_ ) and may (by way of xref:refguide:applib:index/services/wrapper/WrapperFactory.adoc[WrapperFactory] ) contain several.
+Allows domain objects that were created, updated or are otherwise associated with a named user to act as a mixee in order that other modules may contribute behaviour.
 
-Examples could include SPI services that persist published events and status messages.
+The xref:refguide:applib:index/mixins/updates/OnUpdatedBy.adoc[OnUpdatedBy] interface is for entities to be automatically updated by the framework when persisted.
 
 == API
 
 [source,java]
-.RepresentsInteractionMemberExecution.java
+.HasUsername.java
 ----
-interface RepresentsInteractionMemberExecution {
-  int getSequence()
+interface HasUsername {
+  String getUsername()     // <.>
 }
 ----
 
+<.> xref:#getUsername__[getUsername()]
++
+--
+The user that created, updated or is otherwise associated with this object.
+--
+
+== Members
+
+[#getUsername__]
+=== getUsername()
+
+The user that created, updated or is otherwise associated with this object.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/DomainChangeRecord.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/DomainChangeRecord.adoc
similarity index 84%
rename from antora/components/refguide-index/modules/applib/pages/index/services/DomainChangeRecord.adoc
rename to antora/components/refguide-index/modules/applib/pages/index/mixins/system/DomainChangeRecord.adoc
index 199d915..75b3fd4 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/DomainChangeRecord.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/DomainChangeRecord.adoc
@@ -1,7 +1,7 @@
 = DomainChangeRecord _(interface)_
 :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 [...]
 
-An abstraction of some sort of recorded change to a domain object: commands, audit entries or published events.
+Allows domain objects that represents some sort of recorded change to a domain object (commands, audit entries, published interactions) to act as a mixee in order that other modules can contribute behaviour.
 
 == API
 
@@ -10,7 +10,7 @@ An abstraction of some sort of recorded change to a domain object: commands, aud
 ----
 interface DomainChangeRecord {
   ChangeType getType()     // <.>
-  UUID getUniqueId()     // <.>
+  UUID getInteractionId()     // <.>
   String getUsername()     // <.>
   Timestamp getTimestamp()     // <.>
   String getTargetObjectType()     // <.>
@@ -26,10 +26,10 @@ interface DomainChangeRecord {
 --
 Distinguishes commands from audit entries from published events/interactions (when these are shown mixed together in a (standalone) table).
 --
-<.> xref:#getUniqueId__[getUniqueId()]
+<.> xref:#getInteractionId__[getInteractionId()]
 +
 --
-The unique identifier (a GUID) of the transaction in which this change occurred.
+The unique identifier (a GUID) of the _org.apache.isis.applib.services.iactn.Interaction_ within which this change occurred.
 --
 <.> xref:#getUsername__[getUsername()]
 +
@@ -74,10 +74,10 @@ The value of the property after it has changed.
 
 Distinguishes commands from audit entries from published events/interactions (when these are shown mixed together in a (standalone) table).
 
-[#getUniqueId__]
-=== getUniqueId()
+[#getInteractionId__]
+=== getInteractionId()
 
-The unique identifier (a GUID) of the transaction in which this change occurred.
+The unique identifier (a GUID) of the _org.apache.isis.applib.services.iactn.Interaction_ within which this change occurred.
 
 [#getUsername__]
 === getUsername()
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_openRestApi.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/DomainChangeRecord_openTargetObject.adoc
similarity index 56%
copy from antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_openRestApi.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/system/DomainChangeRecord_openTargetObject.adoc
index 46d67cc..064aeb8 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_openRestApi.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/DomainChangeRecord_openTargetObject.adoc
@@ -1,17 +1,24 @@
-= Object_openRestApi
+= DomainChangeRecord_openTargetObject
 :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 [...]
 
+Provides the ability to navigate to a domain object from a xref:refguide:applib:index/mixins/system/DomainChangeRecord.adoc[DomainChangeRecord] which only holds the domain object by way of a _DomainChangeRecord#getTarget() target_ _org.apache.isis.applib.services.bookmark.Bookmark_ .
+
 == API
 
 [source,java]
-.Object_openRestApi.java
+.DomainChangeRecord_openTargetObject.java
 ----
-class Object_openRestApi {
+class DomainChangeRecord_openTargetObject {
   @Inject
 BookmarkService bookmarkService;
   @Inject
-RestfulPathProvider restfulPathProvider;
-  LocalResourcePath act()
+MessageService messageService;
+  @Inject
+MetaModelService metaModelService;
+  DomainChangeRecord_openTargetObject(DomainChangeRecord domainChangeRecord)
+  Object openTargetObject()
+  boolean hideOpenTargetObject()
+  String disableOpenTargetObject()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/DomainChangeRecord~ChangeType.adoc
similarity index 78%
copy from antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/system/DomainChangeRecord~ChangeType.adoc
index 7260199..b644fe0 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/DomainChangeRecord~ChangeType.adoc
@@ -1,14 +1,18 @@
-= ObjectLoadedEvent
+= DomainChangeRecord.ChangeType _(enum)_
 :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 [...]
 
+Enumerates the different types of changes recognised.
+
 == API
 
 [source,java]
-.ObjectLoadedEvent.java
+.DomainChangeRecord~ChangeType.java
 ----
-class ObjectLoadedEvent<S> {
-  ObjectLoadedEvent()
-  ObjectLoadedEvent(final S source)
+enum ChangeType {
+  COMMAND
+  AUDIT_ENTRY
+  PUBLISHED_INTERACTION
+  String toString()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/HasInteractionId.adoc
similarity index 60%
copy from antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/system/HasInteractionId.adoc
index bd15f24..0540eee 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/HasInteractionId.adoc
@@ -1,28 +1,29 @@
-= PropertyDomainEvent
+= HasInteractionId _(interface)_
 :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 [...]
 
+Allows domain objects that represent or are associated with a system xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] to act as a mixee in order that other modules can contribute behaviour.
+
 == API
 
 [source,java]
-.PropertyDomainEvent.java
+.HasInteractionId.java
 ----
-class PropertyDomainEvent<S, T> {
-  PropertyDomainEvent()     // <.>
-  String toString()
+interface HasInteractionId {
+  UUID getInteractionId()     // <.>
 }
 ----
 
-<.> xref:#PropertyDomainEvent__[PropertyDomainEvent()]
+<.> xref:#getInteractionId__[getInteractionId()]
 +
 --
-If used then the framework will set state via (non-API) setters.
+A unique identifier (a GUID).
 --
 
 == Members
 
-[#PropertyDomainEvent__]
-=== PropertyDomainEvent()
+[#getInteractionId__]
+=== getInteractionId()
 
-If used then the framework will set state via (non-API) setters.
+A unique identifier (a GUID).
 
-Recommended because it reduces the amount of boilerplate in the domain object classes.
+include::hooks/HasInteractionId_see-also.adoc[]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/system/HasTransactionId.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/HasTransactionId.adoc
new file mode 100644
index 0000000..ccbe858
--- /dev/null
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/HasTransactionId.adoc
@@ -0,0 +1,31 @@
+= HasTransactionId _(interface)_
+: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 [...]
+
+Extends xref:refguide:applib:index/mixins/system/HasInteractionId.adoc[HasInteractionId] to add a strictly monotonically increasing sequence number so that each transaction within the overall _org.apache.isis.applib.services.iactn.Interaction_ has its own unique identity.
+
+In the vast majority of cases there will only be a single transaction per _org.apache.isis.applib.services.iactn.Interaction_ , but this isn't _always_ the case as domain objects may on occasion need to explicitly manage transaction boundaries using _org.apache.isis.applib.services.xactn.TransactionService_ .
+
+== API
+
+[source,java]
+.HasTransactionId.java
+----
+interface HasTransactionId {
+  int getSequence()     // <.>
+}
+----
+
+<.> xref:#getSequence__[getSequence()]
++
+--
+Holds the sequence number uniquely identifying the transaction number within the overall _org.apache.isis.applib.services.iactn.Interaction_ .
+--
+
+== Members
+
+[#getSequence__]
+=== getSequence()
+
+Holds the sequence number uniquely identifying the transaction number within the overall _org.apache.isis.applib.services.iactn.Interaction_ .
+
+The values in this sequence are ultimately obtained from the non-API method _org.apache.isis.applib.services.iactn.Interaction#next(SequenceType)_ , with a xref:refguide:applib:index/services/iactn/SequenceType.adoc[SequenceType] of _SequenceType#TRANSACTION_ .
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/OnUpdatedAt.adoc
similarity index 73%
copy from antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/updates/OnUpdatedAt.adoc
index 7260199..219519c 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/OnUpdatedAt.adoc
@@ -1,14 +1,15 @@
-= ObjectLoadedEvent
+= OnUpdatedAt _(interface)_
 :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 [...]
 
+Allows domain entities that keep track of when they were updated to be called by the (framework-provided) `TimestampService` whenever modified in a transaction.
+
 == API
 
 [source,java]
-.ObjectLoadedEvent.java
+.OnUpdatedAt.java
 ----
-class ObjectLoadedEvent<S> {
-  ObjectLoadedEvent()
-  ObjectLoadedEvent(final S source)
+interface OnUpdatedAt {
+  void setUpdatedAt(java.sql.Timestamp updatedAt)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationMenu.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/OnUpdatedBy.adoc
similarity index 61%
copy from antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationMenu.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/updates/OnUpdatedBy.adoc
index edb8a9c..edb9c9f 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationMenu.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/OnUpdatedBy.adoc
@@ -1,19 +1,17 @@
-= ConfigurationMenu
+= OnUpdatedBy _(interface)_
 :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 [...]
 
-Simply provides a UI in order to access the configuration properties available from xref:refguide:applib:index/services/confview/ConfigurationViewService.adoc[ConfigurationViewService] .
+Allows domain entities that reference the user that updated them to be called by the (framework-provided) `TimestampService` whenever modified in a transaction with the current user.
+
+Note that this interface defines only a setter. The _org.apache.isis.applib.mixins.security.HasUsername_ can be used to expose this user name, allowing other modules to contribute behaviour to that mixee.
 
 == API
 
 [source,java]
-.ConfigurationMenu.java
+.OnUpdatedBy.java
 ----
-class ConfigurationMenu {
-  ConfigurationMenu(ConfigurationViewService configurationService)
-  Set<ConfigurationProperty> configuration()
+interface OnUpdatedBy {
+  void setUpdatedBy(String updatedBy)
 }
 ----
 
-include::hooks/ConfigurationMenu_010-implementation.adoc[]
-
-include::hooks/ConfigurationMenu_020-examples-and-usage.adoc[]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/OnUpdatedByAndAt.adoc
similarity index 73%
copy from antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/updates/OnUpdatedByAndAt.adoc
index 7260199..ac6fab5 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/OnUpdatedByAndAt.adoc
@@ -1,14 +1,14 @@
-= ObjectLoadedEvent
+= OnUpdatedByAndAt _(interface)_
 :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 [...]
 
+Combines xref:refguide:applib:index/mixins/updates/OnUpdatedBy.adoc[OnUpdatedBy] and xref:refguide:applib:index/mixins/updates/OnUpdatedAt.adoc[OnUpdatedAt] , as these are often implemented together.
+
 == API
 
 [source,java]
-.ObjectLoadedEvent.java
+.OnUpdatedByAndAt.java
 ----
-class ObjectLoadedEvent<S> {
-  ObjectLoadedEvent()
-  ObjectLoadedEvent(final S source)
+interface OnUpdatedByAndAt {
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureId.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureId.adoc
new file mode 100644
index 0000000..23b305d
--- /dev/null
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureId.adoc
@@ -0,0 +1,105 @@
+= ApplicationFeatureId
+: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 [...]
+
+Value type representing a namespace, type or member.
+
+This value is _Comparable_ , the implementation of which considers _#getSort() (feature) sort_ , _#getNamespace() namespace_ , _#getTypeSimpleName() type simple name_ and _#getMemberName() member name_ .
+
+== API
+
+[source,java]
+.ApplicationFeatureId.java
+----
+class ApplicationFeatureId {
+  public static final ApplicationFeatureId NAMESPACE_DEFAULT;
+  @Getter
+@NonNull
+final ApplicationFeatureSort sort;
+  ApplicationFeatureId fromIdentifier(final Identifier identifier)
+  ApplicationFeatureId newFeature(final ApplicationFeatureSort featureSort, final String qualifiedName)
+  ApplicationFeatureId newFeature(final String namespace, final String logicalTypeSimpleName, final String memberName)
+  ApplicationFeatureId newNamespace(final String namespace)
+  ApplicationFeatureId newType(final String logicalTypeName)
+  ApplicationFeatureId newMember(final String logicalTypeName, final String memberName)
+  ApplicationFeatureId newMember(String fullyQualifiedName)
+  String title()     // <.>
+  ApplicationFeatureId getParentTypeFeatureId()     // <.>
+  String getFullyQualifiedName()
+  String getLogicalTypeName()
+  ApplicationFeatureId getParentNamespaceFeatureId()     // <.>
+  String stringify()
+  ApplicationFeatureId parse(final String stringified)     // <.>
+  String asEncodedString()
+  ApplicationFeatureId parseEncoded(final String encodedString)     // <.>
+  Can<ApplicationFeatureId> getPathIds()
+  Can<ApplicationFeatureId> getParentFeatureIds()
+  int compareTo(final ApplicationFeatureId other)
+  boolean equals(final Object o)
+  int hashCode()
+  String toString()
+  ApplicationFeatureId withNamespace(final String namespace)     // <.>
+}
+----
+
+<.> xref:#title__[title()]
++
+--
+having a title() method (rather than using @Title annotation) is necessary as a workaround to be able to use wrapperFactory#unwrap(...) method, which is otherwise broken in Isis 1.6.0
+--
+<.> xref:#getParentTypeFeatureId__[getParentTypeFeatureId()]
++
+--
+The xref:refguide:applib:index/services/appfeat/ApplicationFeatureId.adoc[ApplicationFeatureId] of the member's logical type.
+--
+<.> xref:#getParentNamespaceFeatureId__[getParentNamespaceFeatureId()]
++
+--
+The xref:refguide:applib:index/services/appfeat/ApplicationFeatureId.adoc[ApplicationFeatureId] of the parent package of this class or package.
+--
+<.> xref:#parse__String[parse(String)]
++
+--
+Round-trip with _#stringify()_
+--
+<.> xref:#parseEncoded__String[parseEncoded(String)]
++
+--
+Round-trip with _#asEncodedString()_
+--
+<.> xref:#withNamespace__String[withNamespace(String)]
++
+--
+Returns a new instance that is a clone of this, except for the namespace, which is taken from the argument.
+--
+
+== Members
+
+[#title__]
+=== title()
+
+having a title() method (rather than using @Title annotation) is necessary as a workaround to be able to use wrapperFactory#unwrap(...) method, which is otherwise broken in Isis 1.6.0
+
+[#getParentTypeFeatureId__]
+=== getParentTypeFeatureId()
+
+The xref:refguide:applib:index/services/appfeat/ApplicationFeatureId.adoc[ApplicationFeatureId] of the member's logical type.
+
+[#getParentNamespaceFeatureId__]
+=== getParentNamespaceFeatureId()
+
+The xref:refguide:applib:index/services/appfeat/ApplicationFeatureId.adoc[ApplicationFeatureId] of the parent package of this class or package.
+
+[#parse__String]
+=== parse(String)
+
+Round-trip with _#stringify()_
+
+[#parseEncoded__String]
+=== parseEncoded(String)
+
+Round-trip with _#asEncodedString()_
+
+[#withNamespace__String]
+=== withNamespace(String)
+
+Returns a new instance that is a clone of this, except for the namespace, which is taken from the argument.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureRepository.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureRepository.adoc
index 6738e90..c053956 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureRepository.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureRepository.adoc
@@ -9,11 +9,11 @@ Provides the access to string representations of the packages, classes and class
 .ApplicationFeatureRepository.java
 ----
 interface ApplicationFeatureRepository {
-  SortedSet<String> packageNames()
-  SortedSet<String> packageNamesContainingClasses(ApplicationMemberType memberType)
-  SortedSet<String> classNamesContainedIn(String packageFqn, ApplicationMemberType memberType)
+  SortedSet<String> namespaceNames()
+  SortedSet<String> classNamesContainedIn(String packageFqn, ApplicationMemberSort memberSort)
   SortedSet<String> classNamesRecursivelyContainedIn(String packageFqn)
-  SortedSet<String> memberNamesOf(String packageFqn, String className, ApplicationMemberType memberType)
+  SortedSet<String> memberNamesOf(String packageFqn, String className, ApplicationMemberSort memberSort)
+  Map<String, ApplicationFeatureId> getFeatureIdentifiersByName()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureSort.adoc
similarity index 52%
copy from antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureSort.adoc
index bd15f24..b5a1fb4 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/domain/PropertyDomainEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationFeatureSort.adoc
@@ -1,28 +1,51 @@
-= PropertyDomainEvent
+= ApplicationFeatureSort _(enum)_
 :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 [...]
 
 == API
 
 [source,java]
-.PropertyDomainEvent.java
+.ApplicationFeatureSort.java
 ----
-class PropertyDomainEvent<S, T> {
-  PropertyDomainEvent()     // <.>
+enum ApplicationFeatureSort {
+  NAMESPACE     // <.>
+  TYPE     // <.>
+  MEMBER     // <.>
+  boolean isNamespace()
+  boolean isType()
+  boolean isMember()
   String toString()
 }
 ----
 
-<.> xref:#PropertyDomainEvent__[PropertyDomainEvent()]
+<.> xref:#NAMESPACE[NAMESPACE]
 +
 --
-If used then the framework will set state via (non-API) setters.
+logical namespace
+--
+<.> xref:#TYPE[TYPE]
++
+--
+_namespace + "." + typeSimpleName_ makes up the fully qualified logical type
+--
+<.> xref:#MEMBER[MEMBER]
++
+--
+_namespace + "." + typeSimpleName + "." + memberName_ makes up the fully qualified logical member
 --
 
 == Members
 
-[#PropertyDomainEvent__]
-=== PropertyDomainEvent()
+[#NAMESPACE]
+=== NAMESPACE
+
+logical namespace
+
+[#TYPE]
+=== TYPE
+
+_namespace + "." + typeSimpleName_ makes up the fully qualified logical type
 
-If used then the framework will set state via (non-API) setters.
+[#MEMBER]
+=== MEMBER
 
-Recommended because it reduces the amount of boilerplate in the domain object classes.
+_namespace + "." + typeSimpleName + "." + memberName_ makes up the fully qualified logical member
diff --git a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationMemberSort.adoc
similarity index 84%
copy from antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationMemberSort.adoc
index 7260199..a1a7033 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/events/lifecycle/ObjectLoadedEvent.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/appfeat/ApplicationMemberSort.adoc
@@ -1,14 +1,16 @@
-= ObjectLoadedEvent
+= ApplicationMemberSort _(enum)_
 :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 [...]
 
 == API
 
 [source,java]
-.ObjectLoadedEvent.java
+.ApplicationMemberSort.java
 ----
-class ObjectLoadedEvent<S> {
-  ObjectLoadedEvent()
-  ObjectLoadedEvent(final S source)
+enum ApplicationMemberSort {
+  PROPERTY
+  COLLECTION
+  ACTION
+  String toString()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/Bookmark.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/Bookmark.adoc
index 696a415..895548d 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/Bookmark.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/Bookmark.adoc
@@ -11,13 +11,14 @@ Analogous to the `RootOid` .
 .Bookmark.java
 ----
 class Bookmark {
-  Bookmark of(String objectType, String identifier)
+  Bookmark of(String logicalTypeName, String identifier)
   Optional<Bookmark> parse(String str)     // <.>
   OidDto toOidDto()
   Bookmark from(OidDto oidDto)
   String toString()     // <.>
   Bookmark withHintId(String hintId)
   String toStringUsingIdentifier(String id)
+  String getObjectType()     // <.>
 }
 ----
 
@@ -29,7 +30,12 @@ Round-trip with _#toString()_ representation.
 <.> xref:#toString__[toString()]
 +
 --
-The canonical form of the xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] , that is " _#getObjectType() objectType_ _#SEPARATOR_ _#getIdentifier()_ ".
+The canonical form of the xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] , that is " _#getLogicalTypeName() logical-type-name_ _#SEPARATOR_ _#getIdentifier()_ ".
+--
+<.> xref:#getObjectType__[getObjectType()]
++
+--
+Alias for _#getLogicalTypeName()_ .
 --
 
 == Members
@@ -42,6 +48,11 @@ Round-trip with _#toString()_ representation.
 [#toString__]
 === toString()
 
-The canonical form of the xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] , that is " _#getObjectType() objectType_ _#SEPARATOR_ _#getIdentifier()_ ".
+The canonical form of the xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] , that is " _#getLogicalTypeName() logical-type-name_ _#SEPARATOR_ _#getIdentifier()_ ".
 
 This is parseable by the _#parse(String)_ .
+
+[#getObjectType__]
+=== getObjectType()
+
+Alias for _#getLogicalTypeName()_ .
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationMenu.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationMenu.adoc
index edb8a9c..0c64b66 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationMenu.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationMenu.adoc
@@ -9,8 +9,8 @@ Simply provides a UI in order to access the configuration properties available f
 .ConfigurationMenu.java
 ----
 class ConfigurationMenu {
-  ConfigurationMenu(ConfigurationViewService configurationService)
-  Set<ConfigurationProperty> configuration()
+  ConfigurationMenu(FactoryService factoryService)
+  ConfigurationViewmodel configuration()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationViewService.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationViewService.adoc
index 81f495a..6205aa0 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationViewService.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/confview/ConfigurationViewService.adoc
@@ -11,11 +11,12 @@ This is the backing service used by xref:refguide:applib:index/services/confview
 .ConfigurationViewService.java
 ----
 interface ConfigurationViewService {
-  Set<ConfigurationProperty> allProperties()     // <.>
+  Set<ConfigurationProperty> getVisibleConfigurationProperties()     // <.>
+  Set<ConfigurationProperty> getEnvironmentProperties()
 }
 ----
 
-<.> xref:#allProperties__[allProperties()]
+<.> xref:#getVisibleConfigurationProperties__[getVisibleConfigurationProperties()]
 +
 --
 Returns all properties, each as an instance of xref:refguide:applib:index/services/confview/ConfigurationProperty.adoc[ConfigurationProperty] (a view model). Mask sensitive values if required.
@@ -23,8 +24,8 @@ Returns all properties, each as an instance of xref:refguide:applib:index/servic
 
 == Members
 
-[#allProperties__]
-=== allProperties()
+[#getVisibleConfigurationProperties__]
+=== getVisibleConfigurationProperties()
 
 Returns all properties, each as an instance of xref:refguide:applib:index/services/confview/ConfigurationProperty.adoc[ConfigurationProperty] (a view model). Mask sensitive values if required.
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/iactn/Interaction.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/Interaction.adoc
index 53791ed..3b992ad 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/iactn/Interaction.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/Interaction.adoc
@@ -15,18 +15,18 @@ To confuse matters slightly, historically the xref:refguide:applib:index/service
 .Interaction.java
 ----
 interface Interaction {
-  UUID getUniqueId()     // <.>
+  UUID getInteractionId()     // <.>
   Command getCommand()     // <.>
   Execution<?, ?> getCurrentExecution()     // <.>
   Execution<?, ?> getPriorExecution()     // <.>
-  int next(final String sequenceId)     // <.>
+  int next(final SequenceType sequenceType)     // <.>
 }
 ----
 
-<.> xref:#getUniqueId__[getUniqueId()]
+<.> xref:#getInteractionId__[getInteractionId()]
 +
 --
-The unique identifier of this interaction (inherited from xref:refguide:commons:index/having/HasUniqueId.adoc[HasUniqueId] )
+The unique identifier of this interaction (inherited from xref:refguide:applib:index/mixins/system/HasInteractionId.adoc[HasInteractionId] )
 --
 <.> xref:#getCommand__[getCommand()]
 +
@@ -43,18 +43,18 @@ The current (most recently pushed) xref:refguide:applib:index/services/iactn/Exe
 --
 The execution that preceded the current one.
 --
-<.> xref:#next__String[next(String)]
+<.> xref:#next__SequenceType[next(SequenceType)]
 +
 --
-Generates numbers in a named sequence. The name of the sequence can be arbitrary, though note that the framework also uses this capability to generate sequence numbers corresponding to the sequences enumerated by the xref:refguide:applib:index/services/iactn/Sequence.adoc[Sequence] enum.
+Framework use only: generates numbers for a named sequence type.
 --
 
 == Members
 
-[#getUniqueId__]
-=== getUniqueId()
+[#getInteractionId__]
+=== getInteractionId()
 
-The unique identifier of this interaction (inherited from xref:refguide:commons:index/having/HasUniqueId.adoc[HasUniqueId] )
+The unique identifier of this interaction (inherited from xref:refguide:applib:index/mixins/system/HasInteractionId.adoc[HasInteractionId] )
 
 This can be used to correlate audit records and transactions happening as a consequence or within the interaction.
 
@@ -73,10 +73,10 @@ The current (most recently pushed) xref:refguide:applib:index/services/iactn/Exe
 
 The execution that preceded the current one.
 
-[#next__String]
-=== next(String)
+[#next__SequenceType]
+=== next(SequenceType)
 
-Generates numbers in a named sequence. The name of the sequence can be arbitrary, though note that the framework also uses this capability to generate sequence numbers corresponding to the sequences enumerated by the xref:refguide:applib:index/services/iactn/Sequence.adoc[Sequence] enum.
+Framework use only: generates numbers for a named sequence type.
 
 include::hooks/Interaction_010-implementation.adoc[]
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/iactn/SequenceType.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/SequenceType.adoc
new file mode 100644
index 0000000..f284970
--- /dev/null
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/SequenceType.adoc
@@ -0,0 +1,45 @@
+= SequenceType _(enum)_
+: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 [...]
+
+Enumerates the different reasons for a sequence of occurrences within a single (top-level) xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] .
+
+== API
+
+[source,java]
+.SequenceType.java
+----
+enum SequenceType {
+  EXECUTION     // <.>
+  TRANSACTION     // <.>
+  String id()
+}
+----
+
+<.> xref:#EXECUTION[EXECUTION]
++
+--
+Numbers the executions (an action invocation or property edit) within a given xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] .
+--
+<.> xref:#TRANSACTION[TRANSACTION]
++
+--
+Numbers the transactions within a given xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] .
+--
+
+== Members
+
+[#EXECUTION]
+=== EXECUTION
+
+Numbers the executions (an action invocation or property edit) within a given xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] .
+
+Each xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] is initiated by an execution of action invocation or a property edit. Thereafter there could be multiple other executions as the result of nested calls using the xref:refguide:applib:index/services/wrapper/WrapperFactory.adoc[WrapperFactory] .
+
+Another possible reason is support for bulk action invocations.
+
+[#TRANSACTION]
+=== TRANSACTION
+
+Numbers the transactions within a given xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] .
+
+Each xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] is executed within the context of a transaction, but the (occasionally) the transaction may be committed and a new one started as the result of the domain object using the _org.apache.isis.applib.services.xactn.TransactionService_ .
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/publishing/spi/EntityChanges.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/publishing/spi/EntityChanges.adoc
index dc713f1..90ec59b 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/publishing/spi/EntityChanges.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/publishing/spi/EntityChanges.adoc
@@ -11,7 +11,7 @@ The numbers of objects loaded, created, updated or deleted and the number of obj
 .EntityChanges.java
 ----
 interface EntityChanges {
-  UUID getUniqueId()     // <.>
+  UUID getInteractionId()     // <.>
   String getUsername()     // <.>
   Timestamp getCompletedAt()     // <.>
   int getNumberLoaded()     // <.>
@@ -23,15 +23,15 @@ interface EntityChanges {
 }
 ----
 
-<.> xref:#getUniqueId__[getUniqueId()]
+<.> xref:#getInteractionId__[getInteractionId()]
 +
 --
-inherited from xref:refguide:commons:index/having/HasUniqueId.adoc[HasUniqueId] , correlates back to the unique identifier of the transaction in which these objects were changed.
+inherited from xref:refguide:applib:index/mixins/system/HasInteractionId.adoc[HasInteractionId] , correlates back to the unique identifier of the transaction in which these objects were changed.
 --
 <.> xref:#getUsername__[getUsername()]
 +
 --
-Inherited from xref:refguide:commons:index/having/HasUsername.adoc[HasUsername] , is the user that initiated the transaction causing these objects to change.
+Inherited from xref:refguide:applib:index/mixins/security/HasUsername.adoc[HasUsername] , is the user that initiated the transaction causing these objects to change.
 --
 <.> xref:#getCompletedAt__[getCompletedAt()]
 +
@@ -71,15 +71,15 @@ Same details, but as an an instance of _ChangesDto_ .
 
 == Members
 
-[#getUniqueId__]
-=== getUniqueId()
+[#getInteractionId__]
+=== getInteractionId()
 
-inherited from xref:refguide:commons:index/having/HasUniqueId.adoc[HasUniqueId] , correlates back to the unique identifier of the transaction in which these objects were changed.
+inherited from xref:refguide:applib:index/mixins/system/HasInteractionId.adoc[HasInteractionId] , correlates back to the unique identifier of the transaction in which these objects were changed.
 
 [#getUsername__]
 === getUsername()
 
-Inherited from xref:refguide:commons:index/having/HasUsername.adoc[HasUsername] , is the user that initiated the transaction causing these objects to change.
+Inherited from xref:refguide:applib:index/mixins/security/HasUsername.adoc[HasUsername] , is the user that initiated the transaction causing these objects to change.
 
 [#getCompletedAt__]
 === getCompletedAt()
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/xactn/TransactionId.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/xactn/TransactionId.adoc
index 63565aa..2ac7ce8 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/xactn/TransactionId.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/xactn/TransactionId.adoc
@@ -3,7 +3,7 @@
 
 Value type used to identify a transaction within the context of an outer _org.apache.isis.applib.services.iactn.Interaction_ .
 
-The transaction and _org.apache.isis.applib.services.iactn.Interaction_ are associated by the _#getUniqueId() uniqueId_ .
+The transaction and _org.apache.isis.applib.services.iactn.Interaction_ are associated by the _#getInteractionId() uniqueId_ .
 
 Obtainable from _TransactionService#currentTransactionId()_ .
 
@@ -13,14 +13,14 @@ Obtainable from _TransactionService#currentTransactionId()_ .
 .TransactionId.java
 ----
 class TransactionId {
-  UUID uniqueId;     // <.>
+  UUID interactionId;     // <.>
   int sequence;     // <.>
   String context;     // <.>
   TransactionId empty()     // <.>
 }
 ----
 
-<.> xref:#uniqueId[uniqueId]
+<.> xref:#interactionId[interactionId]
 +
 --
 The unique identifier of the outer _org.apache.isis.applib.services.iactn.Interaction_ .
@@ -43,16 +43,20 @@ Factory method that returns a nominally "empty" transaction identifier, used as
 
 == Members
 
-[#uniqueId]
-=== uniqueId
+[#interactionId]
+=== interactionId
 
 The unique identifier of the outer _org.apache.isis.applib.services.iactn.Interaction_ .
 
+Together with _#getSequence()_ , this makes up the implementation of xref:refguide:applib:index/mixins/system/HasTransactionId.adoc[HasTransactionId]
+
 [#sequence]
 === sequence
 
 Identifies the transaction (there could be multiple) within the _org.apache.isis.applib.services.iactn.Interaction_ .
 
+Together with _#getInteractionId()_ , this makes up the implementation of xref:refguide:applib:index/mixins/system/HasTransactionId.adoc[HasTransactionId]
+
 [#context]
 === context
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc
index 72c8238..6ca9e82 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc
@@ -1,7 +1,7 @@
 = HasUniqueId_command
 :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 mixin contributes a `command` action to any (non-command) implementation of xref:refguide:commons:index/having/HasUniqueId.adoc[HasUniqueId] ; that is: audit entries, and published events. Thus, it is possible to navigate from the effect back to the cause.
+This mixin contributes a `command` action to any (non-command) implementation of xref:refguide:applib:index/mixins/system/HasInteractionId.adoc[HasInteractionId] ; that is: audit entries, and published events. Thus, it is possible to navigate from the effect back to the cause.
 
 == API
 
@@ -11,7 +11,7 @@ This mixin contributes a `command` action to any (non-command) implementation of
 class HasUniqueId_command {
   @Inject
 CommandJdoRepository commandServiceRepository;
-  HasUniqueId_command(final HasUniqueId hasInteractionId)
+  HasUniqueId_command(final HasInteractionId hasInteractionId)
   CommandJdo act()
   boolean hideAct()     // <.>
   String disableAct()
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/api/permission/ApplicationPermission.adoc b/antora/components/refguide-index/modules/extensions/pages/index/secman/api/permission/ApplicationPermission.adoc
index 784440e..4701ea9 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/api/permission/ApplicationPermission.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/secman/api/permission/ApplicationPermission.adoc
@@ -17,14 +17,14 @@ For a given permission, there is an interaction between the xref:refguide:extens
 ----
 interface ApplicationPermission {
   String title()     // <.>
-  ApplicationFeatureType getFeatureType()
+  ApplicationFeatureSort getFeatureSort()
   ApplicationRole getRole()
   void setRole(ApplicationRole applicationRole)
   ApplicationPermissionRule getRule()
   void setRule(ApplicationPermissionRule rule)
   ApplicationPermissionMode getMode()
   void setMode(ApplicationPermissionMode changing)
-  String getType()
+  String getSort()
   String getFeatureFqn()
   void setFeatureFqn(String featureFqn)
   Optional<ApplicationFeatureId> createFeatureId()
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/api/permission/ApplicationPermissionRepository.adoc b/antora/components/refguide-index/modules/extensions/pages/index/secman/api/permission/ApplicationPermissionRepository.adoc
index 51971f9..b61a3d9 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/api/permission/ApplicationPermissionRepository.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/secman/api/permission/ApplicationPermissionRepository.adoc
@@ -8,14 +8,15 @@
 ----
 interface ApplicationPermissionRepository<P> {
   Optional<P> findByUserAndPermissionValue(String username, ApplicationPermissionValue changingPermissionValue)
-  Optional<P> findByRoleAndRuleAndFeature(ApplicationRole holder, ApplicationPermissionRule rule, ApplicationFeatureType type, String featureFqn)
+  Optional<P> findByRoleAndRuleAndFeature(ApplicationRole holder, ApplicationPermissionRule rule, ApplicationFeatureSort type, String featureFqn)
   Collection<P> allPermissions()
   Collection<P> findOrphaned()
   Collection<P> findByFeatureCached(ApplicationFeatureId featureId)
-  Collection<P> findByRoleAndRuleAndFeatureTypeCached(ApplicationRole holder, ApplicationPermissionRule rule, ApplicationFeatureType type)
+  Collection<P> findByRoleAndRuleAndFeatureTypeCached(ApplicationRole holder, ApplicationPermissionRule rule, ApplicationFeatureSort type)
   P newApplicationPermission()     // <.>
   P newPermission(ApplicationRole role, ApplicationPermissionRule rule, ApplicationPermissionMode mode, String packageFqn, String className, String memberName)
-  P newPermission(ApplicationRole holder, ApplicationPermissionRule rule, ApplicationPermissionMode mode, ApplicationFeatureType featureType, String featureFqn)
+  P newPermission(ApplicationRole role, ApplicationPermissionRule rule, ApplicationPermissionMode mode, ApplicationFeatureSort featureSort, String featureFqn)
+  P newPermission(ApplicationRole role, ApplicationPermissionRule rule, ApplicationPermissionMode mode, ApplicationFeatureId featureId)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.adoc
index 4bfd757..9466833 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.adoc
@@ -1,6 +1,10 @@
 = Persistable_datanucleusIdLong
 :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 [...]
 
+Contributes the value of the id (introduced by enhancing) as a property.
+
+Only visible if the id can be cast to a long.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.adoc
index 43edf2d..d3f15ea 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.adoc
@@ -1,6 +1,10 @@
 = Persistable_datanucleusVersionLong
 :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 [...]
 
+Contributes the value of the version (introduced by enhancing, and used by the ORM for optimistic locking) as a property.
+
+Only visible if the version can be cast to a long.
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.adoc
index 84e23aa..29d99fb 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.adoc
@@ -1,6 +1,10 @@
 = Persistable_datanucleusVersionTimestamp
 :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 [...]
 
+Contributes the value of the version (introduced by enhancing, and used by the ORM for optimistic locking) as a property.
+
+Only visible if the version can be cast to a _java.sql.Timestamp_ .
+
 == API
 
 [source,java]
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.adoc
index 24ea6a0..2a41571 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.adoc
@@ -1,6 +1,8 @@
 = Persistable_downloadJdoMetadata
 :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 [...]
 
+Provides the ability to download the JDOclass metadataas XML.
+
 == API
 
 [source,java]


[isis] 08/11: ISIS-2564: rationalizing mixee interfaces

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

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

commit b2917f0b422736f81701fde506c10fc1fb539775
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Mar 4 07:22:25 2021 +0000

    ISIS-2564: rationalizing mixee interfaces
---
 .../index/mixins/dto/hooks/Dto_see-also.adoc}      |  26 +--
 .../hooks/Object_downloadLayoutXml_see-also.adoc}  |  12 +-
 .../layout/hooks/Object_openRestApi_see-also.adoc} |  16 +-
 .../hooks/Object_rebuildMetamodel_see-also.adoc}   |  11 +-
 .../system/hooks/HasInteractionId_see-also.adoc}   |  13 +-
 .../updates/hooks/WithUpdatedAt_usage-notes.adoc}  |  35 ++--
 .../hooks/WithUpdatedByAndAt_usage-notes.adoc}     |  10 +-
 .../updates/hooks/WithUpdatedBy_usage-notes.adoc}  |  13 +-
 .../hooks/GridService_020-examples-and-usage.adoc  |   2 +-
 .../hooks/Execution_020-examples-and-usage.adoc    |   2 +-
 .../hooks/JaxbService_020-examples-and-usage.adoc  |   6 +-
 .../LayoutService_020-examples-and-usage.adoc      |   2 +-
 .../impl/mixins/HasUniqueId_command.adoc           |   2 +-
 .../applib-classes/pages/layout/menubars.adoc      |   3 -
 .../applib-classes/pages/mixees-and-mixins.adoc    |  96 +++++++++++
 .../roles-mixins-contributees/contributee.adoc     |  38 +----
 .../pages/roles-mixins-contributees/mixins.adoc    |  58 ++++++-
 .../roles-mixins-contributees/mixins/Dto.adoc      |  66 -------
 .../roles-mixins-contributees/mixins/Object.adoc   | 115 -------------
 .../mixins/Persistable.adoc                        |  59 -------
 .../roles/HoldsUpdatedAt.adoc                      |  46 -----
 .../roles/HoldsUpdatedBy.adoc                      |  21 ---
 .../applib-classes/partials/module-nav.adoc        |   3 +-
 .../modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc |   2 +-
 .../pages/overview/types-of-domain-objects.adoc    |   2 +-
 .../modules/fun/pages/ui/object-layout.adoc        |   4 +-
 .../modules/fun/pages/view-models/UNUSED-dto.adoc  | 190 ---------------------
 .../org/apache/isis/applib/mixins/dto/Dto.java     |  22 +++
 .../DtoMixinConstants.java}                        |   7 +-
 .../isis/applib/mixins/dto/Dto_downloadXml.java    |  18 +-
 .../isis/applib/mixins/dto/Dto_downloadXsd.java    |  35 ++--
 .../applib/mixins/layout/LayoutMixinConstants.java |  16 +-
 .../mixins/layout/Object_downloadLayoutXml.java    |  10 +-
 .../applib/mixins/layout/Object_openRestApi.java   |   6 +-
 .../mixins/layout/Object_rebuildMetamodel.java     |   7 +-
 .../metamodel/Object_downloadMetamodelXml.java     |   9 +-
 .../mixins/metamodel/Object_objectIdentifier.java  |   4 +-
 .../applib/mixins/metamodel/Object_objectType.java |   4 +-
 .../isis/applib/mixins/security}/HasUsername.java  |  22 ++-
 .../system}/DomainChangeRecord.java                |  24 ++-
 .../DomainChangeRecord_openTargetObject.java       |  10 +-
 .../applib/mixins/system/HasInteractionId.java     |  12 +-
 .../applib/mixins/system/HasTransactionId.java     |  60 +++++++
 .../isis/applib/mixins/updates/OnUpdatedAt.java    |   8 +-
 .../isis/applib/mixins/updates/OnUpdatedBy.java    |  17 +-
 .../applib/mixins/updates/OnUpdatedByAndAt.java    |  15 +-
 .../RepresentsInteractionMemberExecution.java      |  42 -----
 .../isis/applib/services/command/Command.java      |  12 +-
 .../isis/applib/services/iactn/Interaction.java    |  23 +--
 .../isis/applib/services/iactn/Sequence.java       |  36 ----
 .../isis/applib/services/iactn/SequenceType.java   |  53 ++++++
 .../services/publishing/spi/EntityChanges.java     |  10 +-
 .../isis/applib/services/xactn/TransactionId.java  |  19 ++-
 .../applib/util/schema/InteractionDtoUtils.java    |   2 +-
 .../isis/commons/having/HasUpdatedByAndAt.java     |  25 ---
 .../interaction/session/InteractionSession.java    |  40 ++---
 .../core/interaction/session/IsisInteraction.java  |  14 +-
 .../action/ActionAnnotationFacetFactory.java       |  32 ++--
 .../DomainObjectAnnotationFacetFactory.java        |   8 +-
 .../property/PropertyAnnotationFacetFactory.java   |  10 +-
 .../metamodel/inspect/Object_inspectMetamodel.java |   4 +-
 .../grid/bootstrap3/GridSystemServiceBS3.java      |  64 +++----
 .../specloader/specimpl/ObjectMemberAbstract.java  |  12 +-
 .../action/ActionAnnotationFacetFactoryTest.java   |  12 +-
 ...notationFacetFactoryTest_commandPublishing.java |   8 +-
 ...tationFacetFactoryTest_executionPublishing.java |   8 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |  20 +--
 .../interaction/InteractionDtoFactoryDefault.java  |   6 +-
 .../wrapper/WrapperFactoryDefault.java             |  94 +++++-----
 .../changetracking/ChangingEntitiesFactory.java    |   6 +-
 .../EntityPropertyChangeFactory.java               |   8 +-
 .../changetracking/SimpleChangingEntities.java     |  10 +-
 .../changetracking/events/TimestampService.java    |  20 +--
 .../commandlog/impl/CommandSubscriberForJdo.java   |   4 +-
 .../extensions/commandlog/impl/jdo/CommandJdo.java |  18 +-
 .../impl/mixins/HasUniqueId_command.java           |  14 +-
 .../mixins/HasUsername_recentCommandsByUser.java   |   2 +-
 .../impl/mixins/Object_recentCommands.java         |   8 +-
 .../secondary/fetch/CommandFetcher.java            |   2 +-
 .../jobcallables/ReplicateAndRunCommands.java      |   4 +-
 .../adoc/modules/audit-trail/pages/about.adoc      |   2 +-
 .../secman/api/user/ApplicationUser.java           |   2 +-
 .../secman/model/dom/user/HasUsername_open.java    |  10 +-
 .../mixins/Persistable_datanucleusIdLong.java      |  13 +-
 .../mixins/Persistable_datanucleusVersionLong.java |  14 +-
 .../Persistable_datanucleusVersionTimestamp.java   |  14 +-
 .../mixins/Persistable_downloadJdoMetadata.java    |   8 +-
 .../testdomain/conf/Configuration_headless.java    |  28 +--
 .../testdomain/jdo/entities/JdoProductComment.java |  12 +-
 .../testdomain/jpa/entities/JpaProductComment.java |  14 +-
 .../wicket/viewer/mixins/Object_clearHints.java    |  25 +++
 91 files changed, 862 insertions(+), 1089 deletions(-)

diff --git a/antora/components/userguide/modules/fun/pages/view-models/UNUSED-dto.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/hooks/Dto_see-also.adoc
similarity index 90%
copy from antora/components/userguide/modules/fun/pages/view-models/UNUSED-dto.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/dto/hooks/Dto_see-also.adoc
index 0e7843c..68ae699 100644
--- a/antora/components/userguide/modules/fun/pages/view-models/UNUSED-dto.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/dto/hooks/Dto_see-also.adoc
@@ -1,15 +1,12 @@
-= DTOs
-
 :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 [...]
 :page-partial:
 
 
-WARNING: TODO: v2: move this to "beyond the basics"
 
-JAXB view models can also be used as DTOs.
-The examples in this section uses the DTO for `ToDoItem`.
+== Example
 
-This DTO is defined as follows:
+The examples in this section uses the DTO for a `ToDoItem` entity.
+The DTO is defined as follows:
 
 [source,java]
 ----
@@ -62,7 +59,7 @@ public class ToDoItemV1_1 implements Dto {                          // <.>
 
 
 [#versioning]
-== Versioning
+=== Versioning
 
 The whole point of using DTOs (in Apache Isis, at least) is to define a formal contact between two inter-operating but independent applications.
 Since the only thing we can predict about the future with any certainty is that one or both of these applications will change, we should version DTOs from the get-go.
@@ -183,8 +180,15 @@ This is an example of the link:https://leanpub.com/camel-design-patterns[VETRO p
 In our case we focus on the validation (to determine the nature of the inbound message, ie which action was invoked), and the enrich (callback to obtain a DTO with additional information required by the consumer).
 ====
 
-The (non-ASF) link:https://platform.incode.org[Incode Platform^]'s publishmq module provides an out-of-the-box solution of this design.
-It provides an implementation of the xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber], but which simply publishes instances of xref:refguide:schema:ixn.adoc[InteractionDto] to an ActiveMQ queue.
-Camel (or similar) can then be hooked up to consume these events from this queue, and use a processor to parse the action memento to determine what has changed on the source system.
-Thereafter, a subsequent Camel processor can then call back to the source - via the xref:vro:ROOT:about.adoc[Restful Objects viewer] - to enrich the message with additional details using a DTO.
+//The (non-ASF) link:https://platform.incode.org[Incode Platform^]'s publishmq module provides an out-of-the-box solution of this design.
+//It provides an implementation of the xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber], but which simply publishes instances of xref:refguide:schema:ixn.adoc[InteractionDto] to an ActiveMQ queue.
+//Camel (or similar) can then be hooked up to consume these events from this queue, and use a processor to parse the action memento to determine what has changed on the source system.
+//Thereafter, a subsequent Camel processor can then call back to the source - via the xref:vro:ROOT:about.adoc[Restful Objects viewer] - to enrich the message with additional details using a DTO.
+
+
+
+== See also
+
+* xref:refguide:applib:index/mixins/dto/Dto_downloadXml.adoc[Dto_downloadXml]
+* xref:refguide:applib:index/mixins/dto/Dto_downloadXsd.adoc[Dto_downloadXsd]
 
diff --git a/antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString_usage-notes.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/hooks/Object_downloadLayoutXml_see-also.adoc
similarity index 78%
copy from antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString_usage-notes.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/layout/hooks/Object_downloadLayoutXml_see-also.adoc
index 1f96710..f22c1a9 100644
--- a/antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString_usage-notes.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/hooks/Object_downloadLayoutXml_see-also.adoc
@@ -1,17 +1,11 @@
-[[TranslatableString]]
-= `TranslatableString`
-
 :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 [...]
 :page-partial:
 
-WARNING: TODO: this content has not yet been updated for v2.0
-
-The `TranslatableString` utility class ...
-
-//
-See also xref:userguide:btb:i18n.adoc[user guide, i18n].
 
 
+== See also
 
+* the structure of the xref:userguide:fun:ui.adoc#object-layout[layout XML] is described in the user guide.
 
+* xref:refguide:applib:index/services/layout/LayoutService.adoc[LayoutService]
 
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/hooks/Object_openRestApi_see-also.adoc
similarity index 74%
rename from antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees.adoc
rename to antora/components/refguide-index/modules/applib/pages/index/mixins/layout/hooks/Object_openRestApi_see-also.adoc
index 332c235..376a280 100644
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/hooks/Object_openRestApi_see-also.adoc
@@ -1,9 +1,13 @@
-[#roles-mixins-and-contributees]
-= Roles, Mixins and Contributees
-
 :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 [...]
+:page-partial:
+
+
+
+== See also
+
+* xref:vro:ROOT:about.adoc[Restful Objects] viewer
 
+* xref:refguide:applib:index/services/bookmark/BookmarkService.adoc[BookmarkService]
++
+is used by the mixin to build the URL
 
-include::roles-mixins-contributees/roles.adoc[leveloffset=+1]
-include::roles-mixins-contributees/mixins.adoc[leveloffset=+1]
-include::roles-mixins-contributees/contributee.adoc[leveloffset=+1]
diff --git a/antora/components/refguide/modules/applib-classes/pages/i18n.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/hooks/Object_rebuildMetamodel_see-also.adoc
similarity index 78%
copy from antora/components/refguide/modules/applib-classes/pages/i18n.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/mixins/layout/hooks/Object_rebuildMetamodel_see-also.adoc
index f5cacea..c23e487 100644
--- a/antora/components/refguide/modules/applib-classes/pages/i18n.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/hooks/Object_rebuildMetamodel_see-also.adoc
@@ -1,11 +1,12 @@
-[#i18n-support]
-= i18n support
-
 :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 [...]
 :page-partial:
 
 
-The `org.apache.isis.applib.services.i18n` package contains a single class to support i18n.
 
+== See also
+
+* xref:refguide:applib:index/services/metamodel/MetaModelService.adoc[MetaModelService]
 
-include::i18n/TranslatableString.adoc[leveloffset=+1]
+* xref:refguide:applib:index/services/grid/GridService.adoc[GridService]
++
+called to invalidate its caches.
diff --git a/antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString_usage-notes.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/hooks/HasInteractionId_see-also.adoc
similarity index 69%
rename from antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString_usage-notes.adoc
rename to antora/components/refguide-index/modules/applib/pages/index/mixins/system/hooks/HasInteractionId_see-also.adoc
index 1f96710..556e8f9 100644
--- a/antora/components/refguide/modules/applib-classes/pages/i18n/TranslatableString_usage-notes.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/hooks/HasInteractionId_see-also.adoc
@@ -1,17 +1,14 @@
-[[TranslatableString]]
-= `TranslatableString`
-
 :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 [...]
 :page-partial:
 
-WARNING: TODO: this content has not yet been updated for v2.0
-
-The `TranslatableString` utility class ...
 
-//
-See also xref:userguide:btb:i18n.adoc[user guide, i18n].
 
+== See also
 
+Some of the extension/mapping modules that have entities that implement this mixee are:
 
+* xref:security:audit-trail:about.adoc[Auditer] module: `AuditEntry` entity
+* xref:extensions:command-log:about.adoc[Command Log] module: `CommandJdo` entity
+* xref:mappings:outbox-publisher:about.adoc[Outbox Publisher] module: `OutboxEvent` entity
 
 
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles/Timestampable.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/hooks/WithUpdatedAt_usage-notes.adoc
similarity index 63%
rename from antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles/Timestampable.adoc
rename to antora/components/refguide-index/modules/applib/pages/index/mixins/updates/hooks/WithUpdatedAt_usage-notes.adoc
index 1c79488..bb8b139 100644
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles/Timestampable.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/hooks/WithUpdatedAt_usage-notes.adoc
@@ -1,28 +1,37 @@
-[[Timestampable]]
-= `Timestampable`
-
 :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 [...]
 :page-partial:
 
 
-The `Timestampable` role interface is a convenience that combines the xref:applib-classes:about.adoc#HoldsUpdatedAt[HoldsUpdatedAt] and xref:applib-classes:about.adoc#HoldsUpdatedBy[HoldsUpdatedBy] interfaces.
-It is defined as:
 
-// TODO: v2: use include::[]
+
+
+== Alternative approaches
+
+An alternative way to maintain a timestamp is to use JDO's `@Version` annotation.
+With this approach, it is the JDO/DataNucleus that maintains the version, rather than the framework's `TimestampService`.
+
+For example:
 
 [source,java]
 ----
-public interface Timestampable
-    extends HoldsUpdatedAt, HoldsUpdatedBy {
+@javax.jdo.annotations.Version(
+        strategy=VersionStrategy.DATE_TIME,
+        column="version")
+public class Customer {
+    ...
+    public java.sql.Timestamp getVersionSequence() {
+        return (java.sql.Timestamp) JDOHelper.getVersion(this);
+    }
 }
 ----
 
-The interface no additional methods of its own.
+== See also
 
+* xref:refguide:applib:index/services/clock/ClockService.adoc[ClockService]
++
+used to obtain the current time.
 
+* xref:refguide:applib:index/mixins/updates/OnUpdatedBy.adoc[OnUpdatedBy]
 
-== Alternatives
+* xref:refguide:applib:index/mixins/updates/OnUpdatedByAndAt.adoc[OnUpdatedByAndAt]
 
-An alternative way to maintain a timestamp is to use JDO's `@Version` annotation.
-With this approach, it is the JDO/DataNucleus that maintains the version, rather than the framework's `TimestampService`.
-See xref:applib-classes:about.adoc#HoldsUpdatedBy[HoldsUpdatedBy] for further details.
diff --git a/antora/components/refguide/modules/applib-classes/pages/i18n.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/hooks/WithUpdatedByAndAt_usage-notes.adoc
similarity index 81%
rename from antora/components/refguide/modules/applib-classes/pages/i18n.adoc
rename to antora/components/refguide-index/modules/applib/pages/index/mixins/updates/hooks/WithUpdatedByAndAt_usage-notes.adoc
index f5cacea..adec954 100644
--- a/antora/components/refguide/modules/applib-classes/pages/i18n.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/hooks/WithUpdatedByAndAt_usage-notes.adoc
@@ -1,11 +1,11 @@
-[#i18n-support]
-= i18n support
-
 :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 [...]
 :page-partial:
 
 
-The `org.apache.isis.applib.services.i18n` package contains a single class to support i18n.
 
+== See also
+
+* xref:refguide:applib:index/mixins/updates/OnUpdatedAt.adoc[OnUpdatedAt]
+
+* xref:refguide:applib:index/mixins/updates/OnUpdatedBy.adoc[OnUpdatedBy]
 
-include::i18n/TranslatableString.adoc[leveloffset=+1]
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/hooks/WithUpdatedBy_usage-notes.adoc
similarity index 70%
rename from antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles.adoc
rename to antora/components/refguide-index/modules/applib/pages/index/mixins/updates/hooks/WithUpdatedBy_usage-notes.adoc
index d2e1ad8..1f7706f 100644
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/updates/hooks/WithUpdatedBy_usage-notes.adoc
@@ -1,14 +1,15 @@
-= Roles
-
 :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 [...]
 :page-partial:
 
 
-The interfaces listed in this chapter are role interfaces; they define a contract for the framework to interact with those domain objects that implement these interfaces.
 
+== See also
+
+* xref:refguide:applib:index/services/user/UserService.adoc[UserService]
++
+used to obtain the current user.
 
+* xref:refguide:applib:index/mixins/updates/OnUpdatedAt.adoc[OnUpdatedAt]
 
+* xref:refguide:applib:index/mixins/updates/OnUpdatedByAndAt.adoc[OnUpdatedByAndAt]
 
-include::roles/HoldsUpdatedAt.adoc[leveloffset=+1]
-include::roles/HoldsUpdatedBy.adoc[leveloffset=+1]
-include::roles/Timestampable.adoc[leveloffset=+1]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/grid/hooks/GridService_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/grid/hooks/GridService_020-examples-and-usage.adoc
index efd6a29..fe3260e 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/grid/hooks/GridService_020-examples-and-usage.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/grid/hooks/GridService_020-examples-and-usage.adoc
@@ -12,7 +12,7 @@ Dynamic reloading is disabled in production mode.
 
 == See also
 
-This service is called by xref:refguide:applib:index/services/layout/LayoutService.adoc[LayoutService], exposed in the UI through `LayoutServiceMenu` (to download the layout XML as a zip file for all domain objects) and the xref:applib-classes:roles-mixins-contributees/mixins.adoc#Object[downloadLayoutXml()] mixin (to download the layout XML for a single domain
+This service is called by xref:refguide:applib:index/services/layout/LayoutService.adoc[LayoutService], exposed in the UI through `LayoutServiceMenu` (to download the layout XML as a zip file for all domain objects) and the xref:applib-classes:mixins.adoc#java-lang-object[downloadLayoutXml()] mixin (to download the layout XML for a single domain
 object).
 
 This service delegates to:
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/iactn/hooks/Execution_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/hooks/Execution_020-examples-and-usage.adoc
index 17af303..69233b7 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/iactn/hooks/Execution_020-examples-and-usage.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/hooks/Execution_020-examples-and-usage.adoc
@@ -12,7 +12,7 @@ This supports several use cases:
 
 ** they enable profiling of the running application (which actions are invoked then most often, what is their response time)
 
-** if auditing is configured (using xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber]), they provide better audit information, since the parent xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] captures the 'cause' of an interaction and can be correlated to the audit records (the "effect" of the interaction) by way of the xref:applib-classes:roles-mixins-contributees/contributee.adoc#HasUniqueId[un [...]
+** if auditing is configured (using xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber]), they provide better audit information, since the parent xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] captures the 'cause' of an interaction and can be correlated to the audit records (the "effect" of the interaction) by way of the xref:applib-classes:mixins.adoc[uniqueId] that both share.
 
 
 == See also
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/jaxb/hooks/JaxbService_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/jaxb/hooks/JaxbService_020-examples-and-usage.adoc
index 7011001..d4bc8df 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/jaxb/hooks/JaxbService_020-examples-and-usage.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/jaxb/hooks/JaxbService_020-examples-and-usage.adoc
@@ -9,9 +9,5 @@
 This service is provided as a convenience for applications, but is also used internally by the framework to marshall xref:refguide:applib-ant:XmlRootElement.adoc[@XmlRootElement]-annotated
 xref:userguide:fun:overview.adoc#view-models[view models].
 
-The functionality to download XML and XSD schemas is also exposed in the UI through mixins of the xref:applib-classes:roles-mixins-contributees/mixins.adoc#Dto[Dto] interface.
+The functionality to download XML and XSD schemas is also exposed in the UI through mixins of the xref:applib-classes:mixins.adoc#Dto[Dto] interface.
 
-
-== See also
-
-* xref:refguide:applib:index/services/jaxb/IsisSchemas.adoc[IsisSchemas]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/layout/hooks/LayoutService_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/layout/hooks/LayoutService_020-examples-and-usage.adoc
index 2019b24..b6638cc 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/layout/hooks/LayoutService_020-examples-and-usage.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/layout/hooks/LayoutService_020-examples-and-usage.adoc
@@ -7,7 +7,7 @@
 
 The service's functionality is exposed in the UI through a mixin (per object) and a menu action (for all objects):
 
-* the xref:applib-classes:roles-mixins-contributees/mixins.adoc#Object[`Object` mixin] provides the ability to download the XML layout for any domain object (entity or view model).
+* the xref:applib-classes:mixins.adoc#java-lang-object[Object] mixin provides the ability to download the XML layout for any domain object (entity or view model).
 
 * the `LayoutServiceMenu` provides the ability to download all XML layouts as a single ZIP file (in any of the three styles).
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc
index 47f0171..72c8238 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/impl/mixins/HasUniqueId_command.adoc
@@ -11,7 +11,7 @@ This mixin contributes a `command` action to any (non-command) implementation of
 class HasUniqueId_command {
   @Inject
 CommandJdoRepository commandServiceRepository;
-  HasUniqueId_command(final HasUniqueId hasUniqueId)
+  HasUniqueId_command(final HasUniqueId hasInteractionId)
   CommandJdo act()
   boolean hideAct()     // <.>
   String disableAct()
diff --git a/antora/components/refguide/modules/applib-classes/pages/layout/menubars.adoc b/antora/components/refguide/modules/applib-classes/pages/layout/menubars.adoc
index e08b493..f33c04a 100644
--- a/antora/components/refguide/modules/applib-classes/pages/layout/menubars.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/layout/menubars.adoc
@@ -49,7 +49,6 @@ The xref:vw:ROOT:about.adoc[Wicket viewer] renders a separator between each sect
 +
 consisting of one or many actions (``ServiceActionLayoutData``s)
 
-
 == Components
 
 The service action class reside in the `org.apache.isis.applib.layout.component` package, consisting of just:
@@ -62,8 +61,6 @@ which correspond to the xref:refguide:applib:index/annotation/ActionLayout.adoc[
 This is similar to `ActionLayoutData` (of the xref:applib-classes:layout.adoc[object layout] classes), however it also identifies the domain service to which it belongs.
 (This isn't required for the object layouts because the owner in that case is implicit).
 
-
-
 == Link
 
 The link classes reside in the `org.apache.isis.applib.layout.links` package, and consist of just the `Link` class.
diff --git a/antora/components/refguide/modules/applib-classes/pages/mixees-and-mixins.adoc b/antora/components/refguide/modules/applib-classes/pages/mixees-and-mixins.adoc
new file mode 100644
index 0000000..8dc3538
--- /dev/null
+++ b/antora/components/refguide/modules/applib-classes/pages/mixees-and-mixins.adoc
@@ -0,0 +1,96 @@
+= Mixees and Mixins
+
+: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 [...]
+:page-partial:
+
+
+This section defines a number of "mixee" interfaces that define a contract for some framework-defined mixins.
+
+[TIP]
+====
+See the xref:userguide:fun:overview.adoc#mixins[fundamentals user guide] for a discussion of mixins.
+====
+
+
+[#java-lang-object]
+== java.lang.Object
+
+The framework provides a number of mixins that contributes to `java.lang.Object` (in other words, to every domain object):
+
+* core
+** xref:refguide:applib:index/mixins/layout/Object_downloadLayoutXml.adoc[Object_downloadLayoutXml]
+** xref:refguide:applib:index/mixins/layout/Object_downloadLayoutXml.adoc[Object_downloadLayoutXml]
+
+* Wicket viewer:
+** xref:refguide:viewer:index/wicket/viewer/mixins/Object_clearHints.adoc[Object_clearHints]
+
+
+
+[[Dto]]
+== Dto
+
+JAXB view models can optionally implement the xref:refguide:applib:index/mixins/dto/Dto.adoc[Dto] interface.
+Two mixins contribute to this interface:
+
+* xref:refguide:applib:index/mixins/dto/Dto_downloadXml.adoc[Dto_downloadXml]
+* xref:refguide:applib:index/mixins/dto/Dto_downloadXsd.adoc[Dto_downloadXsd]
+
+These allow the view model/DTO to be seriailized, respectively, as XML and as the XSD schema for said XML.
+
+
+[[Persistable]]
+== Persistable
+
+
+All JDO domain entities implement the DataNucleus `Persistable` role interface as a result of the enhancer process (the fully qualified class name is `org.datanucleus.enhancement.Persistable`).
+
+Using this, the following mixins (actions and properties) are available for all JDO entities:
+
+* xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.adoc[Persistable_downloadJdoMetadata] (action)
+* xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.adoc[Persistable_datanucleusIdLong] (property)
++
+only visible if the JDO entity has datastore identity, and the `id` field introduced by enhancing can be cast to `Long`.
+
+* xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.adoc[Persistable_datanucleusVersionLong] (property)
++
+only visible if the entity is annotated with `javax.jdo.annotations.Version` and the `version` field introduced by enhancing can be cast to `Long`.
+
+* xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.adoc[Persistable_datanucleusVersionLong] (property)
++
+only visible if the entity is annotated with `javax.jdo.annotations.Version` and the `version` field introduced by enhancing can be cast to `java.sql.Timestamp`.
+
+As a developer you do not need to write any code to obtain the mixins that contribute to this interface.
+
+These mixin properties/actions are all associated with the "Metadata" fieldset.
+
+
+== Security
+
+Domain objects that are created, updated or otherwise associated with a user can implement the xref:refguide:applib:index/mixins/security/HasUsername.adoc[HasUsername] mixee interface.
+
+A number of extension modules related to security, such as xref:security:secman:about.adoc[SecMan] module, contribute to this interface.
+
+
+== System
+
+Domain objects that are associated to an xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] or to a nested xref:refguide:applib:index/services/xactn/TransactionId.adoc[transaction] can express this relationship by implementing the xref:refguide:applib:index/mixins/system/HasInteractionId_see-also.adoc
+
+
+== Updates
+
+The following interfaces define a contract for the framework to update:
+
+* xref:refguide:applib:index/mixins/updates/OnUpdatedAt.adoc[OnUpdatedAt]
++
+For domain entities that keep track of when they were last updated.
+
+* xref:refguide:applib:index/mixins/updates/OnUpdatedBy.adoc[OnUpdatedBy]
++
+For domain entities that keep track of which user last updated them.
+
+* xref:refguide:applib:index/mixins/mixins/updates/OnUpdatedByAndAt.adoc[OnUpdatedByAndAt]
++
+Simply a combination of xref:refguide:applib:index/mixins/mixins/updates/OnUpdatedAt.adoc[HasUpdatedAt] and xref:refguide:applib:index/mixins/mixins/updates/OnUpdatedBy.adoc[HasUpdatedBy]
+
+Note that these are not quite the same thing as regular mixee interfaces, in that they do not expose getters to be leveraged by a mixin.
+Rather, these expose callback such that the framework can populate them at the appropriate juncture.
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/contributee.adoc b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/contributee.adoc
index 78ea5b3..59890ea 100644
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/contributee.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/contributee.adoc
@@ -6,49 +6,17 @@
 
 The interfaces listed in this chapter act as contributees; they allow domain services to contribute actions/properties/collections to any domain objects that implement these interfaces.
 
-[[HasUniqueId]]
-== `HasUniqueId`
 
-The `HasUniqueId` interface is a mix-in for any domain objects that are uniquely identified, in particular to represent a system-level request or interaction.
-The canonical usage is where the unique identifier is actually a transaction id, as implemented by auditing entries or commands, or for xref:refguide:applib:index/services/iactn/InteractionContext.adoc[Interaction]s persisted as published events.
 
-The interface is defined is:
-
-[source,java]
-----
-public interface HasUniqueId {
-    public UUID getUniqueId();                             // <.>
-    public void setUniqueId(final UUID uniqueId);
-}
-----
-<.> unique identifier (a GUID) of this request/interaction.
+== Usage Notes
 
-Some of the extension/mapping modules that have domain entity/ies that implement this interface are:
-
-* xref:security:audit-trail:about.adoc[Auditer] module: `AuditEntry` entity
-* xref:extensions:command-log:about.adoc[Command Log] module: `CommandJdo` entity
-* xref:mappings:outbox-publisher:about.adoc[Outbox Publisher] module: `OutboxEvent` entity
-
-[#RepresentsInteractionMemberExecution]
-== `RepresentsInteractionMemberExecution`
-
-The `RepresentsInteractionMemberExecution` interface is a sub-interface of `HasUniqueId` that also includes a sequence property:
-
-[source,java]
-----
-public interface RepresentsInteractionMemberExecution extends HasUniqueId {
-    int getSequence();
-}
-----
-
-Here the (inherited) `getTransactionId()` is intended to be interpreted as an interaction (cf xref:refguide:schema:ixn.adoc[InteractionDto]) that has at least one member execution (cf xref:refguide:schema:about.adoc#ixn/memberExecutionDto.adoc[memberExecutionDto]).
-
-If the interaction (almost certainly an action) calls other actions by way of xref:refguide:applib:index/services/wrapper/WrapperFactory.adoc[WrapperFactory]), then there may be several member executions, each with a unique sequence number, within the same transaction Id.
+If the interaction is an action that in turn calls other actions by way of xref:refguide:applib:index/services/wrapper/WrapperFactory.adoc[WrapperFactory]), then there may be several member executions, each with a unique sequence number, within the same transaction Id.
 
 The purpose of this interface is to allow mixins to be defined, though the framework itself defines none.
 
 Currently the only implementation of this interface is that for `PublishedObjects` applib interface as defined by the xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber].
 
+
 [[HasUserName]]
 == `HasUsername`
 
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins.adoc b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins.adoc
index 158d569..60077ef 100644
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins.adoc
@@ -1,10 +1,10 @@
-= Mixins
+= Mixins (and Mixees)
 
 :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 [...]
 :page-partial:
 
 
-This section defines a number of role interfaces that define a contract for some framework-defined mixins.
+This section defines a number of interfaces that define a contract for some framework-defined mixins.
 
 [TIP]
 ====
@@ -12,8 +12,56 @@ See the xref:userguide:fun:overview.adoc#mixins[fundamentals user guide] for a d
 ====
 
 
+[#java-lang-object]
+== java.lang.Object
+
+The framework provides a number of mixins that contributes to `java.lang.Object` (in other words, to every domain object):
+
+* core
+** xref:refguide:applib:index/mixins/layout/Object_downloadLayoutXml.adoc[Object_downloadLayoutXml]
+** xref:refguide:applib:index/mixins/layout/Object_downloadLayoutXml.adoc[Object_downloadLayoutXml]
+
+* Wicket viewer:
+** xref:refguide:viewer:index/wicket/viewer/mixins/Object_clearHints.adoc[Object_clearHints]
+
+
+
+[[Dto]]
+== Dto
+
+JAXB view models can optionally implement the `Dto` interface.
+Two mixins contribute to this interface:
+
+* xref:refguide:applib:index/mixins/dto/Dto_downloadXml.adoc[Dto_downloadXml]
+* xref:refguide:applib:index/mixins/dto/Dto_downloadXsd.adoc[Dto_downloadXsd]
+
+These allow the view model/DTO to be seriailized, respectively, as XML and as the XSD schema for said XML.
+
+
+[[Persistable]]
+== Persistable
+
+
+All JDO domain entities implement the DataNucleus `Persistable` role interface as a result of the enhancer process (the fully qualified class name is `org.datanucleus.enhancement.Persistable`).
+
+Using this, the following mixins (actions and properties) are available for all JDO entities:
+
+* xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.adoc[Persistable_downloadJdoMetadata] (action)
+* xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.adoc[Persistable_datanucleusIdLong] (property)
++
+only visible if the JDO entity has datastore identity, and the `id` field introduced by enhancing can be cast to `Long`.
+
+* xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.adoc[Persistable_datanucleusVersionLong] (property)
++
+only visible if the entity is annotated with `javax.jdo.annotations.Version` and the `version` field introduced by enhancing can be cast to `Long`.
+
+* xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.adoc[Persistable_datanucleusVersionLong] (property)
++
+only visible if the entity is annotated with `javax.jdo.annotations.Version` and the `version` field introduced by enhancing can be cast to `java.sql.Timestamp`.
+
+As a developer you do not need to write any code to obtain the mixins that contribute to this interface.
+
+These mixin properties/actions are all associated with the "Metadata" fieldset.
+
 
 
-include::mixins/Object.adoc[leveloffset=+1]
-include::mixins/Dto.adoc[leveloffset=+1]
-include::mixins/Persistable.adoc[leveloffset=+1]
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins/Dto.adoc b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins/Dto.adoc
deleted file mode 100644
index 39c41ae..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins/Dto.adoc
+++ /dev/null
@@ -1,66 +0,0 @@
-[[Dto]]
-= `Dto`
-
-: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 [...]
-:page-partial:
-
-
-The `Dto` role interface is intended to be implemented by JAXB-annotated view models, that is, annotated using
-xref:refguide:applib-ant:XmlRootElement.adoc[@XmlRootElement].
-It enables the ability to download the XML and XSD schema of those objects using two xref:userguide:fun:overview.adoc#mixins[mixins], `Dto_downloadXml` and `Dto_downloadXsd`.
-
-The interface is just a marker interface (with no members), and is defined as:
-
-[source,java]
-----
-public interface Dto { }
-----
-
-The `Dto_downloadXml` mixin defines the following action:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-@Action
-public class Dto_downloadXml {
-
-    public Dto_downloadXml(final Dto dto) {     // <.>
-        // ...
-    }
-    public Object act(final String fileName) {  // <.>
-        // ...
-    }
-
-    // ...
-}
-----
-<.> (constructor) provided as an action to any class that (trivially) implements the `Dto` interface
-<.> The action's name is derived from the class name.
-
-This will return the XML text wrapped up in a xref:applib-classes:about.adoc#Clob[Clob].
-
-The `Dto_downloadXsd` mixin is similar:
-
-[source,java]
-----
-@Action
-public class Dto_downloadXsd {
-    public Dto_downloadXsd(final Dto dto) { /* ... */ }  // <.>
-    public Object act(                                   // <.>
-            final String fileName,
-            final IsisSchemes isisSchemas) { /* ... */ }
-}
-----
-<.> (constructor) provided as an action to any class that (trivially) implements the `Dto` interface
-<.> The action's name be derived from the class name.
-
-If the domain object's JAXB annotations reference only a single XSD schema then this will return that XML text as a xref:applib-classes:about.adoc#Clob[Clob] of that XSD.
-If there are multiple XSD schemas referenced then the action will return a zip of those schemas, wrapped up in a xref:applib-classes:about.adoc#Blob[Blob].
-The `IsisSchemas` parameter to the action can be used to optionally ignore the common xref:refguide:schema:about.adoc[Apache Isis schemas] (useful if there is only one other XSD schema referenced by the DTO).
-
-
-
-== Related Services
-
-The `Dto_downloadXml` and `Dto_downloadXsd` delegate to the xref:refguide:applib:index/services/jaxb/JaxbService.adoc[JaxbService] to actually generate the XML/XSD.
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins/Object.adoc b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins/Object.adoc
deleted file mode 100644
index 2ffea5b..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins/Object.adoc
+++ /dev/null
@@ -1,115 +0,0 @@
-[[Object]]
-= `Object`
-
-: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 [...]
-:page-partial:
-
-
-The framework provides a single mixin that contributes to simply `java.lang.Object`.
-It provides the ability to download the layout XML for any domain object (in practical terms: entities and view models).
-
-These mixin actions are all associated with the "Metadata" fieldset.
-A number of other xref:applib-classes:about.adoc#Persistable[mixins] also contribute properties or actions to the "Metadata" fieldset.
-
-
-
-[#clearHints]
-== `clearHints()`
-
-When a domain object is rendered the end-user can select different tabs, and for collections can sort the columns,
-navigate to second pages, or select different views of collections.
-If the user revisits that object, the xref:vw:ROOT:about.adoc[Wicket viewer] will remember these hints and render the domain object in the same state.
-These rendering hints are also included if the user copies the URL using the anchor link (to right hand of the object's title).
-
-The `Object_clearHints` mixin provides the ability for the end-user to discard these hints so that the object is
-rendered in its initial state:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public void clearHints() {
-    ...
-}
-----
-
-=== Related Services
-
-This mixin uses the xref:refguide:applib:index/services/hint/HintStore.adoc[HintStore] service to store and retrieve UI hints for each rendered object, per user.
-
-
-
-[#downloadlayoutxml]
-== `downloadLayoutXml()`
-
-The `Object_downloadLayoutXml` mixin provides an action to download the xref:userguide:fun:ui.adoc#object-layout[layout XML] for the current domain object.
-It has the following signature:
-
-// TODO: v2: use include::[]
-
-
-[source,java]
-----
-public Object downloadLayoutXml(
-    @ParameterLayout(named = "File name")
-    final String fileName,
-    final LayoutService.Style style) {          // <1>
-    ...
-}
-----
-<1> either current, complete, normalized or minimal.
-
-See the documentation on xref:userguide:fun:ui.adoc#object-layout[layout XML] and also
-the xref:refguide:applib:index/services/layout/LayoutService.adoc[LayoutService] for more information on these styles
-
-
-=== Related Services
-
-This mixin calls xref:refguide:applib:index/services/layout/LayoutService.adoc[LayoutService] to obtain the layout XML.
-
-
-
-
-[#rebuildMetamodel]
-== `rebuildMetamodel()`
-
-The `Object_rebuildMetamodel` mixin provides the ability to discard the current internal metamodel data (an instance of `ObjectSpecification`) for the domain class of the rendered object, and recreate from code and other sources (most notably, layout XML data).
-It has the following signature:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public void rebuildMetamodel() {
-    ...
-}
-----
-
-
-=== Related Services
-
-This mixin calls xref:refguide:applib:index/services/metamodel/MetaModelService.adoc[MetaModelService] and the xref:refguide:applib:index/services/grid/GridService.adoc[GridService] to invalidate their caches.
-
-
-
-
-
-== `openRestApi()`
-
-The `Object_openRestApi` mixin provides an action to navigate to the URL of the xref:vro:ROOT:about.adoc[Restful Objects resource] corresponding to the domain object.
-It has the following signature:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public URL openRestApi() { /* ... */ }
-----
-
-
-=== Related Services
-
-This mixin calls xref:refguide:applib:index/services/bookmark/BookmarkService.adoc[BookmarkService] to build the URL.
-
-
-
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins/Persistable.adoc b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins/Persistable.adoc
deleted file mode 100644
index eb20331..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/mixins/Persistable.adoc
+++ /dev/null
@@ -1,59 +0,0 @@
-[[Persistable]]
-= `Persistable`
-
-: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 [...]
-:page-partial:
-
-
-All domain entities automatically implement the DataNucleus `Persistable` role interface as a result of the enhancer process (the fully qualified class name is `org.datanucleus.enhancement.Persistable`).
-So as a developer you do not need to write any code to obtain the mixins that contribute to this interface.
-
-These mixin properties/actions are all associated with the "Metadata" fieldset.
-A number of other xref:applib-classes:about.adoc#Object[mixins] also contribute properties or actions to the "Metadata" fieldset.
-
-
-
-[#downloadJdoMetadata]
-== `downloadJdoMetadata()`
-
-The `Persistable_downloadJdoMetadata` mixin provides an action which allows the JDO link:http://www.datanucleus.org/products/datanucleus/jdo/metadata_xml.html[class metadata] to be downloaded as XML.
-It has the following signature:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public Clob downloadJdoMetadata(                    // <.>
-
-    @ParameterLayout(named = ".jdo file name")
-    final String fileName) {
-        // ...
-    }
-
-    // ...
-}
-----
-<.> returns the XML text wrapped up in a xref:applib-classes:about.adoc#Clob[Clob].
-
-
-
-=== Related Services
-
-The mixin delegates to the xref:pjdo:ROOT:services/IsisJdoSupport.adoc[IsisJdoSupport] service to obtain a reference to the JDO `PersistenceManagerFactory`.
-
-
-[#datanucleusXxx]
-== `datanucleusXxx`
-
-The framework provides a number of mixins that expose the datanucleus Id and version of a persistable domain entity.
-Several implementations are provided to support different datatypes:
-
-* `Persistable_datanucleusIdLong` will expose the entity's id, assuming that the id is or can be cast to `java.lang.Long`.
-Otherwise the property will be hidden.
-
-* `Persistable_datanucleusVersionTimestamp` will expose the entity's version, assuming that the version is or can be cast to `java.sql.Timestamp`.
-Otherwise the property will be hidden.
-
-* `Persistable_datanucleusVersionLong` will expose the entity's version, assuming that the version is or can be cast to `java.lang.Long`.
-Otherwise the property will be hidden.
-
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles/HoldsUpdatedAt.adoc b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles/HoldsUpdatedAt.adoc
deleted file mode 100644
index 2f7481d..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles/HoldsUpdatedAt.adoc
+++ /dev/null
@@ -1,46 +0,0 @@
-[[HoldsUpdatedAt]]
-= `HoldsUpdatedAt`
-
-: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 [...]
-:page-partial:
-
-
-The `HoldsUpdatedAt` role interface allows the (framework-provided) `TimestampService` to update each object with the current timestamp whenever it is modified in a transaction.
-
-The interface is defined as:
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public interface HoldsUpdatedAt {
-    void setUpdatedAt(java.sql.Timestamp updatedAt);
-}
-----
-
-The current time is obtained from the xref:refguide:applib:index/services/clock/ClockService.adoc[ClockService].
-
-Entities that implement this interface often also implement xref:applib-classes:about.adoc#HoldsUpdatedBy[HoldsUpdatedBy] role interface; as a convenience the xref:applib-classes:about.adoc#Timestampable[Timestampable] interface combines the two roles.
-
-
-
-== Alternative approaches
-
-An alternative way to maintain a timestamp is to use JDO's `@Version` annotation.
-With this approach, it is the JDO/DataNucleus that maintains the version, rather than the framework's `TimestampService`.
-
-For example:
-
-[source,java]
-----
-@javax.jdo.annotations.Version(
-        strategy=VersionStrategy.DATE_TIME,
-        column="version")
-public class Customer {
-    ...
-    public java.sql.Timestamp getVersionSequence() {
-        return (java.sql.Timestamp) JDOHelper.getVersion(this);
-    }
-}
-----
-
diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles/HoldsUpdatedBy.adoc b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles/HoldsUpdatedBy.adoc
deleted file mode 100644
index adaa9f9..0000000
--- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/roles/HoldsUpdatedBy.adoc
+++ /dev/null
@@ -1,21 +0,0 @@
-[[HoldsUpdatedBy]]
-= `HoldsUpdatedBy`
-
-: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 [...]
-:page-partial:
-
-
-The `HoldsUpdatedBy` role interface ...
-
-// TODO: v2: use include::[]
-
-[source,java]
-----
-public interface HoldsUpdatedBy {
-    void setUpdatedBy(String updatedBy);
-}
-----
-
-Entities that implement this interface often also implement xref:applib-classes:about.adoc#HoldsUpdatedAt[HoldsUpdatedAt] role interface; as a convenience the xref:applib-classes:about.adoc#Timestampable[Timestampable] interface combines the two roles.
-
-
diff --git a/antora/components/refguide/modules/applib-classes/partials/module-nav.adoc b/antora/components/refguide/modules/applib-classes/partials/module-nav.adoc
index a70b567..055402d 100644
--- a/antora/components/refguide/modules/applib-classes/partials/module-nav.adoc
+++ b/antora/components/refguide/modules/applib-classes/partials/module-nav.adoc
@@ -1,11 +1,10 @@
 
 * xref:applib-classes:about.adoc[Classes]
 ** xref:applib-classes:events.adoc[Events]
+** xref:applib-classes:mixees-and-mixins.adoc[Mixees and Mixins]
 ** xref:applib-classes:ViewModel.adoc[ViewModel] (interface)
 ** xref:applib-classes:value-types.adoc[Value Types]
 ** xref:applib-classes:spec.adoc[Specification pattern]
-** xref:applib-classes:i18n.adoc[i18n support]
-** xref:applib-classes:roles-mixins-contributees.adoc[Roles, Mixins and Contributees]
 ** xref:applib-classes:utility.adoc[Utility Classes]
 *** xref:applib:index/util/Enums.adoc[Enums]
 *** xref:applib:index/util/ObjectContracts.adoc[ObjectContracts]
diff --git a/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc b/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc
index d3518c0..50190e3 100644
--- a/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc
+++ b/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc
@@ -10,7 +10,7 @@ This is a further milestone release, consolidating the "re-platforming" of Apach
 Much of the emphasis in this release has been on stabilisation and regression testing.
 That said, there are some new features.
 The release includes support for a new (additional) link:https://cwiki.apache.org/confluence/display/ISIS/ActionParameters?focusedCommentId=158867933#comment-158867933[programming model for action parameters], allowing for more sophisticated management of parameters that interact with each other.
-On the flip side, support for contributed actions from domain services has been removed; use xref:refguide:applib-classes:roles-mixins-contributees/mixins.adoc[Mixins]instead.
+On the flip side, support for contributed actions from domain services has been removed; use xref:refguide:applib-classes:mixins.adoc[Mixins]instead.
 
 This release also has a reworking/simplification of the command service and background commands.
 This includes new extension modules to persist commands (xref:extensions:command-log:about.adoc[Command Log] and xref:extensions:command-replay:about.adoc[Command Replay], to assist regression testing.
diff --git a/antora/components/userguide/modules/fun/pages/overview/types-of-domain-objects.adoc b/antora/components/userguide/modules/fun/pages/overview/types-of-domain-objects.adoc
index 30040b0..2617744 100644
--- a/antora/components/userguide/modules/fun/pages/overview/types-of-domain-objects.adoc
+++ b/antora/components/userguide/modules/fun/pages/overview/types-of-domain-objects.adoc
@@ -214,7 +214,7 @@ These DTOs are still usable as "regular" view models; they will render in the xr
 In fact (as the xref:userguide:fun:view-models.adoc#jaxb[programming model] section below makes clear), these JAXB-annotated view models are in many regards the most powerful of all the alternative ways of writing view models.
 
 It's also worth noting that it is also possible to download the XML (or XSD) straight from the UI, useful during development.
-The view model simply needs to implement the xref:refguide:applib-cm:roles-mixins-contributees/mixins.adoc#Dto[Dto] marker interface; the framework has xref:refguide:applib-cm:roles-mixins-contributees/mixins.adoc#Dto[mixins] that contribute the download actions to the view model.
+The view model simply needs to implement the xref:refguide:applib:index/mixins/dto/Dto.adoc[Dto] marker interface; the framework has xref:refguide:applib-classes:mixins.adoc#Dto[mixins] that contribute the download actions to the view model.
 
 === For REST Clients
 
diff --git a/antora/components/userguide/modules/fun/pages/ui/object-layout.adoc b/antora/components/userguide/modules/fun/pages/ui/object-layout.adoc
index be54708..40299b0 100644
--- a/antora/components/userguide/modules/fun/pages/ui/object-layout.adoc
+++ b/antora/components/userguide/modules/fun/pages/ui/object-layout.adoc
@@ -14,7 +14,7 @@ File-based layouts offer a number of benefits:
 
 * UI hints can be provided for xref:userguide:fun:mixins.adoc[mixin] contributions that are synthesised at runtime.
 
-It is also possible to download an initial `.layout.xml` - capturing any existing layout metadata - using the xref:refguide:applib:index/services/layout/LayoutService.adoc[LayoutService] (exposed on the prototyping menu) or using a xref:refguide:applib-cm:roles-mixins-contributees/mixins.adoc#Object[mixin action] contributed to every domain object.
+It is also possible to download an initial `.layout.xml` - capturing any existing layout metadata - using the xref:refguide:applib:index/services/layout/LayoutService.adoc[LayoutService] (exposed on the prototyping menu) or using a xref:refguide:applib-classes:mixins.adoc#java-lang-object[mixin action] contributed to every domain object.
 
 There are some downsides, though:
 
@@ -279,5 +279,5 @@ You can then remove the `@MemberOrder` and `@Action#associateWith` annotations f
 * if you want to use layout XML file ONLY to describe the grid, then download the "minimal" version.
 The grid regions will be empty in this version, and the framework will use the `@MemberOrder` and `@Action#associateWith` annotations to bind object members to those regions.
 
-If you want to adjust the layout XML for a single domain object, then you can use the xref:refguide:applib-cm:roles-mixins-contributees/mixins.adoc#downloadlayoutxml[mixin action] (contributed to every domain object).
+If you want to adjust the layout XML for a single domain object, then you can use the xref:refguide:applib-classes:mixins.adoc#[mixin action] (contributed to every domain object).
 
diff --git a/antora/components/userguide/modules/fun/pages/view-models/UNUSED-dto.adoc b/antora/components/userguide/modules/fun/pages/view-models/UNUSED-dto.adoc
index 0e7843c..e69de29 100644
--- a/antora/components/userguide/modules/fun/pages/view-models/UNUSED-dto.adoc
+++ b/antora/components/userguide/modules/fun/pages/view-models/UNUSED-dto.adoc
@@ -1,190 +0,0 @@
-= DTOs
-
-: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 [...]
-:page-partial:
-
-
-WARNING: TODO: v2: move this to "beyond the basics"
-
-JAXB view models can also be used as DTOs.
-The examples in this section uses the DTO for `ToDoItem`.
-
-This DTO is defined as follows:
-
-[source,java]
-----
-package todoapp.app.viewmodels.todoitem.v1;                         // <.>
-@XmlRootElement(name = "toDoItemDto")                               // <.>
-@XmlType(
-        propOrder = {                                               // <.>
-            "majorVersion", "minorVersion",
-            "description", "category", ...
-            "toDoItem", "similarItems"
-        }
-)
-@DomainObjectLayout(
-        titleUiEvent = TitleUiEvent.Doop.class                      // <.>
-)
-public class ToDoItemV1_1 implements Dto {                          // <.>
-    @XmlElement(required = true, defaultValue = "1")                // <.>
-    public final String getMajorVersion() { return "1"; }
-    @XmlElement(required = true, defaultValue = "1")                // <.>
-    public String getMinorVersion() { return "1"; }
-
-    @XmlElement(required = true)                                    // <.>
-    @Getter @Setter
-    protected String description;
-    @XmlElement(required = true)
-    @Getter @Setter
-    protected String category;
-    ...
-
-    @Getter @Setter                                                 // <.>
-    protected ToDoItem toDoItem;
-    @XmlElementWrapper                                              // <.>
-    @XmlElement(name = "todoItem")
-    @Getter @Setter
-    protected List<ToDoItem> similarItems = Lists.newArrayList();
-}
-----
-<.> package name encodes major version; see discussion on xref:userguide:fun:view-models.adoc#versioning[versioning]
-<.> identifies this class as a view model and defines the root element for JAXB serialization
-<.> all properties in the class must be listed; (they can be ignored using `@XmlTransient`)
-<.> demonstrating use of UI events for a subscriber to provide the DTO's title; see xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#titleUiEvent[@DomainObjectLayout#titleUiEvent()].
-<.> class name encodes (major and) minor version; see discussion on xref:userguide:fun:view-models.adoc#versioning[versioning]
-<.> again, see discussion on xref:userguide:fun:view-models.adoc#versioning[versioning]
-<.> again, see discussion on xref:userguide:fun:view-models.adoc#versioning[versioning]
-<.> simple scalar properties
-<.> reference to a persistent entity; discussed xref:userguide:fun:view-models.adoc#referencing-domain-entities[here]
-<.> reference to a collection of persistent entities; again discussed xref:userguide:fun:view-models.adoc#referencing-domain-entities[here]
-
-
-
-
-[#versioning]
-== Versioning
-
-The whole point of using DTOs (in Apache Isis, at least) is to define a formal contact between two inter-operating but independent applications.
-Since the only thing we can predict about the future with any certainty is that one or both of these applications will change, we should version DTOs from the get-go.
-This allows us to make changes going forward without unnecessarily breaking existing consumers of the data.
-
-[NOTE]
-====
-There are several ways that versioning might be accomplished; we base our guidelines on this link:http://www.xfront.com/Versioning.pdf[article] taken from Roger Costello's blog, well worth a read.
-====
-
-We can distinguish two types of changes:
-
-* backwardly compatible changes
-* breaking changes.
-
-The XSD namespace should change only when there is a major/breaking change.
-If following link:http://semver.org[semantic versioning] that means when we bump the major version number v1, v2, etc.
-
-XML namespaces correspond (when using JAXB) to Java packages.
-We should therefore place our DTOs in a package that contains only the major number; this package will eventually contain a range of DTOs that are intended to be backwardly compatible with one another.
-The package should also have a `package-info.java`; it is this that declares the XSD namespace:
-
-[source,java]
-----
-@javax.xml.bind.annotation.XmlSchema(
-    namespace = "http://viewmodels.app.todoapp/todoitem/v1/Dto.xsd",    // <.>
-    xmlns = {
-        @javax.xml.bind.annotation.XmlNs(
-            namespaceURI = "http://isis.apache.org/schema/common",
-            prefix = "com"
-        )
-    },
-    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
-)
-package todoapp.app.viewmodels.todoitem.v1;                             // <.>
-----
-<.> the namespace URI, used by the DTO residing in this package.
-<.> the package in which the DTO resides.  Note that this contains only the major version.
-
-Although there is no requirement for the namespace URI to correspond to a physical URL, it should be unique.
-This usually means including a company domain name within the string.
-
-As noted above, this package will contain multiple DTO classes all with the same namespace; these represent a set of minor versions of the DTO, each subsequent one intended to be backwardly compatible with the previous.
-Since these DTO classes will all be in the same package (as per the advice above), the class should therefore include the minor version name:
-
-[source,java]
-----
-package todoapp.app.viewmodels.todoitem.v1;     // <1>
-...
-public class ToDoItemV1_1 implements Dto {      // <2>
-    ...
-}
-----
-<1> package contains the major version only
-<2> DTO class contains the (major and) minor version
-
-
-We also recommend that each DTO instance should also specify the version of the XSD schema that it is logically compatible with.
-Probably most consumers will not persist the DTOs; they will be processed and then discarded.
-However, it would be wrong to assume that is the case in all cases; some consumers might choose to persist the DTO (eg for replay at some later state).
-
-Thus:
-
-[source,java]
-----
-public class ToDoItemV1_1 implements Dto {
-    @XmlElement(required = true, defaultValue = "1")
-    public final String getMajorVersion() { return "1"; }   // <.>
-    @XmlElement(required = true, defaultValue = "1")
-    public String getMinorVersion() { return "1"; }         // <.>
-    ...
-}
-----
-<.> returns the major version (in sync with the package)
-<.> returns the minor version (in sync with the class name)
-
-These methods always return a hard-coded literal.
-Any instances serialized from these classes will implicitly "declare" the (major and) minor version of the schema with which they are compatible.
-If a consumer has a minimum version that it requires, it can therefore inspect the XML instance itself to determine if it is able to consume said XML.
-
-If a new (minor) version of a DTO is required, then we recommend copying-and-pasting the previous version, eg:
-
-[source,java]
-----
-public class ToDoItemV1_2 implements Dto {
-    @XmlElement(required = true, defaultValue = "1")
-    public final String getMajorVersion() { return "1"; }
-    @XmlElement(required = true, defaultValue = "2")
-    public String getMinorVersion() { return "2"; }
-    ...
-}
-----
-
-Obviously, only changes made must be backward compatible, eg new members must be optional.
-
-Alternatively, you might also consider simply editing the source file, ie renaming the class and bumping up the value returned by `getMinorVersion()`.
-
-
-
-
-
-
-=== DTO Consumers
-
-The actual consumers of DTOs will generally obtain the XML of the view models either by requesting the XML directly, eg using the xref:vro:ROOT:about.adoc[RestfulObjects viewer], or may have the XML sent to them asynchronously using an ESB such as Apache Camel.
-
-In the former case, the consumer requests the DTO by calling the REST API with the appropriate HTTP `Accept` header.
-An appropriate implementation of xref:refguide:applib:index/services/conmap/ContentMappingService.adoc[ContentMappingService] can then be used to return the appropriate DTO (as XML).
-
-For the latter case, one design is simply for the application to instantiate the view model, then call the xref:refguide:applib:index/services/jaxb/JaxbService.adoc[JaxbService] to obtain its corresponding XML.  This can then be published onto the ESB, for example using an http://activemq.apache.org[Apache ActiveMQ (TM)] queue.
-
-However, rather than try to push all the data that might be needed by any of these external systems in a single XML event (which would require anticipating all the requirements, likely a hopeless task), a better design is to publish only the fact that something of note has changed - ie, that an action on a domain object has been invoked - and then let the consumers call back to obtain other information if required.
-This can once again be done by calling the REST API with an appropriate HTTP `Accept` header.
-
-[TIP]
-====
-This is an example of the link:https://leanpub.com/camel-design-patterns[VETRO pattern] (validate, enrich, transform, route, operate).
-In our case we focus on the validation (to determine the nature of the inbound message, ie which action was invoked), and the enrich (callback to obtain a DTO with additional information required by the consumer).
-====
-
-The (non-ASF) link:https://platform.incode.org[Incode Platform^]'s publishmq module provides an out-of-the-box solution of this design.
-It provides an implementation of the xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber], but which simply publishes instances of xref:refguide:schema:ixn.adoc[InteractionDto] to an ActiveMQ queue.
-Camel (or similar) can then be hooked up to consume these events from this queue, and use a processor to parse the action memento to determine what has changed on the source system.
-Thereafter, a subsequent Camel processor can then call back to the source - via the xref:vro:ROOT:about.adoc[Restful Objects viewer] - to enrich the message with additional details using a DTO.
-
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto.java
index 31902e1..fa6faa2 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto.java
@@ -19,6 +19,28 @@
 package org.apache.isis.applib.mixins.dto;
 
 /**
+ * Allows JAXB-annotated view models to act as a mixee in order that other
+ * modules (and the core framework) can contribute behaviour.
+ *
+ * <p>
+ *     A JAXB view model is one annotated with
+ *     {@link javax.xml.bind.annotation.XmlRootElement}.
+ * </p>
+ *
+ * <p>
+ *     The two mixin behaviours contributed by the core framework are the
+ *     ability to download the view model as XML (using {@link Dto_downloadXml})
+ *     and to download the XSD schema for that XML (using
+ *     {@link Dto_downloadXsd}).
+ * </p>
+ *
+ * <p>
+ * The interface is just a marker interface (with no members).
+ * </p>
+ *
+ * @see Dto_downloadXml
+ * @see Dto_downloadXsd
+ *
  * @since 1.x {@index}
  */
 public interface Dto {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/MixinConstants.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMixinConstants.java
similarity index 88%
rename from api/applib/src/main/java/org/apache/isis/applib/mixins/MixinConstants.java
rename to api/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMixinConstants.java
index acc3375..7d57226 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/MixinConstants.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMixinConstants.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.mixins;
+package org.apache.isis.applib.mixins.dto;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -25,11 +25,8 @@ import lombok.NoArgsConstructor;
  * @since 1.x {@index}
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class MixinConstants {
+public final class DtoMixinConstants {
 
-    public static final String METADATA_LAYOUT_GROUPNAME = "metadata";
     public static final String FILENAME_PROPERTY_NAME = "File name";
     public static final String FILENAME_PROPERTY_DESCRIPTION = "File name extension can be omitted.";
-
-
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto_downloadXml.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto_downloadXml.java
index 7cbc941..def3f21 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto_downloadXml.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto_downloadXml.java
@@ -26,7 +26,6 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.mixins.MixinConstants;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.value.Clob;
 import org.apache.isis.applib.value.NamedWithMimeType.CommonMimeType;
@@ -35,6 +34,15 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
+ * Mixin that provides the ability to download a view model as XML.
+ *
+ * <p>
+ *  Requires that the view model is a JAXB view model, and implements the
+ *  {@link Dto} marker interface.
+ * </p>
+ *
+ * @see Dto_downloadXsd
+ *
  * @since 1.x {@index}
  */
 @Action(
@@ -59,22 +67,18 @@ public class Dto_downloadXml {
 
             // PARAM 0
             @ParameterLayout(
-                    named = MixinConstants.FILENAME_PROPERTY_NAME,
-                    describedAs = MixinConstants.FILENAME_PROPERTY_DESCRIPTION)
+                    named = DtoMixinConstants.FILENAME_PROPERTY_NAME,
+                    describedAs = DtoMixinConstants.FILENAME_PROPERTY_DESCRIPTION)
             final String fileName) {
 
         val xmlString = jaxbService.toXml(holder);
         return Clob.of(fileName, CommonMimeType.XML, xmlString);
     }
 
-    // -- PARAM 0
-
     public String default0Act() {
         return holder.getClass().getName();
     }
 
-    // -- DEPENDENCIES
-
     @Inject JaxbService jaxbService;
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto_downloadXsd.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto_downloadXsd.java
index 513ffa2..305bafe 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto_downloadXsd.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/dto/Dto_downloadXsd.java
@@ -28,7 +28,6 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.mixins.MixinConstants;
 import org.apache.isis.applib.services.jaxb.IsisSchemas;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.message.MessageService;
@@ -41,6 +40,21 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
+ * Mixin that provides the ability to download the XSD schema for a view model
+ * can be downloaded as XML.
+ *
+ * <p>
+ *  Requires that the view model is a JAXB view model, and implements the
+ *  {@link Dto} marker interface.
+ * </p>
+ *
+ * <p>
+ * If the domain object's JAXB annotations reference only a single XSD schema
+ * then this will return that XML text as a {@link Clob} of that XSD.
+ * If there are multiple XSD schemas referenced then the action will return a
+ * zip of those schemas, wrapped up in a {@link Blob}.
+ * </p>
+ *
  * @since 1.x {@index}
  */
 @Action(
@@ -59,16 +73,19 @@ public class Dto_downloadXsd {
     public static class ActionDomainEvent
     extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Dto_downloadXsd> {}
 
+    /**
+     * The {@link IsisSchemas} parameter can be used to optionally ignore the
+     * common Apache Isis schemas; useful if there is only one other XSD schema
+     * referenced by the DTO.
+     */
     @MemberOrder(sequence = "500.2")
     public Object act(
 
-            // PARAM 0
             @ParameterLayout(
-                    named = MixinConstants.FILENAME_PROPERTY_NAME,
-                    describedAs = MixinConstants.FILENAME_PROPERTY_DESCRIPTION)
+                    named = DtoMixinConstants.FILENAME_PROPERTY_NAME,
+                    describedAs = DtoMixinConstants.FILENAME_PROPERTY_DESCRIPTION)
             final String fileName,
 
-            // PARAM 1
             final IsisSchemas isisSchemas) {
 
         val schemaMap = jaxbService.toXsd(holder, isisSchemas);
@@ -100,26 +117,18 @@ public class Dto_downloadXsd {
 
     }
 
-    // -- PARAM 0
-
     public String default0Act() {
         return holder.getClass().getName();
     }
 
-    // -- PARAM 1
-
     public IsisSchemas default1Act() {
         return IsisSchemas.IGNORE;
     }
 
-    // -- HELPER
-
     private static String zipEntryNameFor(final String namespaceUri) {
         return namespaceUri + ".xsd";
     }
 
-    // -- DEPENDENCIES
-
     @Inject MessageService messageService;
     @Inject JaxbService jaxbService;
 }
diff --git a/commons/src/main/java/org/apache/isis/commons/having/HasUniqueId.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/LayoutMixinConstants.java
similarity index 74%
copy from commons/src/main/java/org/apache/isis/commons/having/HasUniqueId.java
copy to api/applib/src/main/java/org/apache/isis/applib/mixins/layout/LayoutMixinConstants.java
index 305a35d..564adf7 100644
--- a/commons/src/main/java/org/apache/isis/commons/having/HasUniqueId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/LayoutMixinConstants.java
@@ -16,19 +16,17 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.having;
-
-import java.util.UUID;
+package org.apache.isis.applib.mixins.layout;
 
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 
 /**
- * @since 2.0 {@index}
+ * @since 1.x {@index}
  */
-public interface HasUniqueId {
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class LayoutMixinConstants {
 
-    /**
-     * A unique identifier (a GUID).
-     */
-    UUID getUniqueId();
 
+    public static final String METADATA_LAYOUT_GROUPNAME = "metadata";
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_downloadLayoutXml.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_downloadLayoutXml.java
index 44da4f2..39b05ab 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_downloadLayoutXml.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_downloadLayoutXml.java
@@ -26,7 +26,7 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.dto.DtoMixinConstants;
 import org.apache.isis.applib.services.layout.LayoutService;
 import org.apache.isis.applib.services.layout.Style;
 import org.apache.isis.applib.value.Clob;
@@ -36,6 +36,8 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
+ * Provides a mixin to download the layout XML for any domain object.
+ *
  * @since 1.x {@index}
  */
 @Action(
@@ -55,11 +57,11 @@ public class Object_downloadLayoutXml {
 
     private final Object holder;
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.1")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.1")
     public Object act(
             @ParameterLayout(
-                    named = MixinConstants.FILENAME_PROPERTY_NAME,
-                    describedAs = MixinConstants.FILENAME_PROPERTY_DESCRIPTION)
+                    named = DtoMixinConstants.FILENAME_PROPERTY_NAME,
+                    describedAs = DtoMixinConstants.FILENAME_PROPERTY_DESCRIPTION)
             final String fileName,
             final Style style) {
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java
index 27ce79f..281d9ff 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java
@@ -27,7 +27,6 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.mixins.MixinConstants;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.value.LocalResourcePath;
 
@@ -35,6 +34,9 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
+ * Provides the ability to navigate to the corresponding URL of this domain
+ * object in the REST API provided by the <i>Restful Objects</i> viewer.
+ *
  * @since 1.x {@index}
  */
 @Action(
@@ -54,7 +56,7 @@ public class Object_openRestApi {
 
     private final Object holder;
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "750.1")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "750.1")
     public LocalResourcePath act() {
         val bookmark = bookmarkService.bookmarkForElseThrow(holder);
         val objType = bookmark.getObjectType();
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
index 6e2ccd9..e95b307 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
@@ -25,12 +25,15 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.mixins.MixinConstants;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 
 import lombok.RequiredArgsConstructor;
 
 /**
+ *  Provides the ability to discard the current internal metamodel data for
+ *  the domain class of the rendered object, and recreate from code and other
+ *  sources (most notably, layout XML data).
+ *
  * @since 1.x {@index}
  */
 @Action(
@@ -50,7 +53,7 @@ public class Object_rebuildMetamodel {
 
     private final Object holder;
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.1")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.1")
     public Object act() {
         metaModelService.rebuild(holder.getClass());
         return holder;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java
index 74e95fb..65b2d82 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java
@@ -28,7 +28,8 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.dto.DtoMixinConstants;
+import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.metamodel.Config;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
@@ -59,13 +60,13 @@ public class Object_downloadMetamodelXml {
     public static class ActionDomainEvent
     extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_downloadMetamodelXml> {}
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2")
     public Object act(
 
             // PARAM 0
             @ParameterLayout(
-                    named = MixinConstants.FILENAME_PROPERTY_NAME,
-                    describedAs = MixinConstants.FILENAME_PROPERTY_DESCRIPTION)
+                    named = DtoMixinConstants.FILENAME_PROPERTY_NAME,
+                    describedAs = DtoMixinConstants.FILENAME_PROPERTY_DESCRIPTION)
             final String fileName) {
 
         val pkg = holder.getClass().getPackage().getName();
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectIdentifier.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectIdentifier.java
index 1f3d329..59dd462 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectIdentifier.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectIdentifier.java
@@ -24,7 +24,7 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.commons.internal.base._Strings;
@@ -49,7 +49,7 @@ public class Object_objectIdentifier {
     public static class ActionDomainEvent
     extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_objectIdentifier> {}
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2")
     public String prop() {
         val bookmark = bookmarkService.bookmarkForElseThrow(this.holder);
         val sort = mmService.sortOf(bookmark, MetaModelService.Mode.RELAXED);
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectType.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectType.java
index c2d2742..d67b983 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectType.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectType.java
@@ -24,7 +24,7 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 
 import lombok.RequiredArgsConstructor;
@@ -45,7 +45,7 @@ public class Object_objectType {
     public static class ActionDomainEvent
     extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_objectType> {}
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.1")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.1")
     public String prop() {
         val bookmark = bookmarkService.bookmarkForElseThrow(this.holder);
         return bookmark.getObjectType();
diff --git a/commons/src/main/java/org/apache/isis/commons/having/HasUsername.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/security/HasUsername.java
similarity index 63%
rename from commons/src/main/java/org/apache/isis/commons/having/HasUsername.java
rename to api/applib/src/main/java/org/apache/isis/applib/mixins/security/HasUsername.java
index 5b03ac0..5e0bb2c 100644
--- a/commons/src/main/java/org/apache/isis/commons/having/HasUsername.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/security/HasUsername.java
@@ -16,22 +16,30 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.having;
+package org.apache.isis.applib.mixins.security;
+
+import org.apache.isis.applib.mixins.updates.OnUpdatedBy;
 
 /**
- * Mix-in interface for objects (usually created by service implementations) that are be persistable,
- * and so can be associated with a username, usually of the user that has performed some operation.
+ * Allows domain objects that were created, updated or are otherwise associated
+ * with a named user to act as a mixee in order that other modules may
+ * contribute behaviour.
  *
  * <p>
- * Other services can then use this username as a means to contributed actions/collections to render such additional
- * information relating to the activities of the user.
- * 
+ *     The {@link OnUpdatedBy}
+ *     interface is for entities to be automatically updated by the
+ *     framework when persisted.
+ * </p>
+ *
+ * @see OnUpdatedBy
+ *
  * @since 2.0 {@index}
  */
 public interface HasUsername {
 
     /**
-     * The user that created this object.
+     * The user that created, updated or is otherwise associated with this
+     * object.
      */
     String getUsername();
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java
similarity index 84%
rename from api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord.java
rename to api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java
index be89e37..6000935 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services;
+package org.apache.isis.applib.mixins.system;
 
 import java.sql.Timestamp;
 import java.util.UUID;
@@ -27,17 +27,23 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.commons.having.HasUniqueId;
-import org.apache.isis.commons.having.HasUsername;
+import org.apache.isis.applib.mixins.security.HasUsername;
 
 
 /**
- * An abstraction of some sort of recorded change to a domain object: commands, audit entries or published events.
- * 
+ * Allows domain objects that represents some sort of recorded change to a
+ * domain object (commands, audit entries, published interactions) to act
+ * as a mixee in order that other modules can contribute behaviour.
+ *
  * @since 2.0 {@index}
  */
-public interface DomainChangeRecord extends HasUniqueId, HasUsername {
+public interface DomainChangeRecord extends HasInteractionId, HasUsername {
 
+    /**
+     * Enumerates the different types of changes recognised.
+     *
+     * @since 2.0 {@index}
+     */
     enum ChangeType {
         COMMAND,
         AUDIT_ENTRY,
@@ -58,11 +64,13 @@ public interface DomainChangeRecord extends HasUniqueId, HasUsername {
 
 
     /**
-     * The unique identifier (a GUID) of the transaction in which this change occurred.
+     * The unique identifier (a GUID) of the
+     * {@link org.apache.isis.applib.services.iactn.Interaction} within which
+     * this change occurred.
      */
     @Property
     @MemberOrder(name="Identifiers",sequence = "50")
-    UUID getUniqueId();
+    UUID getInteractionId();
 
 
     /**
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord_openTargetObject.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord_openTargetObject.java
similarity index 90%
rename from api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord_openTargetObject.java
rename to api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord_openTargetObject.java
index dc506dc..470947d 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord_openTargetObject.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord_openTargetObject.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services;
+package org.apache.isis.applib.mixins.system;
 
 import javax.inject.Inject;
 
@@ -28,6 +28,14 @@ import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 
+/**
+ * Provides the ability to navigate to a domain object from a
+ * {@link DomainChangeRecord} which only holds the domain object by way of
+ * a {@link DomainChangeRecord#getTarget() target}
+ * {@link org.apache.isis.applib.services.bookmark.Bookmark}.
+ *
+ * @since v2.0 {@index}
+ */
 @Action(
         semantics = SemanticsOf.SAFE
         , associateWith = "target"
diff --git a/commons/src/main/java/org/apache/isis/commons/having/HasUniqueId.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionId.java
similarity index 73%
rename from commons/src/main/java/org/apache/isis/commons/having/HasUniqueId.java
rename to api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionId.java
index 305a35d..c58acb0 100644
--- a/commons/src/main/java/org/apache/isis/commons/having/HasUniqueId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionId.java
@@ -16,19 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.having;
+package org.apache.isis.applib.mixins.system;
 
 import java.util.UUID;
 
+import org.apache.isis.applib.services.iactn.Interaction;
+
 
 /**
+ * Allows domain objects that represent or are associated with a system
+ * {@link Interaction} to act as a mixee in order that other modules can
+ * contribute behaviour.
+ *
  * @since 2.0 {@index}
  */
-public interface HasUniqueId {
+public interface HasInteractionId {
 
     /**
      * A unique identifier (a GUID).
      */
-    UUID getUniqueId();
+    UUID getInteractionId();
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java
new file mode 100644
index 0000000..5bea48a
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java
@@ -0,0 +1,60 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.mixins.system;
+
+import org.apache.isis.applib.mixins.system.HasInteractionId;
+import org.apache.isis.applib.services.iactn.SequenceType;
+import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.schema.ixn.v2.InteractionDto;
+import org.apache.isis.schema.ixn.v2.MemberExecutionDto;
+
+/**
+ * Extends {@link HasInteractionId} to add a strictly monotonically increasing
+ * sequence number so that each transaction within the overall
+ * {@link org.apache.isis.applib.services.iactn.Interaction} has its own
+ * unique identity.
+ *
+ * <p>
+ *     In the vast majority of cases there will only be a single transaction
+ *     per {@link org.apache.isis.applib.services.iactn.Interaction}, but this
+ *     isn't <i>always</i> the case as domain objects may on occasion need to
+ *     explicitly manage transaction boundaries using
+ *     {@link org.apache.isis.applib.services.xactn.TransactionService}.
+ * </p>
+ *
+ * @since 2.0 {@index}
+ */
+public interface HasTransactionId extends HasInteractionId {
+
+    /**
+     * Holds the sequence number uniquely identifying the transaction number
+     * within the overall
+     * {@link org.apache.isis.applib.services.iactn.Interaction}.
+     *
+     * <p>
+     *     The values in this sequence are ultimately obtained from the non-API
+     *     method
+     *     {@link org.apache.isis.applib.services.iactn.Interaction#next(SequenceType)},
+     *     with a {@link SequenceType} of {@link SequenceType#TRANSACTION}.
+     * </p>
+     *
+     * @return
+     */
+    int getSequence();
+}
diff --git a/commons/src/main/java/org/apache/isis/commons/having/HasUpdatedAt.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/updates/OnUpdatedAt.java
similarity index 77%
rename from commons/src/main/java/org/apache/isis/commons/having/HasUpdatedAt.java
rename to api/applib/src/main/java/org/apache/isis/applib/mixins/updates/OnUpdatedAt.java
index 98054e1..db5a4cf 100644
--- a/commons/src/main/java/org/apache/isis/commons/having/HasUpdatedAt.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/updates/OnUpdatedAt.java
@@ -16,12 +16,16 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.having;
+package org.apache.isis.applib.mixins.updates;
 
 /**
+ * Allows domain entities that keep track of when they were updated to be called
+ * by the (framework-provided) <code>TimestampService</code> whenever modified
+ * in a transaction.
+ *
  * @since 2.0 {@index}
  */
-public interface HasUpdatedAt {
+public interface OnUpdatedAt {
 
     void setUpdatedAt(java.sql.Timestamp updatedAt);
 
diff --git a/commons/src/main/java/org/apache/isis/commons/having/HasUpdatedBy.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/updates/OnUpdatedBy.java
similarity index 59%
copy from commons/src/main/java/org/apache/isis/commons/having/HasUpdatedBy.java
copy to api/applib/src/main/java/org/apache/isis/applib/mixins/updates/OnUpdatedBy.java
index fe95f0b..f8aebe9 100644
--- a/commons/src/main/java/org/apache/isis/commons/having/HasUpdatedBy.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/updates/OnUpdatedBy.java
@@ -16,12 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.having;
+package org.apache.isis.applib.mixins.updates;
 
 /**
+ * Allows domain entities that reference the user that updated them to be called
+ * by the (framework-provided) <code>TimestampService</code> whenever modified
+ * in a transaction with the current user.
+ *
+ * <p>
+ *     Note that this interface defines only a setter.  The
+ *     {@link org.apache.isis.applib.mixins.security.HasUsername} can be used
+ *     to expose this user name, allowing other modules to contribute behaviour
+ *     to that mixee.
+ * </p>
+ *
+ * @see org.apache.isis.applib.mixins.security.HasUsername
+ *
  * @since 2.0 {@index}
  */
-public interface HasUpdatedBy {
+public interface OnUpdatedBy {
 
     void setUpdatedBy(String updatedBy);
 
diff --git a/commons/src/main/java/org/apache/isis/commons/having/HasUpdatedBy.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/updates/OnUpdatedByAndAt.java
similarity index 76%
rename from commons/src/main/java/org/apache/isis/commons/having/HasUpdatedBy.java
rename to api/applib/src/main/java/org/apache/isis/applib/mixins/updates/OnUpdatedByAndAt.java
index fe95f0b..577afd8 100644
--- a/commons/src/main/java/org/apache/isis/commons/having/HasUpdatedBy.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/updates/OnUpdatedByAndAt.java
@@ -16,13 +16,16 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.having;
+package org.apache.isis.applib.mixins.updates;
 
 /**
- * @since 2.0 {@index}
+ * Combines {@link OnUpdatedBy} and {@link OnUpdatedAt}, as these are often
+ * implemented together.
+ *
+ * @since 2.x {@index}
  */
-public interface HasUpdatedBy {
-
-    void setUpdatedBy(String updatedBy);
-
+public interface OnUpdatedByAndAt
+extends
+        OnUpdatedBy,
+        OnUpdatedAt {
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java b/api/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java
deleted file mode 100644
index 485ba6c..0000000
--- a/api/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java
+++ /dev/null
@@ -1,42 +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 org.apache.isis.applib.services;
-
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-import org.apache.isis.commons.having.HasUniqueId;
-import org.apache.isis.schema.ixn.v2.InteractionDto;
-import org.apache.isis.schema.ixn.v2.MemberExecutionDto;
-
-/**
- * Extends {@link HasUniqueId}, where the {@link HasUniqueId#getUniqueId()} is interpreted as an
- * interaction (cf {@link InteractionDto}) that has at least one member execution (cf
- * {@link MemberExecutionDto}) 
- * and may (by way of {@link WrapperFactory}) contain
- * several.
- *
- * <p>
- *     Examples could include SPI services that persist published events and status messages.
- * </p>
- * 
- * @since 2.0 {@index}
- */
-public interface RepresentsInteractionMemberExecution extends HasUniqueId {
-
-    int getSequence();
-}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
index 5f4b385..a508a3f 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
@@ -23,6 +23,7 @@ import java.util.UUID;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.commanddto.HasCommandDto;
 import org.apache.isis.applib.services.iactn.Execution;
@@ -31,8 +32,7 @@ import org.apache.isis.applib.services.publishing.spi.CommandSubscriber;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.wrapper.control.AsyncControl;
 import org.apache.isis.commons.functional.Result;
-import org.apache.isis.commons.having.HasUniqueId;
-import org.apache.isis.commons.having.HasUsername;
+import org.apache.isis.applib.mixins.security.HasUsername;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 
 import lombok.Getter;
@@ -78,7 +78,7 @@ import lombok.extern.log4j.Log4j2;
 @RequiredArgsConstructor
 @ToString
 @Log4j2
-public class Command implements HasUniqueId, HasUsername, HasCommandDto {
+public class Command implements HasInteractionId, HasUsername, HasCommandDto {
 
     /**
      * Unique identifier for the command.
@@ -89,7 +89,7 @@ public class Command implements HasUniqueId, HasUsername, HasCommandDto {
      */
     @Getter
         (onMethod_ = {@Override})
-    private final UUID uniqueId;
+    private final UUID interactionId;
 
     /**
      * The user that created the command.
@@ -128,7 +128,7 @@ public class Command implements HasUniqueId, HasUsername, HasCommandDto {
      *     expected to have {@link CommandDto#getTransactionId()},
      *     {@link CommandDto#getUser()}, {@link CommandDto#getTimestamp()},
      *     {@link CommandDto#getTargets()} and {@link CommandDto#getMember()}
-     *     to be populated.  The {@link #getUniqueId()}, {@link #getUsername()},
+     *     to be populated.  The {@link #getInteractionId()}, {@link #getUsername()},
      *     {@link #getTimestamp()} and {@link #getTarget()} are all derived
      *     from the provided {@link CommandDto}.
      * </p>
@@ -267,7 +267,7 @@ public class Command implements HasUniqueId, HasUsername, HasCommandDto {
             Command.this.commandDto = commandDto;
 
             // even though redundant, but must ensure commandUniqueId == dtoUniqueId
-            val commandUniqueId = Command.this.getUniqueId().toString();
+            val commandUniqueId = Command.this.getInteractionId().toString();
             val dtoUniqueId = commandDto.getTransactionId();
 
             if(!commandUniqueId.equals(dtoUniqueId)) {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
index ea68a44..f953a37 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
@@ -19,18 +19,10 @@
 
 package org.apache.isis.applib.services.iactn;
 
-import java.util.List;
 import java.util.UUID;
 
-import org.apache.isis.applib.events.domain.ActionDomainEvent;
-import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.commons.having.HasUniqueId;
-import org.apache.isis.schema.common.v2.InteractionType;
-import org.apache.isis.schema.ixn.v2.ActionInvocationDto;
-import org.apache.isis.schema.ixn.v2.PropertyEditDto;
-
-import lombok.Getter;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 
 /**
  * Represents an action invocation or property modification, resulting in some
@@ -60,11 +52,11 @@ import lombok.Getter;
  *
  * @since 1.x revised for 2.0 {@index}
  */
-public interface Interaction extends HasUniqueId {
+public interface Interaction extends HasInteractionId {
 
     /**
      * The unique identifier of this interaction (inherited from
-     * {@link HasUniqueId})
+     * {@link HasInteractionId})
      *
      * <p>
      *     This can be used to correlate audit records and transactions
@@ -74,7 +66,7 @@ public interface Interaction extends HasUniqueId {
      * @return
      */
     @Override
-    UUID getUniqueId();
+    UUID getInteractionId();
 
     /**
      * Represents the <i>intention</i> to perform this interaction.
@@ -94,12 +86,9 @@ public interface Interaction extends HasUniqueId {
 
 
     /**
-     * Generates numbers in a named sequence.
-     *
-     * The name of the sequence can be arbitrary, though note that the framework also uses this capability to
-     * generate sequence numbers corresponding to the sequences enumerated by the {@link Sequence} enum.
+     * Framework use only: generates numbers for a named sequence type.
      */
-    int next(final String sequenceId);
+    int next(final SequenceType sequenceType);
 
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Sequence.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Sequence.java
deleted file mode 100644
index 5f1de87..0000000
--- a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Sequence.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.apache.isis.applib.services.iactn;
-
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-
-/**
- * Enumerates the different reasons why multiple occurrences of a certain type might occur within a single
- * (top-level) interaction.
- *
- * @since 1.x {@index}
- */
-public enum Sequence {
-
-    /**
-     * Each interaction is either an action invocation or a property edit.  There could be multiple of these,
-     * typically as the result of a nested calls using the {@link WrapperFactory}.  Another reason is
-     * support for bulk action invocations within a single transaction.
-     */
-    INTERACTION,
-
-    /**
-     * For objects: multiple such could be dirtied and thus published as separate events.  For actions
-     * invocations/property edits : multiple sub-invocations could occur if sub-invocations are made through the
-     * {@link WrapperFactory}.
-     */
-    PUBLISHED_EVENT,
-
-    /**
-     * There may be multiple transactions within a given interaction.
-     */
-    TRANSACTION,
-    ;
-
-    public String id() {
-        return Sequence.class.getName() + "#" + name();
-    }
-}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/SequenceType.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/SequenceType.java
new file mode 100644
index 0000000..64baa23
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/SequenceType.java
@@ -0,0 +1,53 @@
+package org.apache.isis.applib.services.iactn;
+
+import org.apache.isis.applib.services.wrapper.WrapperFactory;
+
+/**
+ * Enumerates the different reasons for a sequence of occurrences within a
+ * single (top-level) {@link Interaction}.
+ *
+ * @since 1.x {@index}
+ */
+public enum SequenceType {
+
+    /**
+     * Numbers the executions (an action invocation or property edit) within
+     * a given {@link Interaction}.
+     *
+     * <p>
+     * Each {@link Interaction} is initiated by an execution of action
+     * invocation or a property edit.  Thereafter there could be multiple
+     * other executions as the result of nested calls using the
+     * {@link WrapperFactory}.
+     * </p>
+     *
+     * <p>
+     * Another possible reason is support for bulk action invocations.
+     * </p>
+     *
+     * @see Interaction
+     * @see WrapperFactory
+     */
+    EXECUTION,
+
+
+    /**
+     * Numbers the transactions within a given {@link Interaction}.
+     *
+     * <p>
+     * Each {@link Interaction} is executed within the context of a transaction, but
+     * the (occasionally) the transaction may be committed and a new one
+     * started as the result of the domain object using the
+     * {@link org.apache.isis.applib.services.xactn.TransactionService}.
+     * </p>
+     *
+     * @see Interaction
+     * @see org.apache.isis.applib.services.xactn.TransactionService
+     */
+    TRANSACTION,
+    ;
+
+    public String id() {
+        return SequenceType.class.getName() + "#" + name();
+    }
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java
index ff772de..4f62685 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java
@@ -21,8 +21,8 @@ package org.apache.isis.applib.services.publishing.spi;
 import java.sql.Timestamp;
 import java.util.UUID;
 
-import org.apache.isis.commons.having.HasUniqueId;
-import org.apache.isis.commons.having.HasUsername;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
+import org.apache.isis.applib.mixins.security.HasUsername;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 
 /**
@@ -37,15 +37,15 @@ import org.apache.isis.schema.chg.v2.ChangesDto;
  * @since 2.0 {@index}
  */
 public interface EntityChanges
-        extends HasUniqueId,
+        extends HasInteractionId,
                 HasUsername {
 
     /**
-     * inherited from {@link HasUniqueId}, correlates back to the unique
+     * inherited from {@link HasInteractionId}, correlates back to the unique
      * identifier of the transaction in which these objects were changed.
      */
     @Override
-    UUID getUniqueId();
+    UUID getInteractionId();
 
     /**
      * Inherited from {@link HasUsername}, is the user that initiated the
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java b/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
index 7a749fc..b28e128 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
@@ -20,7 +20,8 @@ package org.apache.isis.applib.services.xactn;
 
 import java.util.UUID;
 
-import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
+import org.apache.isis.applib.mixins.system.HasTransactionId;
 
 import lombok.Value;
 
@@ -31,7 +32,7 @@ import lombok.Value;
  * <p>
  *     The transaction and
  *     {@link org.apache.isis.applib.services.iactn.Interaction} are associated
- *     by the {@link #getUniqueId() uniqueId}.
+ *     by the {@link #getInteractionId() uniqueId}.
  * </p>
  *
  * <p>
@@ -41,17 +42,27 @@ import lombok.Value;
  * @since 2.0 {@index}
  */
 @Value(staticConstructor = "of")
-public class TransactionId implements HasUniqueId {
+public class TransactionId implements HasTransactionId {
 
     /**
      * The unique identifier of the outer
      * {@link org.apache.isis.applib.services.iactn.Interaction}.
+     *
+     * <p>
+     *     Together with {@link #getSequence()}, this makes up the
+     *     implementation of {@link org.apache.isis.applib.mixins.system.HasTransactionId}
+     * </p>
      */
-    UUID uniqueId;
+    UUID interactionId;
 
     /**
      * Identifies the transaction (there could be multiple) within the
      * {@link org.apache.isis.applib.services.iactn.Interaction}.
+     *
+     * <p>
+     *     Together with {@link #getInteractionId()}, this makes up the
+     *     implementation of {@link org.apache.isis.applib.mixins.system.HasTransactionId}
+     * </p>
      */
     int sequence;
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java b/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
index ace463d..3e12a27 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
@@ -198,7 +198,7 @@ public final class InteractionDtoUtils {
             final Execution<?, ?> execution,
             final MemberExecutionDto executionDto) {
         final Interaction interaction = execution.getInteraction();
-        final String transactionId = interaction.getUniqueId().toString();
+        final String transactionId = interaction.getInteractionId().toString();
 
         return InteractionDtoUtils.newInteractionDto(transactionId, executionDto);
     }
diff --git a/commons/src/main/java/org/apache/isis/commons/having/HasUpdatedByAndAt.java b/commons/src/main/java/org/apache/isis/commons/having/HasUpdatedByAndAt.java
deleted file mode 100644
index 8ad59ef..0000000
--- a/commons/src/main/java/org/apache/isis/commons/having/HasUpdatedByAndAt.java
+++ /dev/null
@@ -1,25 +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 org.apache.isis.commons.having;
-
-public interface HasUpdatedByAndAt 
-extends 
-    HasUpdatedBy, 
-    HasUpdatedAt {
-}
diff --git a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionSession.java b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionSession.java
index 43d6aca..386855b 100644
--- a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionSession.java
+++ b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionSession.java
@@ -24,8 +24,8 @@ import java.util.Map;
 import java.util.UUID;
 import java.util.function.Function;
 
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.applib.services.iactn.Interaction;
-import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.commons.ToString;
@@ -51,10 +51,10 @@ import lombok.Setter;
  * @see InteractionFactory
  */
 public class InteractionSession
-implements HasUniqueId {
+implements HasInteractionId {
 
     @Getter private final long startedAtSystemNanos;
-    
+
     /**
      * The {@link MessageBroker} that holds messages for this session.
      */
@@ -64,7 +64,7 @@ implements HasUniqueId {
      * The {@link MetaModelContext} that holds services for this session.
      */
     @Getter private final MetaModelContext metaModelContext;
-    
+
     public InteractionSession(
             @NonNull final MetaModelContext mmc) {
 
@@ -89,21 +89,21 @@ implements HasUniqueId {
 //    }
 
     // -- INTERACTION ON CLOSE HANDLER
-    
+
     @Setter private Runnable onClose;
-    
+
     // -- INTERACTION SCOPED SESSION ATTRIBUTE
-    
+
     private Map<Class<?>, Object> attributes = null;
     private boolean closed = false;
-	
+
 	@Getter private Interaction interaction;
 
     /** add type specific session data */
     public <T> T putAttribute(Class<? super T> type, T value) {
         return _Casts.uncheckedCast(attributes().put(type, value));
     }
-    
+
     /** conditionally add type specific session data */
     public <T> T computeAttributeIfAbsent(Class<? super T> type, Function<Class<?>, ? extends T> mappingFunction) {
         return _Casts.uncheckedCast(attributes().computeIfAbsent(type, mappingFunction));
@@ -115,14 +115,14 @@ implements HasUniqueId {
                 ? _Casts.uncheckedCast(attributes.get(type))
                 : null;
     }
-    
+
     /** remove type specific session data */
     public void removeAttribute(Class<?> type) {
         if(attributes!=null) {
             attributes.remove(type);
         }
     }
-    
+
     /** Do not use, is called by the framework internally. */
     public void close() {
         if(onClose!=null) {
@@ -132,7 +132,7 @@ implements HasUniqueId {
         attributes = null;
         closed = true;
     }
-    
+
 //    /**
 //     * Copies all attributes to the target session.
 //     * @param target
@@ -143,24 +143,24 @@ implements HasUniqueId {
 //        }
 //        target.attributes().putAll(attributes);
 //    }
-    
+
     private Map<Class<?>, Object> attributes() {
         if(closed) {
             throw _Exceptions.illegalState(
                     "IsisInteraction was already closed, cannot access UserData any longer.");
         }
-        return (attributes==null) 
-                ? attributes = new HashMap<>() 
+        return (attributes==null)
+                ? attributes = new HashMap<>()
                 : attributes;
     }
-    
+
     @Override
-    public UUID getUniqueId() {
-        return getInteraction().getUniqueId();
+    public UUID getInteractionId() {
+        return getInteraction().getInteractionId();
     }
-    
+
     // -- TO STRING
-    
+
     @Override
     public String toString() {
         final ToString asString = new ToString(this);
diff --git a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java
index e5024c1..5481416 100644
--- a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java
+++ b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.iactn.ActionInvocation;
 import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.iactn.PropertyEdit;
+import org.apache.isis.applib.services.iactn.SequenceType;
 import org.apache.isis.applib.services.metrics.MetricsService;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -51,8 +52,8 @@ public class IsisInteraction implements InternalInteraction {
     private final Command command;
 
     @Override
-    public UUID getUniqueId() {
-        return command.getUniqueId();
+    public UUID getInteractionId() {
+        return command.getInteractionId();
     }
 
     private final List<Execution<?,?>> executionGraphs = _Lists.newArrayList();
@@ -199,17 +200,16 @@ public class IsisInteraction implements InternalInteraction {
         currentExecution = newExecution;
     }
 
-    private final Map<String, LongAdder> maxBySequence = _Maps.newHashMap();
+    private final Map<SequenceType, LongAdder> maxBySequence = _Maps.newHashMap();
 
     @Override
-    public int next(final String sequenceId) {
-
-        final LongAdder adder = maxBySequence.computeIfAbsent(sequenceId, this::newAdder);
+    public int next(final SequenceType sequenceType) {
+        final LongAdder adder = maxBySequence.computeIfAbsent(sequenceType, this::newAdder);
         adder.increment();
         return adder.intValue();
     }
 
-    private LongAdder newAdder(String ignore) {
+    private LongAdder newAdder(final SequenceType ignore) {
         final LongAdder adder = new LongAdder();
         adder.decrement();
         return adder;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index e26d837..9af7fff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -23,7 +23,7 @@ import java.util.Optional;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
-import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -59,9 +59,9 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        
+
         val actionIfAny = processMethodContext.synthesizeOnMethodOrMixinType(Action.class);
-        
+
         processExplicit(processMethodContext, actionIfAny);
         processInvocation(processMethodContext, actionIfAny);
         processHidden(processMethodContext, actionIfAny);
@@ -76,7 +76,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
         processTypeOf(processMethodContext, actionIfAny);
         processAssociateWith(processMethodContext, actionIfAny);
-        
+
         processFileAccept(processMethodContext, actionIfAny);
     }
 
@@ -107,7 +107,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             //
             // Set up ActionDomainEventFacet, which will act as the hiding/disabling/validating advisor
             //
-            
+
 
             // search for @Action(domainEvent=...), else use the default event type
             val actionDomainEventFacet =
@@ -154,7 +154,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
     private static Class<? extends ActionDomainEvent<?>> defaultFromDomainObjectIfRequired(
             final ObjectSpecification typeSpec,
             final Class<? extends ActionDomainEvent<?>> actionDomainEventType) {
-        
+
         if (actionDomainEventType == ActionDomainEvent.Default.class) {
             val typeFromDomainObject =
                     typeSpec.getFacet(ActionDomainEventDefaultFacetForDomainObjectAnnotation.class);
@@ -179,7 +179,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         // search for @Action(restrictTo=...)
         val facet = PrototypeFacetForActionAnnotation.create(actionIfAny, facetedMethod,
                 ()->super.getSystemEnvironment().getDeploymentType());
-        
+
         super.addFacet(facet);
     }
 
@@ -193,7 +193,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
     }
 
     void processCommandPublishing(
-            final ProcessMethodContext processMethodContext, 
+            final ProcessMethodContext processMethodContext,
             final Optional<Action> actionIfAny) {
 
         val facetedMethod = processMethodContext.getFacetHolder();
@@ -201,8 +201,8 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         //
         // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
         //
-        if(HasUniqueId.class.isAssignableFrom(processMethodContext.getCls())) {
-            // do not install on any implementation of HasUniqueId
+        if(HasInteractionId.class.isAssignableFrom(processMethodContext.getCls())) {
+            // do not install on any implementation of HasInteractionId
             // (ie commands, audit entries, published events).
             return;
         }
@@ -215,17 +215,17 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
     }
 
     void processExecutionPublishing(
-            final ProcessMethodContext processMethodContext, 
+            final ProcessMethodContext processMethodContext,
             final Optional<Action> actionIfAny) {
 
         val facetedMethod = processMethodContext.getFacetHolder();
-        
+
         //
         // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
         // and for commands, see above
         //
-        if(HasUniqueId.class.isAssignableFrom(processMethodContext.getCls())) {
-            // do not install on any implementation of HasUniqueId
+        if(HasInteractionId.class.isAssignableFrom(processMethodContext.getCls())) {
+            // do not install on any implementation of HasInteractionId
             // (ie commands, audit entries, published events).
             return;
         }
@@ -278,10 +278,10 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
                         new AssociatedWithFacetForActionAnnotation(associateWith, facetedMethod));
             }
         });
-        
+
 
     }
-    
+
     void processFileAccept(final ProcessMethodContext processMethodContext, Optional<Action> actionIfAny) {
 
         val holder = processMethodContext.getFacetHolder();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index a19bad6..43ded7d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -40,7 +40,7 @@ import org.apache.isis.applib.events.lifecycle.ObjectRemovingEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatedEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatingEvent;
 import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Multimaps;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
@@ -135,8 +135,8 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
         // this rule originally implemented only in AuditableFacetFromConfigurationFactory
         // but think should apply in general
         //
-        if(HasUniqueId.class.isAssignableFrom(cls)) {
-            // do not install on any implementation of HasUniqueId
+        if(HasInteractionId.class.isAssignableFrom(cls)) {
+            // do not install on any implementation of HasInteractionId
             // (ie commands, audit entries, published events).
             return;
         }
@@ -295,7 +295,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
 
             val mixinFacet = MixinFacetForDomainObjectAnnotation
                     .create(mixinDomainObjectIfAny, cls, facetHolder, getServiceInjector(), mixinTypeValidator);
-            
+
             super.addFacet(mixinFacet);
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index 57f46f1..fe2ded9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -27,7 +27,7 @@ import javax.validation.constraints.Pattern;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
-import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -242,8 +242,8 @@ implements MetaModelRefiner {
         //
         // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
         //
-        if(HasUniqueId.class.isAssignableFrom(processMethodContext.getCls())) {
-            // do not install on any implementation of HasUniqueId
+        if(HasInteractionId.class.isAssignableFrom(processMethodContext.getCls())) {
+            // do not install on any implementation of HasInteractionId
             // (ie commands, audit entries, published events).
             return;
         }
@@ -277,8 +277,8 @@ implements MetaModelRefiner {
         // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
         // and for commands, see above
         //
-        if(HasUniqueId.class.isAssignableFrom(processMethodContext.getCls())) {
-            // do not install on any implementation of HasUniqueId
+        if(HasInteractionId.class.isAssignableFrom(processMethodContext.getCls())) {
+            // do not install on any implementation of HasInteractionId
             // (ie commands, audit entries, published events).
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java
index 4c37567..2efd0dc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java
@@ -29,7 +29,7 @@ import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.graph.tree.TreeNode;
 import org.apache.isis.applib.graph.tree.TreePath;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 import org.apache.isis.applib.services.metamodel.Config;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -57,7 +57,7 @@ public class Object_inspectMetamodel {
     public static class ActionDomainEvent
     extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_inspectMetamodel> {}
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2.1")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2.1")
     public Object act() {
 
         val pkg = holder.getClass().getPackage().getName();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
index 3d28ceb..a85d73d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
@@ -50,7 +50,7 @@ import org.apache.isis.applib.layout.grid.bootstrap3.BS3Row;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3Tab;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3TabGroup;
 import org.apache.isis.applib.layout.grid.bootstrap3.Size;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -86,7 +86,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
 
     public static final String TNS = "http://isis.apache.org/applib/layout/grid/bootstrap3";
     public static final String SCHEMA_LOCATION = "http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd";
-    
+
     @Inject private GridReaderUsingJaxb gridReader;
 
     public GridSystemServiceBS3() {
@@ -188,15 +188,15 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
         if(!gridModelIfValid.isPresent()) { // only present if valid
             return false;
         }
-        val gridModel = gridModelIfValid.get(); 
-        
+        val gridModel = gridModelIfValid.get();
+
         val layoutDataFactory = LayoutDataFactory.of(objectSpec);
 
-        // * surplus ... those defined in the grid model but not available with the meta-model 
-        // * missing ... those available with the meta-model but missing in the grid-model 
+        // * surplus ... those defined in the grid model but not available with the meta-model
+        // * missing ... those available with the meta-model but missing in the grid-model
         // (missing properties will be added to the first field-set of the specified column)
-        
-        val surplusAndMissingPropertyIds = 
+
+        val surplusAndMissingPropertyIds =
                 surplusAndMissing(propertyLayoutDataById.keySet(),  oneToOneAssociationById.keySet());
         val surplusPropertyIds = surplusAndMissingPropertyIds.getSurplus();
         val missingPropertyIds = surplusAndMissingPropertyIds.getMissing();
@@ -206,10 +206,10 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
         }
 
         // catalog which associations are bound to an existing field-set
-        // so that (below) we can determine which missing property IDs are not unbound vs 
+        // so that (below) we can determine which missing property IDs are not unbound vs
         // which should be included in the field-set that they are bound to.
         val boundAssociationIdsByFieldSetId = _Maps.<String, Set<String>>newHashMap();
-        
+
         for (val fieldSet : gridModel.fieldSets()) {
             val fieldSetId = fieldSet.getId();
             Set<String> boundAssociationIds = boundAssociationIdsByFieldSetId.get(fieldSetId);
@@ -234,7 +234,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
                     Set<String> boundAssociationIds =
                             boundAssociationIdsByFieldSetId.computeIfAbsent(id, k -> _Sets.newLinkedHashSet());
                     boundAssociationIds.add(otoa.getId());
-                } else if(id.equals(MixinConstants.METADATA_LAYOUT_GROUPNAME)) {
+                } else if(id.equals(LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME)) {
                     unboundMetadataContributingIds.add(otoa.getId());
                 }
             }
@@ -252,7 +252,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
             for (final String fieldSetId : boundAssociationIdsByFieldSetId.keySet()) {
                 val fieldSet = gridModel.getFieldSet(fieldSetId);
                 val associationIds = boundAssociationIdsByFieldSetId.get(fieldSetId);
-                
+
                 val associations1To1Ids =
                         associationIds.stream()
                         .map(oneToOneAssociationById::get)
@@ -262,7 +262,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
                         .collect(Collectors.toList());
 
                 addPropertiesTo(
-                        fieldSet, 
+                        fieldSet,
                         associations1To1Ids,
                         layoutDataFactory::createPropertyLayoutData,
                         propertyLayoutDataById::put);
@@ -292,26 +292,26 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
         }
 
         if(!missingCollectionIds.isEmpty()) {
-            final List<OneToManyAssociation> sortedCollections = 
+            final List<OneToManyAssociation> sortedCollections =
                     _Lists.map(missingCollectionIds, oneToManyAssociationById::get);
-            
+
             sortedCollections.sort(ObjectMember.Comparators.byMemberOrderSequence());
 
-            final List<String> sortedMissingCollectionIds = 
+            final List<String> sortedMissingCollectionIds =
                     _Lists.map(sortedCollections, ObjectAssociation::getId);
 
             final BS3TabGroup bs3TabGroup = gridModel.getTabGroupForUnreferencedCollectionsRef();
             if(bs3TabGroup != null) {
                 addCollectionsTo(
-                        bs3TabGroup, 
-                        sortedMissingCollectionIds, 
+                        bs3TabGroup,
+                        sortedMissingCollectionIds,
                         objectSpec,
                         layoutDataFactory::createCollectionLayoutData);
             } else {
                 final BS3Col bs3Col = gridModel.getColForUnreferencedCollectionsRef();
                 if(bs3Col != null) {
                     addCollectionsTo(
-                        bs3Col, 
+                        bs3Col,
                         sortedMissingCollectionIds,
                         layoutDataFactory::createCollectionLayoutData,
                         collectionLayoutDataById::put);
@@ -324,12 +324,12 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
                 surplusAndMissing(actionLayoutDataById.keySet(), objectActionById.keySet());
         val surplusActionIds = surplusAndMissingActionIds.getSurplus();
         val possiblyMissingActionIds = surplusAndMissingActionIds.getMissing();
-        
+
         final List<String> associatedActionIds = _Lists.newArrayList();
 
-        final List<ObjectAction> sortedPossiblyMissingActions = 
+        final List<ObjectAction> sortedPossiblyMissingActions =
                 _Lists.map(possiblyMissingActionIds, objectActionById::get);
-        
+
         sortedPossiblyMissingActions.sort(ObjectMember.Comparators.byMemberOrderSequence());
 
         final List<String> sortedPossiblyMissingActionIds =
@@ -421,14 +421,14 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
             if(bs3Col != null) {
                 addActionsTo(
                         bs3Col,
-                        missingActionIds, 
+                        missingActionIds,
                         layoutDataFactory::createActionLayoutData,
                         actionLayoutDataById::put);
             } else {
                 final FieldSet fieldSet = gridModel.getFieldSetForUnreferencedActionsRef();
                 if(fieldSet != null) {
                     addActionsTo(
-                            fieldSet, 
+                            fieldSet,
                             missingActionIds,
                             layoutDataFactory::createActionLayoutData,
                             actionLayoutDataById::put);
@@ -444,12 +444,12 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
             final Collection<String> propertyIds,
             final Function<String, PropertyLayoutData> layoutFactory,
             final BiConsumer<String, PropertyLayoutData> onNewLayoutData) {
-        
+
         final Set<String> existingIds =
                 stream(fieldSet.getProperties())
                 .map(PropertyLayoutData::getId)
                 .collect(Collectors.toSet());
-        
+
         for (final String propertyId : propertyIds) {
             if(existingIds.contains(propertyId)) {
                 continue;
@@ -466,7 +466,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
             final Collection<String> collectionIds,
             final Function<String, CollectionLayoutData> layoutFactory,
             final BiConsumer<String, CollectionLayoutData> onNewLayoutData) {
-        
+
         for (final String collectionId : collectionIds) {
             val collectionLayoutData = layoutFactory.apply(collectionId);
             tabRowCol.getCollections().add(collectionLayoutData);
@@ -479,7 +479,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
             final Collection<String> collectionIds,
             final ObjectSpecification objectSpec,
             final Function<String, CollectionLayoutData> layoutFactory) {
-        
+
         for (final String collectionId : collectionIds) {
             final BS3Tab bs3Tab = new BS3Tab();
             bs3Tab.setName(objectSpec.getAssociationElseFail(collectionId).getName());
@@ -506,7 +506,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
             final Collection<String> actionIds,
             final Function<String, ActionLayoutData> layoutFactory,
             final BiConsumer<String, ActionLayoutData> onNewLayoutData) {
-        
+
         for (String actionId : actionIds) {
             val actionLayoutData = layoutFactory.apply(actionId);
             addActionTo(bs3Col, actionLayoutData);
@@ -519,7 +519,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
             final Collection<String> actionIds,
             final Function<String, ActionLayoutData> layoutFactory,
             final BiConsumer<String, ActionLayoutData> onNewLayoutData) {
-        
+
         for (String actionId : actionIds) {
             val actionLayoutData = layoutFactory.apply(actionId);
             addActionTo(fieldSet, actionLayoutData);
@@ -530,7 +530,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
     private void addActionTo(
             final ActionLayoutDataOwner owner,
             final ActionLayoutData actionLayoutData) {
-        
+
         List<ActionLayoutData> actions = owner.getActions();
         if(actions == null) {
             owner.setActions(actions = _Lists.newArrayList());
@@ -547,7 +547,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
         return Character.toLowerCase(c) + str.substring(1).replaceAll("\\s+", "");
     }
 
-        
+
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index fc96481..9fd36d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -57,11 +57,11 @@ import org.apache.isis.schema.cmd.v2.CommandDto;
 import lombok.NonNull;
 import lombok.val;
 
-public abstract class ObjectMemberAbstract 
+public abstract class ObjectMemberAbstract
 implements ObjectMember, HasMetaModelContext, HasFacetHolder {
 
     protected ObjectSpecification specificationOf(final Class<?> type) {
-        return type != null 
+        return type != null
                 ? getMetaModelContext().getSpecificationLoader().loadSpecification(type)
                 : null;
     }
@@ -181,7 +181,7 @@ implements ObjectMember, HasMetaModelContext, HasFacetHolder {
             final ManagedObject target,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
-        
+
         val visibilityContext = createVisibleInteractionContext(target, interactionInitiatedBy, where);
         return InteractionUtils.isVisibleResult(this, visibilityContext).createConsent();
     }
@@ -211,7 +211,7 @@ implements ObjectMember, HasMetaModelContext, HasFacetHolder {
             final ManagedObject target,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
-        
+
         val usabilityContext = createUsableInteractionContext(target, interactionInitiatedBy, where);
         return InteractionUtils.isUsableResult(this, usabilityContext).createConsent();
     }
@@ -245,7 +245,7 @@ implements ObjectMember, HasMetaModelContext, HasFacetHolder {
     ManagedObject mixinAdapterFor(
             @NonNull final Class<?> mixinType,
             @NonNull final ManagedObject mixedInAdapter) {
-        
+
         val spec = getSpecificationLoader().loadSpecification(mixinType);
         val mixinFacet = spec.getFacet(MixinFacet.class);
         val mixinPojo = mixinFacet.instantiate(Objects.requireNonNull(mixedInAdapter.getPojo()));
@@ -325,7 +325,7 @@ implements ObjectMember, HasMetaModelContext, HasFacetHolder {
             // guard here to prevent subsequent mixin actions from
             // trampling over the command's DTO
         } else {
-            val dto = commandDtoFactory.apply(command.getUniqueId());
+            val dto = commandDtoFactory.apply(command.getInteractionId());
             command.updater().setCommandDto(dto);
         }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
index da0ce28..b393e80 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
@@ -27,7 +27,7 @@ import org.jmock.auto.Mock;
 import org.junit.After;
 import org.junit.Before;
 
-import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.core.metamodel.facets.object.domainobject.domainevents.ActionDomainEventDefaultFacetForDomainObjectAnnotation;
@@ -54,7 +54,7 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         context.checking(new Expectations() {{
             allowing(mockSpecificationLoader).loadSpecification(cls);
             will(returnValue(mockTypeSpec));
-            
+
             allowing(mockSpecificationLoader).loadSpecification(returnType);
             will(returnValue(mockReturnTypeSpec));
         }});
@@ -78,7 +78,7 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         }});
 
         actionMethod = findMethod(Customer.class, "someAction");
-        
+
     }
 
     @Override
@@ -92,18 +92,18 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         }
     }
 
-    class SomeHasUniqueId implements HasUniqueId {
+    class SomeHasInteractionId implements HasInteractionId {
         public void someAction() {
         }
 
         @Override
-        public UUID getUniqueId() {
+        public UUID getInteractionId() {
             return null;
         }
 
 
     }
-    
+
     void allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy value) {
         val config = metaModelContext.getConfiguration();
         config.getApplib().getAnnotation().getAction().setExecutionPublishing(value);
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java
index 0cbea06..0fcaa0f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java
@@ -42,14 +42,14 @@ public class ActionAnnotationFacetFactoryTest_commandPublishing extends ActionAn
         val actionIfAny = processMethodContext.synthesizeOnMethod(Action.class);
         facetFactory.processCommandPublishing(processMethodContext, actionIfAny);
     }
-    
+
     @Test
     public void given_HasUniqueId_thenIgnored() {
         // given
-        final Method actionMethod = findMethod(SomeHasUniqueId.class, "someAction");
+        final Method actionMethod = findMethod(SomeHasInteractionId.class, "someAction");
 
         // when
-        processCommandPublishing(facetFactory, new ProcessMethodContext(SomeHasUniqueId.class, null, actionMethod, mockMethodRemover, facetedMethod));
+        processCommandPublishing(facetFactory, new ProcessMethodContext(SomeHasInteractionId.class, null, actionMethod, mockMethodRemover, facetedMethod));
 
         // then
         assertFalse(CommandPublishingFacet.isPublishingEnabled(facetedMethod));
@@ -114,4 +114,4 @@ public class ActionAnnotationFacetFactoryTest_commandPublishing extends ActionAn
 
 
 
-}
\ No newline at end of file
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java
index 8af3a67..b822d5b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java
@@ -46,13 +46,13 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
         val actionIfAny = processMethodContext.synthesizeOnMethod(Action.class);
         facetFactory.processExecutionPublishing(processMethodContext, actionIfAny);
     }
-    
+
     @Test
     public void given_HasUniqueId_thenIgnored() {
 
-        final Method actionMethod = findMethod(SomeHasUniqueId.class, "someAction");
+        final Method actionMethod = findMethod(SomeHasInteractionId.class, "someAction");
 
-        processExecutionPublishing(facetFactory, new ProcessMethodContext(SomeHasUniqueId.class, null, actionMethod, mockMethodRemover, facetedMethod));
+        processExecutionPublishing(facetFactory, new ProcessMethodContext(SomeHasInteractionId.class, null, actionMethod, mockMethodRemover, facetedMethod));
 
         assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod));
 
@@ -304,4 +304,4 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
         assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod));
     }
 
-}
\ No newline at end of file
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index b83261b..00e485f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -34,7 +34,7 @@ import static org.junit.Assert.assertFalse;
 
 import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.metamodel.facets.EditingObjectsConfiguration;
 import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
@@ -81,22 +81,22 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
     }
 
 
-    class SomeHasUniqueId implements HasUniqueId {
+    class SomeHasInteractionId implements HasInteractionId {
 
         @Override
-        public UUID getUniqueId() {
+        public UUID getInteractionId() {
             return null;
         }
 
     }
-    
+
     void allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy value) {
         if(value!=null) {
             val config = super.metaModelContext.getConfiguration();
             config.getApplib().getAnnotation().getDomainObject().setEntityChangePublishing(value);
         }
     }
-    
+
     void allowingObjectsEditingToReturn(EditingObjectsConfiguration value) {
         if(value!=null) {
             final IsisConfiguration config = super.metaModelContext.getConfiguration();
@@ -127,7 +127,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy.ALL);
 
-            facetFactory.processEntityChangePublishing(new ProcessClassContext(HasUniqueId.class, mockMethodRemover, facetHolder));
+            facetFactory.processEntityChangePublishing(new ProcessClassContext(HasInteractionId.class, mockMethodRemover, facetHolder));
 
             final Facet facet = facetHolder.getFacet(EntityChangePublishingFacet.class);
             Assert.assertNull(facet);
@@ -157,7 +157,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
                 facetFactory.process(new ProcessClassContext(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder));
 
                 final EntityChangePublishingFacet facet = facetHolder.getFacet(EntityChangePublishingFacet.class);
-                Assert.assertNull(facet); 
+                Assert.assertNull(facet);
 
                 expectNoMethodsRemoved();
             }
@@ -292,7 +292,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
         public void whenDomainObjectAndAutoCompleteRepository() {
 
             facetFactory.process(new ProcessClassContext(
-                    CustomerWithDomainObjectAndAutoCompleteRepository.class, mockMethodRemover, facetHolder)); 
+                    CustomerWithDomainObjectAndAutoCompleteRepository.class, mockMethodRemover, facetHolder));
 
             final Facet facet = facetHolder.getFacet(AutoCompleteFacet.class);
             Assert.assertNotNull(facet);
@@ -503,7 +503,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
                         CustomerWithDomainObjectAndEditingSetToEnabled.class, mockMethodRemover, facetHolder));
 
                 final ImmutableFacet facet = facetHolder.getFacet(ImmutableFacet.class);
-                Assert.assertNull(facet); 
+                Assert.assertNull(facet);
 
                 expectNoMethodsRemoved();
             }
@@ -662,4 +662,4 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoFactoryDefault.java
index 6c98a3c..5d3247c 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoFactoryDefault.java
@@ -34,7 +34,7 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.InteractionContext;
-import org.apache.isis.applib.services.iactn.Sequence;
+import org.apache.isis.applib.services.iactn.SequenceType;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
@@ -83,7 +83,7 @@ public class InteractionDtoFactoryDefault implements InteractionDtoFactory {
                 "action's parameter count and provided argument count must match");
 
         final Interaction interaction = interactionContextProvider.get().currentInteractionElseFail();
-        final int nextEventSequence = interaction.next(Sequence.INTERACTION.id());
+        final int nextEventSequence = interaction.next(SequenceType.EXECUTION);
 
         final Bookmark targetBookmark = targetAdapter.getRootOid()
                 .map(RootOid::asBookmark)
@@ -128,7 +128,7 @@ public class InteractionDtoFactoryDefault implements InteractionDtoFactory {
 
         final Interaction interaction = interactionContextProvider.get().currentInteractionElseFail();
 
-        final int nextEventSequence = interaction.next(Sequence.INTERACTION.id());
+        final int nextEventSequence = interaction.next(SequenceType.EXECUTION);
 
         final Bookmark targetBookmark = targetAdapter.getRootOid()
                 .map(RootOid::asBookmark)
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
index a2f8454..220c8d0 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
@@ -116,7 +116,7 @@ import lombok.val;
 @Qualifier("Default")
 //@Log4j2
 public class WrapperFactoryDefault implements WrapperFactory {
-    
+
     @Inject InteractionTracker interactionTracker;
     @Inject FactoryService factoryService;
     @Inject MetaModelContext metaModelContext;
@@ -130,13 +130,13 @@ public class WrapperFactoryDefault implements WrapperFactory {
     private final Map<Class<? extends InteractionEvent>, InteractionEventDispatcher>
         dispatchersByEventClass = new HashMap<>();
     private ProxyContextHandler proxyContextHandler;
-    
+
     @PostConstruct
     public void init() {
 
         val proxyCreator = new ProxyCreator(proxyFactoryService);
         proxyContextHandler = new ProxyContextHandler(proxyCreator);
-        
+
         putDispatcher(ObjectTitleEvent.class, InteractionListener::objectTitleRead);
         putDispatcher(PropertyVisibilityEvent.class, InteractionListener::propertyVisible);
         putDispatcher(PropertyUsabilityEvent.class, InteractionListener::propertyUsable);
@@ -156,7 +156,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
     }
 
     // -- WRAPPING
-    
+
     @Override
     public <T> T wrap(
             final @NonNull T domainObject) {
@@ -167,8 +167,8 @@ public class WrapperFactoryDefault implements WrapperFactory {
     public <T> T wrap(
             final @NonNull T domainObject,
             final @NonNull SyncControl syncControl) {
-        
-        // skip in support of JUnit tests, that don't inject a SpecificationLoader 
+
+        // skip in support of JUnit tests, that don't inject a SpecificationLoader
         if(specificationLoader!=null) {
             val spec = specificationLoader.loadSpecification(domainObject.getClass());
             if(spec.isMixin()) {
@@ -176,12 +176,12 @@ public class WrapperFactoryDefault implements WrapperFactory {
                         + "use WrapperFactory.wrapMixin(...) instead");
             }
         }
-        
+
         if (isWrapper(domainObject)) {
             val wrapperObject = (WrappingObject) domainObject;
             val executionMode = wrapperObject.__isis_executionModes();
             if(equivalent(executionMode, syncControl.getExecutionModes())) {
-                return domainObject;    
+                return domainObject;
             }
             val underlyingDomainObject = wrapperObject.__isis_wrapped();
             return _Casts.uncheckedCast(createProxy(underlyingDomainObject, syncControl));
@@ -199,29 +199,29 @@ public class WrapperFactoryDefault implements WrapperFactory {
 
     @Override
     public <T> T wrapMixin(
-            final @NonNull Class<T> mixinClass, 
+            final @NonNull Class<T> mixinClass,
             final @NonNull Object mixee) {
         return wrapMixin(mixinClass, mixee, control());
     }
 
     @Override
     public <T> T wrapMixin(
-            final @NonNull Class<T> mixinClass, 
-            final @NonNull Object mixee, 
+            final @NonNull Class<T> mixinClass,
+            final @NonNull Object mixee,
             final @NonNull SyncControl syncControl) {
-        
+
         T mixin = factoryService.mixin(mixinClass, mixee);
-        
+
         if (isWrapper(mixee)) {
             val wrapperObject = (WrappingObject) mixee;
             val executionMode = wrapperObject.__isis_executionModes();
             if(equivalent(executionMode, syncControl.getExecutionModes())) {
-                return mixin;    
+                return mixin;
             }
             val underlyingMixee = wrapperObject.__isis_wrapped();
             return _Casts.uncheckedCast(createMixinProxy(underlyingMixee, mixin, syncControl));
         }
-        
+
         return createMixinProxy(mixee, mixin, syncControl);
     }
 
@@ -229,7 +229,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
         val objAdapter = adaptAndGuardAgainstWrappingNotSupported(domainObject);
         return proxyContextHandler.proxy(domainObject, objAdapter, syncControl);
     }
-    
+
     protected <T> T createMixinProxy(Object mixee, T mixin, SyncControl syncControl) {
         val mixeeAdapter = adaptAndGuardAgainstWrappingNotSupported(mixee);
         val mixinAdapter = adaptAndGuardAgainstWrappingNotSupported(mixin);
@@ -264,7 +264,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
             throw _Exceptions.illegalArgument("cannot wrap a mixin instance directly, "
                     + "use WrapperFactory.asyncWrapMixin(...) instead");
         }
-        
+
         val proxyFactory = proxyFactoryService
                 .<T>factory(_Casts.uncheckedCast(domainObject.getClass()), WrappingObject.class);
 
@@ -281,7 +281,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
                             domainObject,
                             null, // mixeeAdapter ignored
                             targetAdapter,
-                            control().withNoExecute(), 
+                            control().withNoExecute(),
                             null);
                     doih.invoke(null, method, args);
                 }
@@ -304,15 +304,15 @@ public class WrapperFactoryDefault implements WrapperFactory {
 
     @Override
     public <T, R> T asyncWrapMixin(
-            final @NonNull Class<T> mixinClass, 
-            final @NonNull Object mixee, 
+            final @NonNull Class<T> mixinClass,
+            final @NonNull Object mixee,
             final @NonNull AsyncControl<R> asyncControl) {
 
         T mixin = factoryService.mixin(mixinClass, mixee);
-        
+
         val mixeeAdapter = adaptAndGuardAgainstWrappingNotSupported(mixee);
         val mixinAdapter = adaptAndGuardAgainstWrappingNotSupported(mixin);
-        
+
         val proxyFactory = proxyFactoryService
                 .factory(mixinClass, new Class[]{WrappingObject.class}, new Class[]{mixee.getClass()});
 
@@ -329,8 +329,8 @@ public class WrapperFactoryDefault implements WrapperFactory {
                     val doih = new DomainObjectInvocationHandler<>(
                             mixin,
                             mixeeAdapter,
-                            mixinAdapter, 
-                            control().withNoExecute(), 
+                            mixinAdapter,
+                            control().withNoExecute(),
                             null);
                     doih.invoke(null, method, args);
                 }
@@ -357,7 +357,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
         val interactionLayer = currentInteractionLayer();
         val asyncAuth = authFrom(asyncControl, interactionLayer.getAuthentication());
         val command = interactionContextProvider.get().currentInteractionElseFail().getCommand();
-        val commandUniqueId = command.getUniqueId();
+        val commandUniqueId = command.getInteractionId();
 
         val targetAdapter = memberAndTarget.getTarget();
         val method = memberAndTarget.getMethod();
@@ -389,10 +389,10 @@ public class WrapperFactoryDefault implements WrapperFactory {
         val executorService = asyncControl.getExecutorService();
         val future = executorService.submit(
                 new ExecCommand<R>(
-                        asyncAuth, 
-                        commandDto, 
-                        asyncControl.getReturnType(), 
-                        command, 
+                        asyncAuth,
+                        commandDto,
+                        asyncControl.getReturnType(),
+                        command,
                         serviceInjector)
         );
 
@@ -402,14 +402,14 @@ public class WrapperFactoryDefault implements WrapperFactory {
     }
 
     private MemberAndTarget memberAndTargetForRegular(
-            final Method method, 
+            final Method method,
             final ManagedObject targetAdapter) {
-        
+
         val objectMember = targetAdapter.getSpecification().getMember(method).orElse(null);
         if(objectMember == null) {
             return MemberAndTarget.notFound();
         }
-        
+
         if (objectMember instanceof OneToOneAssociation) {
             return MemberAndTarget.foundProperty((OneToOneAssociation) objectMember, targetAdapter, method);
         }
@@ -423,8 +423,8 @@ public class WrapperFactoryDefault implements WrapperFactory {
     }
 
     private <T> MemberAndTarget memberAndTargetForMixin(
-            final Method method, 
-            final T mixedIn, 
+            final Method method,
+            final T mixedIn,
             final ManagedObject mixinAdapter) {
 
         val mixinMember = mixinAdapter.getSpecification().getMember(method).orElse(null);
@@ -454,9 +454,9 @@ public class WrapperFactoryDefault implements WrapperFactory {
     }
 
     private static <R> Authentication authFrom(AsyncControl<R> asyncControl, Authentication auth) {
-    
+
         val executionContext = auth.getExecutionContext();
-        
+
         val newExecutionContext = ExecutionContext.builder()
         .clock(Optional.ofNullable(asyncControl.getClock())
                 .orElseGet(executionContext::getClock))
@@ -467,9 +467,9 @@ public class WrapperFactoryDefault implements WrapperFactory {
         .user(Optional.ofNullable(asyncControl.getUser())
                 .orElseGet(executionContext::getUser))
         .build();
-        
+
         return auth.withExecutionContext(newExecutionContext);
-        
+
     }
 
     @Data
@@ -540,27 +540,27 @@ public class WrapperFactoryDefault implements WrapperFactory {
         }
         dispatcher.dispatch(interactionEvent);
     }
-    
+
     // -- HELPER - CHECK WRAPPING SUPPORTED
-    
+
     private ManagedObject adaptAndGuardAgainstWrappingNotSupported(
             final @NonNull Object domainObject) {
-        
+
         val adapter = currentObjectManager().adapt(domainObject);
         if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)
                 || !adapter.getSpecification().getBeanSort().isWrappingSupported()) {
-            throw _Exceptions.illegalArgument("Cannot wrap an object of type %s", 
+            throw _Exceptions.illegalArgument("Cannot wrap an object of type %s",
                     domainObject.getClass().getName());
         }
-        
+
         return adapter;
     }
-    
+
     // -- HELPER - SETUP
-    
+
     private <T extends InteractionEvent> void putDispatcher(
             Class<T> type, BiConsumer<InteractionListener, T> onDispatch) {
-    
+
         val dispatcher = new InteractionEventDispatcherTypeSafe<T>() {
             @Override
             public void dispatchTypeSafe(T interactionEvent) {
@@ -569,7 +569,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
                 }
             }
         };
-        
+
         dispatchersByEventClass.put(type, dispatcher);
     }
 
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
index a223383..d09894a 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
@@ -28,7 +28,7 @@ import javax.annotation.Nullable;
 import org.apache.isis.applib.annotation.EntityChangeKind;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
 import org.apache.isis.applib.services.iactn.Interaction;
-import org.apache.isis.applib.services.iactn.Sequence;
+import org.apache.isis.applib.services.iactn.SequenceType;
 import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -84,8 +84,8 @@ class ChangingEntitiesFactory {
             final int numberEntityPropertiesModified,
             final Map<ManagedObject, EntityChangeKind> changeKindByEnlistedAdapter) {
 
-        val uniqueId = interaction.getUniqueId();
-        final int nextEventSequence = interaction.next(Sequence.INTERACTION.id());
+        val uniqueId = interaction.getInteractionId();
+        final int nextEventSequence = interaction.next(SequenceType.TRANSACTION);
 
         return new SimpleChangingEntities(
                     uniqueId, nextEventSequence,
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityPropertyChangeFactory.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityPropertyChangeFactory.java
index c00aab0..2a8a554 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityPropertyChangeFactory.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityPropertyChangeFactory.java
@@ -30,13 +30,13 @@ import lombok.experimental.UtilityClass;
 
 @UtilityClass
 class EntityPropertyChangeFactory {
-    
+
     public static EntityPropertyChange createEntityPropertyChange(
             final java.sql.Timestamp timestamp,
             final String user,
             final TransactionId txId,
             final PropertyChangeRecord propertyChangeRecord) {
-        
+
         val adapterAndProperty = propertyChangeRecord.getAdapterAndProperty();
         val spec = adapterAndProperty.getAdapter().getSpecification();
 
@@ -50,11 +50,11 @@ class EntityPropertyChangeFactory {
 
         final String targetClass = CommandUtil.targetClassNameFor(spec);
 
-        final UUID transactionId = txId.getUniqueId();
+        final UUID transactionId = txId.getInteractionId();
         final int sequence = txId.getSequence();
 
         return EntityPropertyChange.of(
-                transactionId, sequence, targetClass, target, 
+                transactionId, sequence, targetClass, target,
                 memberId, propertyId, preValue, postValue, user, timestamp);
     }
 }
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/SimpleChangingEntities.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/SimpleChangingEntities.java
index 5d55742..30c87d3 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/SimpleChangingEntities.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/SimpleChangingEntities.java
@@ -23,7 +23,7 @@ import java.sql.Timestamp;
 import java.util.UUID;
 import java.util.function.Supplier;
 
-import org.apache.isis.applib.services.RepresentsInteractionMemberExecution;
+import org.apache.isis.applib.mixins.system.HasTransactionId;
 import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 
@@ -34,7 +34,7 @@ import lombok.ToString;
  * Captures which objects were created, updated or deleted in the course of a transaction.
  */
 @ToString
-class SimpleChangingEntities implements EntityChanges, RepresentsInteractionMemberExecution {
+class SimpleChangingEntities implements EntityChanges, HasTransactionId {
 
     private UUID transactionUuid;
     private final int sequence;
@@ -43,7 +43,7 @@ class SimpleChangingEntities implements EntityChanges, RepresentsInteractionMemb
     private final int numberEntitiesLoaded;
     private final int numberEntityPropertiesModified;
     private final Supplier<ChangesDto> changesDtoSupplier;
-    
+
     public SimpleChangingEntities(
             final @NonNull UUID transactionUuid,
             final int sequence,
@@ -63,7 +63,7 @@ class SimpleChangingEntities implements EntityChanges, RepresentsInteractionMemb
     }
 
     @Override
-    public UUID getUniqueId() {
+    public UUID getInteractionId() {
         return transactionUuid;
     }
 
@@ -73,7 +73,7 @@ class SimpleChangingEntities implements EntityChanges, RepresentsInteractionMemb
     }
 
     /**
-     * The date/time at which this set of enlisted objects was created 
+     * The date/time at which this set of enlisted objects was created
      * (approx the completion time of the transaction).
      */
     @Override
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/events/TimestampService.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/events/TimestampService.java
index 4039b19..1a0ad38 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/events/TimestampService.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/events/TimestampService.java
@@ -30,8 +30,8 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.user.UserService;
-import org.apache.isis.commons.having.HasUpdatedAt;
-import org.apache.isis.commons.having.HasUpdatedBy;
+import org.apache.isis.applib.mixins.updates.OnUpdatedAt;
+import org.apache.isis.applib.mixins.updates.OnUpdatedBy;
 
 import lombok.val;
 
@@ -44,20 +44,20 @@ public class TimestampService {
 
     @Inject private UserService userService;
     @Inject private ClockService clockService;
-    
+
     @EventListener(PreStoreEvent.class)
     public void onPreStore(PreStoreEvent event) {
 
         val persistableObject = event.getPersistableObject();
 
-        if(persistableObject instanceof HasUpdatedBy) {
-            ((HasUpdatedBy)persistableObject).setUpdatedBy(userService.currentUserNameElseNobody());
+        if(persistableObject instanceof OnUpdatedBy) {
+            ((OnUpdatedBy)persistableObject).setUpdatedBy(userService.currentUserNameElseNobody());
         }
-        
-        if(persistableObject instanceof HasUpdatedAt) {
-            ((HasUpdatedAt)persistableObject).setUpdatedAt(clockService.getClock().javaSqlTimestamp());
+
+        if(persistableObject instanceof OnUpdatedAt) {
+            ((OnUpdatedAt)persistableObject).setUpdatedAt(clockService.getClock().javaSqlTimestamp());
         }
-        
+
     }
 
-}
\ No newline at end of file
+}
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/CommandSubscriberForJdo.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/CommandSubscriberForJdo.java
index 2d6c84a..61dd61a 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/CommandSubscriberForJdo.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/CommandSubscriberForJdo.java
@@ -57,7 +57,7 @@ public class CommandSubscriberForJdo implements CommandSubscriber {
         }
 
         val existingCommandJdoIfAny =
-                commandJdoRepository.findByUniqueId(command.getUniqueId());
+                commandJdoRepository.findByUniqueId(command.getInteractionId());
         if(existingCommandJdoIfAny.isPresent()) {
             if(log.isDebugEnabled()) {
                 // this isn't expected to happen ... we just log the fact if it does
@@ -75,7 +75,7 @@ public class CommandSubscriberForJdo implements CommandSubscriber {
             val parentJdo =
                 parent != null
                     ? commandJdoRepository
-                        .findByUniqueId(parent.getUniqueId())
+                        .findByUniqueId(parent.getInteractionId())
                         .orElse(null)
                     : null;
             commandJdo.setParent(parentJdo);
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java
index 2b64bc2..dfaf900 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java
@@ -43,7 +43,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
-import org.apache.isis.applib.services.DomainChangeRecord;
+import org.apache.isis.applib.mixins.system.DomainChangeRecord;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandOutcomeHandler;
@@ -117,7 +117,7 @@ import lombok.val;
             value="SELECT "
                     + "FROM org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo "
                     + "WHERE target == :target "
-                    + "&& timestamp >= :from " 
+                    + "&& timestamp >= :from "
                     + "&& timestamp <= :to "
                     + "ORDER BY this.timestamp DESC"),
     @javax.jdo.annotations.Query(
@@ -144,7 +144,7 @@ import lombok.val;
             name="findByTimestampBetween",
             value="SELECT "
                     + "FROM org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo "
-                    + "WHERE timestamp >= :from " 
+                    + "WHERE timestamp >= :from "
                     + "&&    timestamp <= :to "
                     + "ORDER BY this.timestamp DESC"),
     @javax.jdo.annotations.Query(
@@ -272,8 +272,8 @@ public class CommandJdo
      * @param command
      */
     public CommandJdo(final Command command) {
-        
-        setUniqueIdStr(command.getUniqueId().toString());
+
+        setUniqueIdStr(command.getInteractionId().toString());
         setUsername(command.getUsername());
         setTimestamp(command.getTimestamp());
 
@@ -374,7 +374,7 @@ public class CommandJdo
     @Getter @Setter
     private String uniqueIdStr;
     @Programmatic
-    public UUID getUniqueId() {return UUID.fromString(getUniqueIdStr());}
+    public UUID getInteractionId() {return UUID.fromString(getUniqueIdStr());}
 
 
     public static class UsernameDomainEvent extends PropertyDomainEvent<String> { }
@@ -492,7 +492,7 @@ public class CommandJdo
     public static class DurationDomainEvent extends PropertyDomainEvent<BigDecimal> { }
     /**
      * The number of seconds (to 3 decimal places) that this interaction lasted.
-     * 
+     *
      * <p>
      * Populated only if it has {@link #getCompletedAt() completed}.
      */
@@ -594,7 +594,7 @@ public class CommandJdo
     @Override
     public String toString() {
         return ObjectContracts
-                .toString("uniqueId", CommandJdo::getUniqueId)
+                .toString("uniqueId", CommandJdo::getInteractionId)
                 .thenToString("username", CommandJdo::getUsername)
                 .thenToString("timestamp", CommandJdo::getTimestamp)
                 .thenToString("target", CommandJdo::getTarget)
@@ -631,7 +631,7 @@ public class CommandJdo
                 CommandJdo.this.setResult(resultBookmark.getValue().orElse(null));
                 CommandJdo.this.setException(resultBookmark.getFailure().orElse(null));
             }
-            
+
         };
     }
 
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java
index ba8aa7d..5fa9843 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java
@@ -26,7 +26,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.extensions.commandlog.impl.IsisModuleExtCommandLogImpl;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
@@ -34,7 +34,7 @@ import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
 
 /**
  * This mixin contributes a <tt>command</tt> action to any (non-command) implementation of
- * {@link org.apache.isis.commons.having.HasUniqueId}; that is: audit entries, and published events.  Thus, it
+ * {@link HasInteractionId}; that is: audit entries, and published events.  Thus, it
  * is possible to navigate from the effect back to the cause.
  *
  * @since 2.0 {@index}
@@ -48,9 +48,9 @@ public class HasUniqueId_command {
     public static class ActionDomainEvent
             extends IsisModuleExtCommandLogImpl.ActionDomainEvent<HasUniqueId_command> { }
 
-    private final HasUniqueId hasUniqueId;
-    public HasUniqueId_command(final HasUniqueId hasUniqueId) {
-        this.hasUniqueId = hasUniqueId;
+    private final HasInteractionId hasInteractionId;
+    public HasUniqueId_command(final HasInteractionId hasInteractionId) {
+        this.hasInteractionId = hasInteractionId;
     }
 
 
@@ -63,14 +63,14 @@ public class HasUniqueId_command {
      * {@link Command#getParent() parent} property.
      */
     public boolean hideAct() {
-        return (hasUniqueId instanceof CommandJdo);
+        return (hasInteractionId instanceof CommandJdo);
     }
     public String disableAct() {
         return findCommand() == null ? "No command found for unique Id": null;
     }
 
     private CommandJdo findCommand() {
-        final UUID transactionId = hasUniqueId.getUniqueId();
+        final UUID transactionId = hasInteractionId.getInteractionId();
         return commandServiceRepository
                 .findByUniqueId(transactionId)
                 .orElse(null);
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUsername_recentCommandsByUser.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUsername_recentCommandsByUser.java
index 944f156..8f31362 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUsername_recentCommandsByUser.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUsername_recentCommandsByUser.java
@@ -26,7 +26,7 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.commons.having.HasUsername;
+import org.apache.isis.applib.mixins.security.HasUsername;
 import org.apache.isis.extensions.commandlog.impl.IsisModuleExtCommandLogImpl;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
index 8e68c15..8f7a0c0 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
@@ -27,9 +27,9 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
-import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.extensions.commandlog.impl.IsisModuleExtCommandLogImpl;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
@@ -40,7 +40,7 @@ import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
 
 /**
  * This mixin contributes a <tt>recentCommands</tt> action to any domain object
- * (unless also {@link HasUniqueId} - commands don't themselves have commands).
+ * (unless also {@link HasInteractionId} - commands don't themselves have commands).
  */
 @Action(
     semantics = SemanticsOf.SAFE,
@@ -67,11 +67,11 @@ public class Object_recentCommands {
         return commandServiceRepository.findRecentByTarget(bookmark);
     }
     /**
-     * Hide if the contributee is itself {@link HasUniqueId}
+     * Hide if the contributee is itself {@link HasInteractionId}
      * (commands don't have commands).
      */
     public boolean hideAct() {
-        return (domainObject instanceof HasUniqueId);
+        return (domainObject instanceof HasInteractionId);
     }
 
     @Inject CommandJdoRepository commandServiceRepository;
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java
index d5a1c0b..6f1b820 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java
@@ -87,7 +87,7 @@ public class CommandFetcher {
     private CommandsDto fetchCommands(final CommandJdo previousHwmIfAny)
             throws StatusException {
 
-        final UUID transactionId = previousHwmIfAny != null ? previousHwmIfAny.getUniqueId() : null;
+        final UUID transactionId = previousHwmIfAny != null ? previousHwmIfAny.getInteractionId() : null;
 
         log.debug("finding commands on primary ...");
 
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java
index b0ea9b0..e3403353 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java
@@ -95,7 +95,7 @@ public class ReplicateAndRunCommands implements Callable<SecondaryStatus> {
                     // give up if there was a failure; admin will need to fix issue and retry
                     if (hwm.getReplayState() != null &&
                             hwm.getReplayState().isFailed()) {
-                        log.info("Command {} hit replay error", hwm.getUniqueId());
+                        log.info("Command {} hit replay error", hwm.getInteractionId());
                         return;
                     }
                 } else {
@@ -133,7 +133,7 @@ public class ReplicateAndRunCommands implements Callable<SecondaryStatus> {
 
         commandsToReplay.forEach(commandJdo -> {
 
-            log.info("replaying {}", commandJdo.getUniqueId());
+            log.info("replaying {}", commandJdo.getInteractionId());
 
             //
             // run command
diff --git a/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc b/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc
index 648797e..7f48744 100644
--- a/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc
+++ b/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc
@@ -15,7 +15,7 @@ The module also provides:
 * `AuditingServiceRepository` service to to search for persisted `AuditEntry``s.
 None of its actions are visible in the user interface (they are all `@Programmatic`).
 
-* `AuditingServiceContributions` which contributes collections to the xref:refguide:applib-cm:roles-mixins-contributees/contributee.adoc#HasUniqueId[HasUniqueId] interface.
+* `AuditingServiceContributions` which contributes collections to the xref:refguide:applib-classes:mixins.adoc[HasUniqueId] interface.
 This will therefore display all audit entries that occurred in a given request/transaction, in other words whenever a command, a published event or another audit entry is displayed.
 
 These services can be activated by updating the `pom.xml` and updating the `AppManifest#getModules()` method.
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUser.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUser.java
index 6e321e5..279a432 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUser.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUser.java
@@ -20,7 +20,7 @@ package org.apache.isis.extensions.secman.api.user;
 
 import java.util.Set;
 
-import org.apache.isis.commons.having.HasUsername;
+import org.apache.isis.applib.mixins.security.HasUsername;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValueSet;
 import org.apache.isis.extensions.secman.api.role.ApplicationRole;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
index 0222e45..efa462d 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
@@ -24,7 +24,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.i18n.TranslatableString;
-import org.apache.isis.commons.having.HasUsername;
+import org.apache.isis.applib.mixins.security.HasUsername;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
 import org.apache.isis.extensions.secman.api.user.ApplicationUserRepository;
@@ -39,12 +39,12 @@ import lombok.RequiredArgsConstructor;
 public class HasUsername_open {
 
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
-    
+
     private final HasUsername target;
 
     public static class ActionDomainEvent extends IsisModuleExtSecmanApi.ActionDomainEvent<HasUsername_open> {}
 
-    
+
     @MemberOrder(name = "User", sequence = "1") // associate with a 'User' property (if any)
     public ApplicationUser act() {
         if (target == null || target.getUsername() == null) {
@@ -52,7 +52,7 @@ public class HasUsername_open {
         }
         return applicationUserRepository.findByUsername(target.getUsername()).orElse(null);
     }
-    
+
     public boolean hideAct() {
         return target instanceof ApplicationUser;
     }
@@ -63,6 +63,6 @@ public class HasUsername_open {
         }
         return null;
     }
-    
+
 
 }
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.java
index 06ac469..87413d1 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.java
@@ -27,11 +27,20 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 
 import lombok.RequiredArgsConstructor;
 
 /**
+ * Contributes the value of the id (introduced by enhancing) as a property.
+ *
+ * <p>
+ * Only visible if the id can be cast to a long.
+ * </p>
+ *
+ * @see Persistable_datanucleusVersionLong
+ * @see Persistable_datanucleusVersionTimestamp
+ *
  * @since 2.0 {@index}
  */
 @Property(
@@ -49,7 +58,7 @@ public class Persistable_datanucleusIdLong {
     extends org.apache.isis.applib.IsisModuleApplib.PropertyDomainEvent
     <Persistable_datanucleusIdLong, Long> {}
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.1")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.1")
     public Long prop() {
         final Object objectId = JDOHelper.getObjectId(persistable);
         if(objectId instanceof DatastoreId) {
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.java
index d49a3f6..0945867 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.java
@@ -26,11 +26,21 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 
 import lombok.RequiredArgsConstructor;
 
 /**
+ * Contributes the value of the version (introduced by enhancing, and used by
+ * the ORM for optimistic locking) as a property.
+ *
+ * <p>
+ * Only visible if the version can be cast to a long.
+ * </p>
+ *
+ * @see Persistable_datanucleusIdLong
+ * @see Persistable_datanucleusVersionTimestamp
+ *
  * @since 2.0 {@index}
  */
 @Property(
@@ -48,7 +58,7 @@ public class Persistable_datanucleusVersionLong {
     extends org.apache.isis.applib.IsisModuleApplib.PropertyDomainEvent
     <Persistable_datanucleusVersionLong, Long> {}
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.2")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.2")
     public Long prop() {
         final Object version = JDOHelper.getVersion(persistable);
         return version != null && version instanceof Long ? (Long) version : null;
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.java
index e5ff509..d78a54b 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.java
@@ -26,11 +26,21 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 
 import lombok.RequiredArgsConstructor;
 
 /**
+ * Contributes the value of the version (introduced by enhancing, and used by
+ * the ORM for optimistic locking) as a property.
+ *
+ * <p>
+ * Only visible if the version can be cast to a {@link java.sql.Timestamp}.
+ * </p>
+ *
+ * @see Persistable_datanucleusIdLong
+ * @see Persistable_datanucleusVersionLong
+ *
  * @since 2.0 {@index}
  */
 @Property(
@@ -48,7 +58,7 @@ public class Persistable_datanucleusVersionTimestamp {
     extends org.apache.isis.applib.IsisModuleApplib.PropertyDomainEvent
     <Persistable_datanucleusVersionTimestamp, java.sql.Timestamp> {}
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.2")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.2")
     public java.sql.Timestamp prop() {
         final Object version = JDOHelper.getVersion(persistable);
         return version != null && version instanceof java.sql.Timestamp ? (java.sql.Timestamp) version : null;
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.java
index 1c4e684..709e135 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.java
@@ -33,7 +33,7 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.mixins.MixinConstants;
+import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 import org.apache.isis.applib.value.Clob;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.persistence.jdo.applib.services.JdoSupportService;
@@ -41,6 +41,10 @@ import org.apache.isis.persistence.jdo.applib.services.JdoSupportService;
 import lombok.RequiredArgsConstructor;
 
 /**
+ * Provides the ability to download the JDO
+ * <a href="http://www.datanucleus.org/products/datanucleus/jdo/metadata_xml.html">class metadata</a>
+ * as XML.
+ *
  * @since 2.0 {@index}
  */
 @Action(
@@ -61,7 +65,7 @@ public class Persistable_downloadJdoMetadata {
 
     public static class ActionDomainEvent extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Persistable_downloadJdoMetadata> {}
 
-    @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "710.1")
+    @MemberOrder(name = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "710.1")
     public Clob act(
             @ParameterLayout(named = "File name")
             final String fileName) throws JAXBException, IOException {
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/conf/Configuration_headless.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/conf/Configuration_headless.java
index 57bd20f..8a2ffc3 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/conf/Configuration_headless.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/conf/Configuration_headless.java
@@ -67,20 +67,20 @@ public class Configuration_headless {
 
 //      private final Provider<InteractionContext> interactionContextProvider;
 //      private final CommandDispatcher commandDispatcher;
-        
+
         @Override
         public void beforeEnteringTransactionalBoundary(InteractionSession interactionSession) {
-            _Probe.errOut("Interaction HAS_STARTED conversationId=%s", interactionSession.getUniqueId());
+            _Probe.errOut("Interaction HAS_STARTED conversationId=%s", interactionSession.getInteractionId());
             setupCommandCreateIfMissing();
         }
-        
+
         @Override
         public void afterLeavingTransactionalBoundary(InteractionSession interactionSession) {
-            _Probe.errOut("Interaction IS_ENDING conversationId=%s", interactionSession.getUniqueId());
+            _Probe.errOut("Interaction IS_ENDING conversationId=%s", interactionSession.getInteractionId());
         }
-        
+
         public void setupCommandCreateIfMissing() {
-            
+
 //            val interactionContext = interactionContextProvider.get();
 //            @SuppressWarnings("unused")
 //            final Interaction interaction = Optional.ofNullable(interactionContext.getInteraction())
@@ -91,29 +91,29 @@ public class Configuration_headless {
 //                        return newInteraction;
 //                    });
         }
-        
+
     }
-    
+
     @Bean @Singleton
     public PlatformTransactionManager platformTransactionManager() {
         return new PlatformTransactionManager() {
-            
+
             @Override
             public void rollback(TransactionStatus status) throws TransactionException {
             }
-            
+
             @Override
             public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
                 return null;
             }
-            
+
             @Override
             public void commit(TransactionStatus status) throws TransactionException {
             }
         };
     }
-    
-    
+
+
     @Bean @Singleton
     public MetricsService metricsService() {
         return new MetricsService() {
@@ -132,4 +132,4 @@ public class Configuration_headless {
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProductComment.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProductComment.java
index 0406a41..7868c23 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProductComment.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProductComment.java
@@ -27,7 +27,7 @@ import javax.jdo.annotations.PersistenceCapable;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Property;
-import org.apache.isis.commons.having.HasUpdatedByAndAt;
+import org.apache.isis.applib.mixins.updates.OnUpdatedByAndAt;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -36,8 +36,8 @@ import lombok.Setter;
 @DatastoreIdentity(strategy=IdGeneratorStrategy.IDENTITY, column="id")
 @DomainObject(
         objectType = "testdomain.jdo.ProductComment")
-public class JdoProductComment implements HasUpdatedByAndAt {
-    
+public class JdoProductComment implements OnUpdatedByAndAt {
+
     @Property @Column(allowsNull = "false")
     @Getter @Setter private JdoProduct product;
 
@@ -45,12 +45,12 @@ public class JdoProductComment implements HasUpdatedByAndAt {
     @Getter @Setter private String comment;
 
     // -- TIMESTAMPABLE
-    
+
     @Property
     @Getter @Setter private String updatedBy;
-    
+
     @Property
     @Getter @Setter private Timestamp updatedAt;
 
-    
+
 }
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java
index b98ad00..988befe 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java
@@ -30,7 +30,7 @@ import javax.persistence.ManyToOne;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Property;
-import org.apache.isis.commons.having.HasUpdatedByAndAt;
+import org.apache.isis.applib.mixins.updates.OnUpdatedByAndAt;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -38,15 +38,15 @@ import lombok.Setter;
 @Entity
 @DomainObject(
         objectType = "testdomain.jpa.ProductComment")
-public class JpaProductComment implements HasUpdatedByAndAt {
+public class JpaProductComment implements OnUpdatedByAndAt {
 
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Getter @Setter @Column(name = "id")
     private Long id;
-    
+
     // n:1 relation
-    @Property 
+    @Property
     @ManyToOne @JoinColumn(nullable = false)
     private @Getter @Setter JpaProduct product;
 
@@ -54,12 +54,12 @@ public class JpaProductComment implements HasUpdatedByAndAt {
     private @Getter @Setter String comment;
 
     // -- TIMESTAMPABLE
-    
+
     @Property
     private @Getter @Setter String updatedBy;
-    
+
     @Property
     private @Getter @Setter Timestamp updatedAt;
 
-    
+
 }
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/mixins/Object_clearHints.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/mixins/Object_clearHints.java
index 7ea5ee8..06594d3 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/mixins/Object_clearHints.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/mixins/Object_clearHints.java
@@ -32,6 +32,31 @@ import org.apache.isis.viewer.wicket.viewer.services.HintStoreUsingWicketSession
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
+/**
+ * Provides the ability for the end-user to discard these UI hints so that the
+ * object is rendered in its initial state:
+ *
+ * <p>
+ * When a domain object is rendered the end-user can select different tabs,
+ * and for collections can sort the columns, navigate to second pages, or
+ * select different views of collections.
+ * If the user revisits that object, the Wicket viewer (at least) will remember
+ * these hints and render the domain object in the same state.
+ * </p>
+ *
+ * <p>
+ * These rendering hints are also included if the user copies the URL using
+ * the anchor link (to right hand of the object's title).
+ * </p>
+ *
+ * <p>
+ *     This mixin - contributed to <code>java.lang.Object</code> and therefore
+ *     to allo domain objects - provides the ability for the end user to clear
+ *     any hints that might have been set for the domain object being rendered.
+ * </p>
+ *
+ * @see HintStore {@index}
+ */
 @Action(
         domainEvent = Object_clearHints.ActionDomainEvent.class,
         semantics = SemanticsOf.IDEMPOTENT,