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/07/26 10:56:52 UTC

[isis] branch master updated (408875d -> 95b53a9)

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

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


    from 408875d  Merge pull request #685 from apache/ISIS-2820
     new fe53385  ISIS-2813: improves docs on column order
     new 95b53a9  ISIS-2483: updates generated docs

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


Summary of changes:
 .../applib/pages/index/annotation/Where.adoc       |  20 +--
 .../applib/pages/index/clock/VirtualClock.adoc     | 171 ++++++++++++------
 .../index/events/domain/AbstractDomainEvent.adoc   |  72 +++++++-
 .../pages/index/layout/menubars/MenuBars.adoc      |   3 +-
 .../layout/menubars/bootstrap3/BS3MenuBars.adoc    |   2 +-
 .../pages/index/services/menu/MenuBarsService.adoc |   1 +
 .../pages/index/services/metamodel/BeanSort.adoc   |   1 +
 .../index/services/registry/ServiceRegistry.adoc   |  11 ++
 .../services/user/ImpersonateMenuAdvisor.adoc      |   4 +-
 .../pages/index/services/user/RoleMemento.adoc     |   1 -
 .../pages/index/services/user/UserMemento.adoc     |   1 -
 .../pages/index/services/userui/UserMenu.adoc}     |  12 +-
 .../index/services/xactn/TransactionService.adoc   |  11 --
 .../TableColumnOrderServiceUsingTxtFile.adoc       |  48 +++++
 .../transaction/TransactionServiceSpring.adoc      |   9 +-
 .../changetracking/EntityChangeTrackerDefault.adoc |   9 +-
 .../EntityChangeTrackerWithPreValue.adoc           |  27 +++
 .../dom/ApplicationPermissionRepository.adoc       |  11 ++
 ...ExtCommandReplayPrimaryRoleAndPermissions.adoc} |  13 +-
 ...tCommandReplaySecondaryRoleAndPermissions.adoc} |  13 +-
 .../AbstractUserAndRolesFixtureScript.adoc         |   2 +
 .../pages/index/jdo/applib/types/AddressLine.adoc  |  27 +++
 .../pages/index/jdo/applib/types/Description.adoc  |  32 ++++
 .../pages/index/jdo/applib/types/Email.adoc        |  59 +++++++
 .../pages/index/jdo}/applib/types/Fqcn.adoc        |  14 +-
 .../index/jdo/applib/types/LogicalTypeName.adoc    |  27 +++
 .../pages/index/jdo/applib/types/Money.adoc        |  30 ++++
 .../pages/index/jdo/applib/types/Name.adoc         |  27 +++
 .../pages/index/jdo/applib/types/Notes.adoc        |  32 ++++
 .../index/jdo/applib/types/ObjectIdentifier.adoc   |  27 +++
 .../pages/index/jdo/applib/types/Percentage.adoc   |  30 ++++
 .../pages/index/jdo/applib/types/PhoneNumber.adoc  |  37 ++++
 .../pages/index/jdo/applib/types/PostalCode.adoc   |  27 +++
 .../pages/index/jdo/applib/types/ProperName.adoc   |  27 +++
 .../pages/index/jdo/applib/types/Reference.adoc    |  37 ++++
 .../pages/index/jdo/applib/types/Title.adoc        |  27 +++
 .../pages/index/jdo/applib/types/UrlTemplate.adoc  |  27 +++
 .../pages/index/jdo/applib/types/Username.adoc     |  27 +++
 ...nPointResolver.adoc => IsisEntityListener.adoc} |  15 +-
 .../index/jpa/applib/types/BlobJpaEmbeddable.adoc  |  46 +++++
 .../index/jpa/applib/types/ClobJpaEmbeddable.adoc  |  46 +++++
 .../index/keycloak/IsisModuleSecurityKeycloak.adoc |   4 +-
 .../authentication/AuthenticatorKeycloak.adoc      |  15 --
 .../index/keycloak/webmodule/KeycloakFilter.adoc   |  15 --
 .../index/base/applib/types/AddressLine.adoc}      |  21 ++-
 .../pages/index/base/applib/types/Description.adoc |  16 +-
 .../pages/index/base/applib/types/Email.adoc       |  55 ++++++
 .../pages/index/base/applib/types/Fqcn.adoc        |  10 +-
 .../index/base/applib/types/LogicalTypeName.adoc   |  23 +++
 .../pages/index/base/applib/types/Money.adoc       |  13 +-
 .../pages/index/base/applib/types/Name.adoc        |  12 +-
 .../pages/index/base/applib/types/Notes.adoc       |  16 +-
 .../index/base/applib/types/ObjectIdentifier.adoc  |  12 +-
 .../pages/index/base/applib/types/Percentage.adoc  |  13 +-
 .../pages/index/base/applib/types/PhoneNumber.adoc |  33 ++++
 .../pages/index/base/applib/types/PostalCode.adoc} |  21 ++-
 .../pages/index/base/applib/types/ProperName.adoc  |  12 +-
 .../pages/index/base/applib/types/Reference.adoc   |  24 ++-
 .../pages/index/base/applib/types/Title.adoc       |  12 +-
 .../pages/index/base/applib/types/UrlTemplate.adoc |  12 +-
 .../pages/index/base/applib/types/Username.adoc    |  12 +-
 .../IsisModuleTestingArchTestSupportApplib.adoc}   |   9 +-
 .../applib/classrules/ArchitectureDomainRules.adoc | 196 +++++++++++++++++++++
 .../applib/classrules/ArchitectureJdoRules.adoc    | 124 +++++++++++++
 .../applib/classrules/ArchitectureJpaRules.adoc    | 163 +++++++++++++++++
 .../modulerules/ArchitectureModuleRules.adoc       |  60 +++++++
 .../applib/modulerules/Subpackage.adoc             |  58 ++++++
 .../applib/modulerules/SubpackageEnum.adoc         | 161 +++++++++++++++++
 .../services/ImpersonatedUserHolderForWicket.adoc} |  14 +-
 .../modules/applib-classes/pages/layout.adoc       |   1 -
 .../applib-classes/pages/layout/column-order.adoc  |  63 -------
 .../modules/fun/pages/ui/table-columns.adoc        |  88 ++++++++-
 core/adoc/modules/_overview/pages/about.adoc       | 194 +++++++++++++-------
 73 files changed, 2206 insertions(+), 339 deletions(-)
 copy antora/components/refguide-index/modules/{subdomains/pages/index/base/applib/types/Name.adoc => applib/pages/index/services/userui/UserMenu.adoc} (85%)
 create mode 100644 antora/components/refguide-index/modules/core/pages/index/metamodel/services/tablecol/TableColumnOrderServiceUsingTxtFile.adoc
 create mode 100644 antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTrackerWithPreValue.adoc
 copy antora/components/refguide-index/modules/{security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc => extensions/pages/index/secman/applib/role/seed/IsisExtCommandReplayPrimaryRoleAndPermissions.adoc} (70%)
 copy antora/components/refguide-index/modules/{security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc => extensions/pages/index/secman/applib/role/seed/IsisExtCommandReplaySecondaryRoleAndPermissions.adoc} (70%)
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/AddressLine.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Description.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Email.adoc
 copy antora/components/refguide-index/modules/{subdomains/pages/index/base => persistence/pages/index/jdo}/applib/types/Fqcn.adoc (55%)
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/LogicalTypeName.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Money.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Name.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Notes.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/ObjectIdentifier.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Percentage.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/PhoneNumber.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/PostalCode.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/ProperName.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Reference.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Title.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/UrlTemplate.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Username.adoc
 copy antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/{JpaEntityInjectionPointResolver.adoc => IsisEntityListener.adoc} (70%)
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/types/BlobJpaEmbeddable.adoc
 create mode 100644 antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/types/ClobJpaEmbeddable.adoc
 delete mode 100644 antora/components/refguide-index/modules/security/pages/index/keycloak/authentication/AuthenticatorKeycloak.adoc
 delete mode 100644 antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/KeycloakFilter.adoc
 copy antora/components/refguide-index/modules/{persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc => subdomains/pages/index/base/applib/types/AddressLine.adoc} (54%)
 create mode 100644 antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Email.adoc
 create mode 100644 antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/LogicalTypeName.adoc
 create mode 100644 antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/PhoneNumber.adoc
 rename antora/components/refguide-index/modules/{persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc => subdomains/pages/index/base/applib/types/PostalCode.adoc} (54%)
 copy antora/components/refguide-index/modules/{subdomains/pages/index/base/applib/types/Name.adoc => testing/pages/index/archtestsupport/applib/IsisModuleTestingArchTestSupportApplib.adoc} (85%)
 create mode 100644 antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureDomainRules.adoc
 create mode 100644 antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureJdoRules.adoc
 create mode 100644 antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureJpaRules.adoc
 create mode 100644 antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/ArchitectureModuleRules.adoc
 create mode 100644 antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/Subpackage.adoc
 create mode 100644 antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/SubpackageEnum.adoc
 rename antora/components/refguide-index/modules/{security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc => viewer/pages/index/wicket/viewer/services/ImpersonatedUserHolderForWicket.adoc} (69%)

[isis] 02/02: ISIS-2483: updates generated docs

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

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

commit 95b53a90debe19e076db0cb10fee9e25ca3fae24
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jul 26 11:54:56 2021 +0100

    ISIS-2483: updates generated docs
---
 .../applib/pages/index/annotation/Where.adoc       |  20 +--
 .../applib/pages/index/clock/VirtualClock.adoc     | 171 ++++++++++++------
 .../index/events/domain/AbstractDomainEvent.adoc   |  72 +++++++-
 .../pages/index/layout/menubars/MenuBars.adoc      |   3 +-
 .../layout/menubars/bootstrap3/BS3MenuBars.adoc    |   2 +-
 .../pages/index/services/menu/MenuBarsService.adoc |   1 +
 .../pages/index/services/metamodel/BeanSort.adoc   |   1 +
 .../index/services/registry/ServiceRegistry.adoc   |  11 ++
 .../services/user/ImpersonateMenuAdvisor.adoc      |   4 +-
 .../pages/index/services/user/RoleMemento.adoc     |   1 -
 .../pages/index/services/user/UserMemento.adoc     |   1 -
 .../pages/index/services/userui/UserMenu.adoc}     |  12 +-
 .../index/services/xactn/TransactionService.adoc   |  11 --
 .../TableColumnOrderServiceUsingTxtFile.adoc       |  48 +++++
 .../transaction/TransactionServiceSpring.adoc      |   9 +-
 .../changetracking/EntityChangeTrackerDefault.adoc |   9 +-
 .../EntityChangeTrackerWithPreValue.adoc           |  27 +++
 .../dom/ApplicationPermissionRepository.adoc       |  11 ++
 ...ExtCommandReplayPrimaryRoleAndPermissions.adoc} |  13 +-
 ...tCommandReplaySecondaryRoleAndPermissions.adoc} |  13 +-
 .../AbstractUserAndRolesFixtureScript.adoc         |   2 +
 .../pages/index/jdo/applib/types/AddressLine.adoc  |  27 +++
 .../pages/index/jdo/applib/types/Description.adoc  |  32 ++++
 .../pages/index/jdo/applib/types/Email.adoc        |  59 +++++++
 .../pages/index/jdo}/applib/types/Fqcn.adoc        |  14 +-
 .../index/jdo/applib/types/LogicalTypeName.adoc    |  27 +++
 .../pages/index/jdo/applib/types/Money.adoc        |  30 ++++
 .../pages/index/jdo/applib/types/Name.adoc         |  27 +++
 .../pages/index/jdo/applib/types/Notes.adoc        |  32 ++++
 .../index/jdo/applib/types/ObjectIdentifier.adoc   |  27 +++
 .../pages/index/jdo/applib/types/Percentage.adoc   |  30 ++++
 .../pages/index/jdo/applib/types/PhoneNumber.adoc  |  37 ++++
 .../pages/index/jdo/applib/types/PostalCode.adoc   |  27 +++
 .../pages/index/jdo/applib/types/ProperName.adoc   |  27 +++
 .../pages/index/jdo/applib/types/Reference.adoc    |  37 ++++
 .../pages/index/jdo/applib/types/Title.adoc        |  27 +++
 .../pages/index/jdo/applib/types/UrlTemplate.adoc  |  27 +++
 .../pages/index/jdo/applib/types/Username.adoc     |  27 +++
 ...nPointResolver.adoc => IsisEntityListener.adoc} |  15 +-
 .../index/jpa/applib/types/BlobJpaEmbeddable.adoc  |  46 +++++
 .../index/jpa/applib/types/ClobJpaEmbeddable.adoc  |  46 +++++
 .../index/keycloak/IsisModuleSecurityKeycloak.adoc |   4 +-
 .../authentication/AuthenticatorKeycloak.adoc      |  15 --
 .../index/keycloak/webmodule/KeycloakFilter.adoc   |  15 --
 .../index/base/applib/types/AddressLine.adoc}      |  21 ++-
 .../pages/index/base/applib/types/Description.adoc |  16 +-
 .../pages/index/base/applib/types/Email.adoc       |  55 ++++++
 .../pages/index/base/applib/types/Fqcn.adoc        |  10 +-
 .../index/base/applib/types/LogicalTypeName.adoc   |  23 +++
 .../pages/index/base/applib/types/Money.adoc       |  13 +-
 .../pages/index/base/applib/types/Name.adoc        |  12 +-
 .../pages/index/base/applib/types/Notes.adoc       |  16 +-
 .../index/base/applib/types/ObjectIdentifier.adoc  |  12 +-
 .../pages/index/base/applib/types/Percentage.adoc  |  13 +-
 .../pages/index/base/applib/types/PhoneNumber.adoc |  33 ++++
 .../pages/index/base/applib/types/PostalCode.adoc} |  21 ++-
 .../pages/index/base/applib/types/ProperName.adoc  |  12 +-
 .../pages/index/base/applib/types/Reference.adoc   |  24 ++-
 .../pages/index/base/applib/types/Title.adoc       |  12 +-
 .../pages/index/base/applib/types/UrlTemplate.adoc |  12 +-
 .../pages/index/base/applib/types/Username.adoc    |  12 +-
 .../IsisModuleTestingArchTestSupportApplib.adoc}   |   9 +-
 .../applib/classrules/ArchitectureDomainRules.adoc | 196 +++++++++++++++++++++
 .../applib/classrules/ArchitectureJdoRules.adoc    | 124 +++++++++++++
 .../applib/classrules/ArchitectureJpaRules.adoc    | 163 +++++++++++++++++
 .../modulerules/ArchitectureModuleRules.adoc       |  60 +++++++
 .../applib/modulerules/Subpackage.adoc             |  58 ++++++
 .../applib/modulerules/SubpackageEnum.adoc         | 161 +++++++++++++++++
 .../services/ImpersonatedUserHolderForWicket.adoc} |  14 +-
 core/adoc/modules/_overview/pages/about.adoc       | 194 +++++++++++++-------
 70 files changed, 2124 insertions(+), 269 deletions(-)

diff --git a/antora/components/refguide-index/modules/applib/pages/index/annotation/Where.adoc b/antora/components/refguide-index/modules/applib/pages/index/annotation/Where.adoc
index 0c9f2e2..30800ab 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/annotation/Where.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/annotation/Where.adoc
@@ -49,17 +49,17 @@ The member should be disabled/hidden when displayed within an object form.
 <.> xref:#REFERENCES_PARENT[REFERENCES_PARENT]
 +
 --
-The member should be disabled/hidden when displayed as a column of a table within parent object's collection, and references that parent.
+The (property) member should be hidden when displayed as a column of a table within parent object's collection, and when it references that parent.
 --
 <.> xref:#PARENTED_TABLES[PARENTED_TABLES]
 +
 --
-The member should be disabled/hidden when displayed as a column of a table within a parent object's collection.
+The member should be hidden when displayed as a column of a table within a parent object's collection.
 --
 <.> xref:#STANDALONE_TABLES[STANDALONE_TABLES]
 +
 --
-The member should be disabled/hidden when displayed as a column of a table showing a standalone list of objects, for example as returned by a repository query.
+The member should be hidden when displayed as a column of a table showing a standalone list of objects, for example as returned by a repository query.
 --
 <.> xref:#ALL_TABLES[ALL_TABLES]
 +
@@ -113,23 +113,21 @@ For most viewers, this applies to property and collection members, not actions.
 [#REFERENCES_PARENT]
 === REFERENCES_PARENT
 
-The member should be disabled/hidden when displayed as a column of a table within parent object's collection, and references that parent.
-
-For most (all?) viewers, this will have meaning only if applied to a property member.
+The (property) member should be hidden when displayed as a column of a table within parent object's collection, and when it references that parent.
 
 [#PARENTED_TABLES]
 === PARENTED_TABLES
 
-The member should be disabled/hidden when displayed as a column of a table within a parent object's collection.
+The member should be hidden when displayed as a column of a table within a parent object's collection.
 
-For most (all?) viewers, this will have meaning only if applied to a property member.
+An alternative to using annotations is using to use file based layout, which can be reloaded dynamically. One implementation that supports this is `TableColumnOrderServiceUsingTxtFile` service, that reads from files named _ParentClass#collectionId.columnOrder.txt_ .
 
 [#STANDALONE_TABLES]
 === STANDALONE_TABLES
 
-The member should be disabled/hidden when displayed as a column of a table showing a standalone list of objects, for example as returned by a repository query.
+The member should be hidden when displayed as a column of a table showing a standalone list of objects, for example as returned by a repository query.
 
-For most (all?) viewers, this will have meaning only if applied to a property member.
+An alternative to using annotations is using to use file based layout, which can be reloaded dynamically. One implementation that supports this is `TableColumnOrderServiceUsingTxtFile` service, that reads from files named _ClassName.columnOrder.txt_ .
 
 [#ALL_TABLES]
 === ALL_TABLES
@@ -138,6 +136,8 @@ The member should be disabled/hidden when displayed as a column of a table, eith
 
 This combines _#PARENTED_TABLES_ and _#STANDALONE_TABLES_ .
 
+An alternative to using annotations is using to use file based layout, which can be reloaded dynamically. One implementation that supports this is `TableColumnOrderServiceUsingTxtFile` service, that reads from files named _ParentClass#collectionId.columnOrder.txt_ (parented collections) and _ClassName.columnOrder.txt_ (standalone collections).
+
 [#ALL_EXCEPT_STANDALONE_TABLES]
 === ALL_EXCEPT_STANDALONE_TABLES
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/clock/VirtualClock.adoc b/antora/components/refguide-index/modules/applib/pages/index/clock/VirtualClock.adoc
index d7f742d..ad577c3 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/clock/VirtualClock.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/clock/VirtualClock.adoc
@@ -9,24 +9,29 @@ Works in connection with xref:refguide:applib:index/services/iactnlayer/Interact
 .VirtualClock.java
 ----
 interface VirtualClock {
-  Instant now()     // <.>
+  Instant nowAsInstant()     // <.>
   VirtualClock system()     // <.>
   VirtualClock nowAt(Instant virtualNow)     // <.>
   VirtualClock frozenAt(Instant frozenAt)     // <.>
   VirtualClock frozenTestClock()     // <.>
-  long getEpochMillis()     // <.>
-  LocalDate localDate(final ZoneId zoneId)     // <.>
-  LocalDateTime localDateTime(final ZoneId zoneId)     // <.>
-  OffsetDateTime offsetDateTime(final ZoneId zoneId)     // <.>
-  java.util.Date javaUtilDate()
-  java.sql.Timestamp javaSqlTimestamp()
-  XMLGregorianCalendar xmlGregorianCalendar()
-  org.joda.time.DateTime asJodaDateTime(final ZoneId zoneId)     // <.>
-  org.joda.time.LocalDate asJodaLocalDate(final ZoneId zoneId)     // <.>
+  long nowAsEpochMilli()     // <.>
+  LocalDate nowAsLocalDate(final ZoneId zoneId)     // <.>
+  LocalDate nowAsLocalDate()     // <.>
+  LocalDateTime nowAsLocalDateTime(final ZoneId zoneId)     // <.>
+  LocalDateTime nowAsLocalDateTime()     // <.>
+  OffsetDateTime nowAsOffsetDateTime(final ZoneId zoneId)     // <.>
+  OffsetDateTime nowAsOffsetDateTime()     // <.>
+  java.util.Date nowAsJavaUtilDate()     // <.>
+  java.sql.Timestamp nowAsJavaSqlTimestamp()     // <.>
+  XMLGregorianCalendar nowAsXmlGregorianCalendar()     // <.>
+  org.joda.time.DateTime nowAsJodaDateTime(final ZoneId zoneId)     // <.>
+  org.joda.time.DateTime nowAsJodaDateTime()     // <.>
+  org.joda.time.LocalDate nowAsJodaLocalDate(final ZoneId zoneId)     // <.>
+  org.joda.time.LocalDate nowAsJodaLocalDate()     // <.>
 }
 ----
 
-<.> xref:#now__[now()]
+<.> xref:#nowAsInstant__[nowAsInstant()]
 +
 --
 Returns the (virtual) time as an _Instant_ .
@@ -34,7 +39,7 @@ Returns the (virtual) time as an _Instant_ .
 <.> xref:#system__[system()]
 +
 --
-Returns a the system's default ticking clock.
+Returns the system's default ticking clock.
 --
 <.> xref:#nowAt__Instant[nowAt(Instant)]
 +
@@ -51,62 +56,88 @@ Always returns the time _Instant_ as given by _frozenAt_
 --
 Always returns the time _Instant_ 2003/8/17 21:30:25 (UTC)
 --
-<.> xref:#getEpochMillis__[getEpochMillis()]
+<.> xref:#nowAsEpochMilli__[nowAsEpochMilli()]
 +
 --
 Returns the (virtual) time as the number of milliseconds since the epoch start.
 --
-<.> xref:#localDate__ZoneId[localDate(ZoneId)]
+<.> xref:#nowAsLocalDate__ZoneId[nowAsLocalDate(ZoneId)]
 +
 --
 Returns the (virtual) time as _LocalDate_ , using the _ZoneId_ timezone.
 --
-<.> xref:#localDateTime__ZoneId[localDateTime(ZoneId)]
+<.> xref:#nowAsLocalDate__[nowAsLocalDate()]
++
+--
+Returns the (virtual) time as _LocalDate_ , using the _ZoneId#systemDefault() system default_ timezone.
+--
+<.> xref:#nowAsLocalDateTime__ZoneId[nowAsLocalDateTime(ZoneId)]
 +
 --
 Returns the (virtual) time as _LocalDateTime_ , using the _ZoneId_ timezone.
 --
-<.> xref:#offsetDateTime__ZoneId[offsetDateTime(ZoneId)]
+<.> xref:#nowAsLocalDateTime__[nowAsLocalDateTime()]
++
+--
+Returns the (virtual) time as _LocalDateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
+--
+<.> xref:#nowAsOffsetDateTime__ZoneId[nowAsOffsetDateTime(ZoneId)]
 +
 --
 Returns the (virtual) time as _OffsetDateTime_ , using the _ZoneId_ timezone.
 --
-<.> xref:#asJodaDateTime__ZoneId[asJodaDateTime(ZoneId)]
+<.> xref:#nowAsOffsetDateTime__[nowAsOffsetDateTime()]
++
+--
+Returns the (virtual) time as _OffsetDateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
+--
+<.> xref:#nowAsJavaUtilDate__[nowAsJavaUtilDate()]
++
+--
+Returns the (virtual)time as _java.util.Date_ .
+--
+<.> xref:#nowAsJavaSqlTimestamp__[nowAsJavaSqlTimestamp()]
++
+--
+Returns the (virtual) time as _java.sql.Timestamp_ .
+--
+<.> xref:#nowAsXmlGregorianCalendar__[nowAsXmlGregorianCalendar()]
++
+--
+Returns the (virtual) time as _XMLGregorianCalendar_ .
+--
+<.> xref:#nowAsJodaDateTime__ZoneId[nowAsJodaDateTime(ZoneId)]
++
+--
+Returns the time as a Joda _org.joda.time.DateTime_ , using the specified _ZoneId_ timezone.
+--
+<.> xref:#nowAsJodaDateTime__[nowAsJodaDateTime()]
 +
 --
-[WARNING]
-====
-[red]#_deprecated:_#
-
-please migrate to java.time.*
-====
-
 Returns the time as a Joda _org.joda.time.DateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
 --
-<.> xref:#asJodaLocalDate__ZoneId[asJodaLocalDate(ZoneId)]
+<.> xref:#nowAsJodaLocalDate__ZoneId[nowAsJodaLocalDate(ZoneId)]
++
+--
+Returns the time as a Joda _DateTime_ , using the specified _ZoneId_ timezone.
+--
+<.> xref:#nowAsJodaLocalDate__[nowAsJodaLocalDate()]
 +
 --
-[WARNING]
-====
-[red]#_deprecated:_#
-
-please migrate to java.time.*
-====
-
 Returns the time as a Joda _DateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
 --
 
 == Members
 
-[#now__]
-=== now()
+[#nowAsInstant__]
+=== nowAsInstant()
 
 Returns the (virtual) time as an _Instant_ .
 
 [#system__]
 === system()
 
-Returns a the system's default ticking clock.
+Returns the system's default ticking clock.
 
 [#nowAt__Instant]
 === nowAt(Instant)
@@ -123,46 +154,72 @@ Always returns the time _Instant_ as given by _frozenAt_
 
 Always returns the time _Instant_ 2003/8/17 21:30:25 (UTC)
 
-[#getEpochMillis__]
-=== getEpochMillis()
+[#nowAsEpochMilli__]
+=== nowAsEpochMilli()
 
 Returns the (virtual) time as the number of milliseconds since the epoch start.
 
-[#localDate__ZoneId]
-=== localDate(ZoneId)
+[#nowAsLocalDate__ZoneId]
+=== nowAsLocalDate(ZoneId)
 
 Returns the (virtual) time as _LocalDate_ , using the _ZoneId_ timezone.
 
-[#localDateTime__ZoneId]
-=== localDateTime(ZoneId)
+[#nowAsLocalDate__]
+=== nowAsLocalDate()
+
+Returns the (virtual) time as _LocalDate_ , using the _ZoneId#systemDefault() system default_ timezone.
+
+[#nowAsLocalDateTime__ZoneId]
+=== nowAsLocalDateTime(ZoneId)
 
 Returns the (virtual) time as _LocalDateTime_ , using the _ZoneId_ timezone.
 
-[#offsetDateTime__ZoneId]
-=== offsetDateTime(ZoneId)
+[#nowAsLocalDateTime__]
+=== nowAsLocalDateTime()
+
+Returns the (virtual) time as _LocalDateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
+
+[#nowAsOffsetDateTime__ZoneId]
+=== nowAsOffsetDateTime(ZoneId)
 
 Returns the (virtual) time as _OffsetDateTime_ , using the _ZoneId_ timezone.
 
-[#asJodaDateTime__ZoneId]
-=== asJodaDateTime(ZoneId)
+[#nowAsOffsetDateTime__]
+=== nowAsOffsetDateTime()
+
+Returns the (virtual) time as _OffsetDateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
+
+[#nowAsJavaUtilDate__]
+=== nowAsJavaUtilDate()
+
+Returns the (virtual)time as _java.util.Date_ .
+
+[#nowAsJavaSqlTimestamp__]
+=== nowAsJavaSqlTimestamp()
+
+Returns the (virtual) time as _java.sql.Timestamp_ .
+
+[#nowAsXmlGregorianCalendar__]
+=== nowAsXmlGregorianCalendar()
+
+Returns the (virtual) time as _XMLGregorianCalendar_ .
+
+[#nowAsJodaDateTime__ZoneId]
+=== nowAsJodaDateTime(ZoneId)
 
-[WARNING]
-====
-[red]#_deprecated:_#
+Returns the time as a Joda _org.joda.time.DateTime_ , using the specified _ZoneId_ timezone.
 
-please migrate to java.time.*
-====
+[#nowAsJodaDateTime__]
+=== nowAsJodaDateTime()
 
 Returns the time as a Joda _org.joda.time.DateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
 
-[#asJodaLocalDate__ZoneId]
-=== asJodaLocalDate(ZoneId)
+[#nowAsJodaLocalDate__ZoneId]
+=== nowAsJodaLocalDate(ZoneId)
 
-[WARNING]
-====
-[red]#_deprecated:_#
+Returns the time as a Joda _DateTime_ , using the specified _ZoneId_ timezone.
 
-please migrate to java.time.*
-====
+[#nowAsJodaLocalDate__]
+=== nowAsJodaLocalDate()
 
 Returns the time as a Joda _DateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
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 0e05099..5033b99 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
@@ -18,19 +18,25 @@ class AbstractDomainEvent<S> {
   S getSource()     // <.>
   void setMixedIn(final Object mixedIn)     // <.>
   T getSubject()     // <.>
-  void setEventPhase(Phase phase)     // <.>
+  void setEventPhase(final Phase phase)     // <.>
   void setIdentifier(final Identifier identifier)     // <.>
   void hide()     // <.>
+  void hideIf(final boolean condition)     // <.>
+  void hideIf(final BooleanSupplier shouldHide)     // <.>
   boolean isDisabled()
   void disable(final String reason)     // <.>
   void disable(final TranslatableString reason)     // <.>
+  void disableIfReason(final Supplier<String> reasonSupplier)     // <.>
+  void disableIfTranslatableReason(final Supplier<TranslatableString> reasonSupplier)     // <.>
   boolean isInvalid()
   void invalidate(final String reason)     // <.>
   void invalidate(final TranslatableString reason)     // <.>
+  void invalidateIfReason(final Supplier<String> reasonSupplier)     // <.>
+  void invalidateIfTranslatableReason(final Supplier<TranslatableString> reasonSupplier)     // <.>
   void veto(final String reason, final Object... args)     // <.>
   void veto(final TranslatableString translatableReason)     // <.>
-  Object get(Object key)     // <.>
-  void put(Object key, Object value)     // <.>
+  Object get(final Object key)     // <.>
+  void put(final Object key, final Object value)     // <.>
   String toString()
 }
 ----
@@ -70,6 +76,16 @@ Not API, set by the framework if the no-arg constructor is used.
 --
 API for subscribers to hide the member.
 --
+<.> xref:#hideIf__boolean[hideIf(boolean)]
++
+--
+Same as ... _if(condition) hide();_
+--
+<.> xref:#hideIf__BooleanSupplier[hideIf(BooleanSupplier)]
++
+--
+Same as ... _if(shouldHide.getAsBoolean()) hide();_
+--
 <.> xref:#disable__String[disable(String)]
 +
 --
@@ -80,6 +96,16 @@ API for subscribers to disable the member, specifying the reason why.
 --
 API for subscribers to disable the member, specifying the reason why as a xref:refguide:applib:index/services/i18n/TranslatableString.adoc[TranslatableString] .
 --
+<.> xref:#disableIfReason__Supplier[disableIfReason(Supplier)]
++
+--
+Same as ... _if(reasonSupplier.get()!=null) disable(reasonSupplier.get());_
+--
+<.> xref:#disableIfTranslatableReason__Supplier[disableIfTranslatableReason(Supplier)]
++
+--
+Same as ... _if(reasonSupplier.get()!=null) disable(reasonSupplier.get());_
+--
 <.> xref:#invalidate__String[invalidate(String)]
 +
 --
@@ -90,6 +116,16 @@ API for subscribers to invalidate an interaction, eg invalid arguments to an act
 --
 API for subscribers to invalidate an interaction, specifying the reason as a xref:refguide:applib:index/services/i18n/TranslatableString.adoc[TranslatableString] .
 --
+<.> xref:#invalidateIfReason__Supplier[invalidateIfReason(Supplier)]
++
+--
+Same as ... _if(reasonSupplier.get()!=null) invalidate(reasonSupplier.get());_
+--
+<.> xref:#invalidateIfTranslatableReason__Supplier[invalidateIfTranslatableReason(Supplier)]
++
+--
+Same as ... _if(reasonSupplier.get()!=null) invalidate(reasonSupplier.get());_
+--
 <.> xref:#veto__String_Object[veto(String, Object)]
 +
 --
@@ -154,6 +190,16 @@ Not API, set by the framework if the no-arg constructor is used.
 
 API for subscribers to hide the member.
 
+[#hideIf__boolean]
+=== hideIf(boolean)
+
+Same as ... _if(condition) hide();_
+
+[#hideIf__BooleanSupplier]
+=== hideIf(BooleanSupplier)
+
+Same as ... _if(shouldHide.getAsBoolean()) hide();_
+
 [#disable__String]
 === disable(String)
 
@@ -164,6 +210,16 @@ API for subscribers to disable the member, specifying the reason why.
 
 API for subscribers to disable the member, specifying the reason why as a xref:refguide:applib:index/services/i18n/TranslatableString.adoc[TranslatableString] .
 
+[#disableIfReason__Supplier]
+=== disableIfReason(Supplier)
+
+Same as ... _if(reasonSupplier.get()!=null) disable(reasonSupplier.get());_
+
+[#disableIfTranslatableReason__Supplier]
+=== disableIfTranslatableReason(Supplier)
+
+Same as ... _if(reasonSupplier.get()!=null) disable(reasonSupplier.get());_
+
 [#invalidate__String]
 === invalidate(String)
 
@@ -174,6 +230,16 @@ API for subscribers to invalidate an interaction, eg invalid arguments to an act
 
 API for subscribers to invalidate an interaction, specifying the reason as a xref:refguide:applib:index/services/i18n/TranslatableString.adoc[TranslatableString] .
 
+[#invalidateIfReason__Supplier]
+=== invalidateIfReason(Supplier)
+
+Same as ... _if(reasonSupplier.get()!=null) invalidate(reasonSupplier.get());_
+
+[#invalidateIfTranslatableReason__Supplier]
+=== invalidateIfTranslatableReason(Supplier)
+
+Same as ... _if(reasonSupplier.get()!=null) invalidate(reasonSupplier.get());_
+
 [#veto__String_Object]
 === veto(String, Object)
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/layout/menubars/MenuBars.adoc b/antora/components/refguide-index/modules/applib/pages/index/layout/menubars/MenuBars.adoc
index e92044d..a631785 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/layout/menubars/MenuBars.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/layout/menubars/MenuBars.adoc
@@ -10,8 +10,9 @@ interface MenuBars {
   String getTnsAndSchemaLocation()
   void setTnsAndSchemaLocation(final String tnsAndSchemaLocation)
   MenuBar menuBarFor(DomainServiceLayout.MenuBar menuBar)
-  void visit(Visitor visitor)
+  void visit(Consumer<ServiceActionLayoutData> visitor)
   Map<String, ServiceActionLayoutData> getAllServiceActionsByObjectTypeAndId()
+  Stream<ServiceActionLayoutData> stream()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/layout/menubars/bootstrap3/BS3MenuBars.adoc b/antora/components/refguide-index/modules/applib/pages/index/layout/menubars/bootstrap3/BS3MenuBars.adoc
index 73018b7..7e89fbe 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/layout/menubars/bootstrap3/BS3MenuBars.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/layout/menubars/bootstrap3/BS3MenuBars.adoc
@@ -17,7 +17,7 @@ class BS3MenuBars {
   BS3MenuBar getTertiary()
   void setTertiary(final BS3MenuBar tertiary)
   BS3MenuBar menuBarFor(final DomainServiceLayout.MenuBar menuBar)
-  void visit(final MenuBars.Visitor visitor)
+  void visit(final Consumer<ServiceActionLayoutData> visitor)
   String getMetadataError()     // <.>
   void setMetadataError(final String metadataError)
 }
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/menu/MenuBarsService.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/menu/MenuBarsService.adoc
index fb38232..b3b6c74 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/menu/MenuBarsService.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/menu/MenuBarsService.adoc
@@ -13,6 +13,7 @@ This is used by the Wicket viewer to build up the menu. It is also served as the
 interface MenuBarsService {
   MenuBars menuBars()     // <.>
   MenuBars menuBars(final Type type)     // <.>
+  MenuBarsService forTesting()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/BeanSort.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/BeanSort.adoc
index ea5b1a7..2a4c42c 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/BeanSort.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/BeanSort.adoc
@@ -19,6 +19,7 @@ enum BeanSort {
   ABSTRACT     // <.>
   VETOED     // <.>
   UNKNOWN
+  boolean isManagedBeanContributing()
   boolean isManagedBean()
   boolean isMixin()
   boolean isViewModel()
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/registry/ServiceRegistry.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/registry/ServiceRegistry.adoc
index b220ab1..9f17ddd 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/registry/ServiceRegistry.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/registry/ServiceRegistry.adoc
@@ -19,6 +19,7 @@ interface ServiceRegistry {
   Optional<T> lookupService(final Class<T> serviceClass)     // <.>
   Optional<T> lookupService(Class<T> serviceClass, Comparator<Object> comparator)     // <.>
   T lookupServiceElseFail(final Class<T> serviceClass)     // <.>
+  void clearRegisteredBeans()     // <.>
 }
 ----
 
@@ -67,6 +68,11 @@ Returns a domain service implementing the requested type.
 --
 Looks up a domain service of the requested type (same as _#lookupService(Class)_ ) but throws a _NoSuchElementException_ if there are no such instances.
 --
+<.> xref:#clearRegisteredBeans__[clearRegisteredBeans()]
++
+--
+Invalidates any cached service adapters that might hold a reference to the current _SpecificationLoader_ . Particularly useful when discarding a meta-model instance, that is, purging the _ObjectSpecification_ cache.
+--
 
 == Members
 
@@ -119,6 +125,11 @@ If this lookup is ambiguous, then the provided comparator is used.
 
 Looks up a domain service of the requested type (same as _#lookupService(Class)_ ) but throws a _NoSuchElementException_ if there are no such instances.
 
+[#clearRegisteredBeans__]
+=== clearRegisteredBeans()
+
+Invalidates any cached service adapters that might hold a reference to the current _SpecificationLoader_ . Particularly useful when discarding a meta-model instance, that is, purging the _ObjectSpecification_ cache.
+
 include::hooks/ServiceRegistry_010-implementation.adoc[]
 
 include::hooks/ServiceRegistry_020-examples-and-usage.adoc[]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/user/ImpersonateMenuAdvisor.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/user/ImpersonateMenuAdvisor.adoc
index 87a8382..232b56a 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/user/ImpersonateMenuAdvisor.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/user/ImpersonateMenuAdvisor.adoc
@@ -1,9 +1,9 @@
 = ImpersonateMenuAdvisor _(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 [...]
 
-Enables _ImpersonateMenu#impersonateWithRoles(String, List)_ , which provides choices for user and roles.
+Enables _ImpersonateMenu#impersonateWithRoles(String, List)_ , to provides choices for user and roles.
 
-This is in addition to the simpler _ImpersonateMenu#impersonate(String)_ (which simply allows a username to be specified, with no roles).
+This will result in the simpler _ImpersonateMenu#impersonate(String)_ (which simply allows a username to be specified, with no roles) being hidden.
 
 == API
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/user/RoleMemento.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/user/RoleMemento.adoc
index d19f526..c3fc203 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/user/RoleMemento.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/user/RoleMemento.adoc
@@ -12,7 +12,6 @@ class RoleMemento {
   public static final String LOGICAL_TYPE_NAME;
   RoleMemento(final String name)     // <.>
   RoleMemento(final String name, final String description)     // <.>
-  String title()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/user/UserMemento.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/user/UserMemento.adoc
index 1d5cc63..dad3b4e 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/user/UserMemento.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/user/UserMemento.adoc
@@ -16,7 +16,6 @@ class UserMemento {
   UserMemento ofNameAndRoleNames(final String name, final String... roleNames)     // <.>
   UserMemento ofNameAndRoleNames(final String name, final List<String> roleNames)     // <.>
   UserMemento ofNameAndRoleNames(final String name, final Stream<String> roleNames)     // <.>
-  String title()
   List<RoleMemento> getRoles()     // <.>
   UserMemento withRoleAdded(String role)
   boolean isCurrentUser(final String userName)     // <.>
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/userui/UserMenu.adoc
similarity index 85%
copy from antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc
copy to antora/components/refguide-index/modules/applib/pages/index/services/userui/UserMenu.adoc
index b738171..4e9e3a7 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/userui/UserMenu.adoc
@@ -1,15 +1,15 @@
-= @Name
+= UserMenu
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing a name of some sort.
-
 == API
 
 [source,java]
-.Name.java
+.UserMenu.java
 ----
-@interface Name {
-  int MAX_LEN;
+class UserMenu {
+  public static final String LOGICAL_TYPE_NAME;
+  UserMemento me()
+  String disableMe()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/xactn/TransactionService.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/xactn/TransactionService.adoc
index 88e4c8a..59f6c14 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/xactn/TransactionService.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/xactn/TransactionService.adoc
@@ -14,7 +14,6 @@ interface TransactionService {
   Optional<TransactionId> currentTransactionId()     // <.>
   TransactionState currentTransactionState()     // <.>
   void flushTransaction()     // <.>
-  void nextTransaction()     // <.>
 }
 ----
 
@@ -33,11 +32,6 @@ Returns the state of the current thread's transaction., or returns _TransactionS
 --
 Flushes all changes to the object store.
 --
-<.> xref:#nextTransaction__[nextTransaction()]
-+
---
-Commits the current thread's transaction (if there is one), and in any case begins a new one.
---
 
 == Members
 
@@ -60,11 +54,6 @@ Occasionally useful to ensure that newly persisted domain objects are flushed to
 
 If there is no active transaction associated with the current thread, then does nothing.
 
-[#nextTransaction__]
-=== nextTransaction()
-
-Commits the current thread's transaction (if there is one), and in any case begins a new one.
-
 include::hooks/TransactionService_010-implementation.adoc[]
 
 include::hooks/TransactionService_020-examples-and-usage.adoc[]
diff --git a/antora/components/refguide-index/modules/core/pages/index/metamodel/services/tablecol/TableColumnOrderServiceUsingTxtFile.adoc b/antora/components/refguide-index/modules/core/pages/index/metamodel/services/tablecol/TableColumnOrderServiceUsingTxtFile.adoc
new file mode 100644
index 0000000..652e879
--- /dev/null
+++ b/antora/components/refguide-index/modules/core/pages/index/metamodel/services/tablecol/TableColumnOrderServiceUsingTxtFile.adoc
@@ -0,0 +1,48 @@
+= TableColumnOrderServiceUsingTxtFile
+: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 simple mechanism to order the columns of both parented and standalone collections by reading a flat file containing the list of the properties in the desired order, one propertyId per line.
+
+The files are located relative to the class itself. For parented collections, the file is named _ParentClassName#collectionId.columnOrder.txt_ , while for standalone collections, the file is named _ClassName.columnOrder.txt_ .
+
+Any properties omitted from the file will not be shown as columns of the table. The propertyId must also be an exact match, so can be ignored by commenting out, eg with "#".
+
+Also note that properties that have been explicitly hidden from tables using _PropertyLayout#hidden() @PropertyLayout#hidden_ are never shown, irrespective of whether they are listed in the files. You may therefore prefer to _not_ hide properties with annotations, and then rely solely on these external _columnOrder.txt_ files. This has the further benefit that files can be modified at runtime and will be automatically picked up without requiring a restart of the application.
+
+== API
+
+[source,java]
+.TableColumnOrderServiceUsingTxtFile.java
+----
+class TableColumnOrderServiceUsingTxtFile {
+  List<String> orderParented(final Object domainObject, final String collectionId, final Class<?> collectionType, final List<String> propertyIds)     // <.>
+  List<String> orderStandalone(final Class<?> domainClass, final List<String> propertyIds)     // <.>
+}
+----
+
+<.> xref:#orderParented__Object_String_Class_List[orderParented(Object, String, Class, List)]
++
+--
+Reads propertyIds of the collection from a file named _ClassName#collectionId.columnOrder.txt_ . relative to the class itself.
+--
+<.> xref:#orderStandalone__Class_List[orderStandalone(Class, List)]
++
+--
+Reads propertyIds of the standalone collection from a file named _ClassName.columnOrder.txt_ , relative to the class itself.
+--
+
+== Members
+
+[#orderParented__Object_String_Class_List]
+=== orderParented(Object, String, Class, List)
+
+Reads propertyIds of the collection from a file named _ClassName#collectionId.columnOrder.txt_ . relative to the class itself.
+
+Additional files can be provided by overriding _#addResourceNames(Class, String, List)_ .
+
+[#orderStandalone__Class_List]
+=== orderStandalone(Class, List)
+
+Reads propertyIds of the standalone collection from a file named _ClassName.columnOrder.txt_ , relative to the class itself.
+
+Additional files can be provided by overriding _#addResourceNames(Class, List)_ .
diff --git a/antora/components/refguide-index/modules/core/pages/index/runtimeservices/transaction/TransactionServiceSpring.adoc b/antora/components/refguide-index/modules/core/pages/index/runtimeservices/transaction/TransactionServiceSpring.adoc
index 41be497..880a5f3 100644
--- a/antora/components/refguide-index/modules/core/pages/index/runtimeservices/transaction/TransactionServiceSpring.adoc
+++ b/antora/components/refguide-index/modules/core/pages/index/runtimeservices/transaction/TransactionServiceSpring.adoc
@@ -8,14 +8,13 @@
 ----
 class TransactionServiceSpring {
   TransactionServiceSpring(final List<PlatformTransactionManager> platformTransactionManagers, final List<PersistenceExceptionTranslator> persistenceExceptionTranslators, final InteractionLayerTracker interactionLayerTracker)
-  Result<T> callTransactional(TransactionDefinition def, Callable<T> callable)
-  void nextTransaction()
+  Result<T> callTransactional(final TransactionDefinition def, final Callable<T> callable)
   void flushTransaction()
   Optional<TransactionId> currentTransactionId()
   TransactionState currentTransactionState()
-  void beforeEnteringTransactionalBoundary(Interaction interaction)     // <.>
-  void onTransactionEnded(TransactionAfterCompletionEvent event)     // <.>
-  void afterLeavingTransactionalBoundary(Interaction interaction)     // <.>
+  void beforeEnteringTransactionalBoundary(final Interaction interaction)     // <.>
+  void onTransactionEnded(final TransactionAfterCompletionEvent event)     // <.>
+  void afterLeavingTransactionalBoundary(final Interaction interaction)     // <.>
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTrackerDefault.adoc b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTrackerDefault.adoc
index 612917e..f975dfe 100644
--- a/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTrackerDefault.adoc
+++ b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTrackerDefault.adoc
@@ -7,19 +7,24 @@
 .EntityChangeTrackerDefault.java
 ----
 class EntityChangeTrackerDefault {
+  EntityChangeTrackerDefault(EntityPropertyChangePublisher entityPropertyChangePublisher, EntityChangesPublisher entityChangesPublisher, EventBusService eventBusService, Provider<InteractionProvider> interactionProviderProvider)
+  void postConstruct()
+  void preDestroy()
+  Set<_PropertyChangeRecord> snapshotPropertyChangeRecords()
   void onTransactionCompleting(TransactionBeforeCompletionEvent event)     // <.>
   Optional<EntityChanges> getEntityChanges(final java.sql.Timestamp timestamp, final String userName)
+  Can<EntityPropertyChange> getPropertyChanges(final java.sql.Timestamp timestamp, final String userName, final TransactionId txId)
   Interaction currentInteraction()
+  long countPotentialPropertyChangeRecords()
   int numberEntitiesLoaded()
   int numberEntitiesDirtied()
-  int propertyChangeRecordCount()
   void enlistCreated(ManagedObject entity)
   void enlistDeleting(ManagedObject entity)
   void enlistUpdating(ManagedObject entity)
+  void enlistUpdating(ManagedObject entity, String propertyIdIfAny, Object preValue)
   void recognizeLoaded(ManagedObject entity)
   void recognizePersisting(ManagedObject entity)
   void recognizeUpdating(ManagedObject entity)
-  Can<EntityPropertyChange> getPropertyChanges(final java.sql.Timestamp timestamp, final String userName, final TransactionId txId)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTrackerWithPreValue.adoc b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTrackerWithPreValue.adoc
new file mode 100644
index 0000000..19c7385
--- /dev/null
+++ b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTrackerWithPreValue.adoc
@@ -0,0 +1,27 @@
+= EntityChangeTrackerWithPreValue _(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]
+.EntityChangeTrackerWithPreValue.java
+----
+interface EntityChangeTrackerWithPreValue {
+  void enlistUpdating(ManagedObject entity, String propertyIdIfAny, Object preValue)     // <.>
+}
+----
+
+<.> xref:#enlistUpdating__ManagedObject_String_Object[enlistUpdating(ManagedObject, String, Object)]
++
+--
+An override of _EntityChangeTracker#enlistUpdating(ManagedObject)_ where the caller already knows the old value (and so the xref:refguide:core:index/transaction/changetracking/EntityChangeTracker.adoc[EntityChangeTracker] does not need to capture the old value itself.
+--
+
+== Members
+
+[#enlistUpdating__ManagedObject_String_Object]
+=== enlistUpdating(ManagedObject, String, Object)
+
+An override of _EntityChangeTracker#enlistUpdating(ManagedObject)_ where the caller already knows the old value (and so the xref:refguide:core:index/transaction/changetracking/EntityChangeTracker.adoc[EntityChangeTracker] does not need to capture the old value itself.
+
+Introduced for JPA (EclipseLink implementation).
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/permission/dom/ApplicationPermissionRepository.adoc b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/permission/dom/ApplicationPermissionRepository.adoc
index a956ee9..848d7fb 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/permission/dom/ApplicationPermissionRepository.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/permission/dom/ApplicationPermissionRepository.adoc
@@ -20,6 +20,7 @@ interface ApplicationPermissionRepository {
   ApplicationPermission newPermissionNoCheck(ApplicationRole role, ApplicationPermissionRule rule, ApplicationPermissionMode mode, ApplicationFeatureSort sort, String featureFqn)     // <.>
   List<ApplicationPermission> findByUser(ApplicationUser applicationUser)
   List<ApplicationPermission> findByRole(ApplicationRole applicationRole)
+  List<ApplicationPermission> findByUserMemento(UserMemento user)     // <.>
 }
 ----
 
@@ -29,6 +30,11 @@ interface ApplicationPermissionRepository {
 --
 Intended for use by fixture scripts.
 --
+<.> xref:#findByUserMemento__UserMemento[findByUserMemento(UserMemento)]
++
+--
+To support impersonation by role
+--
 
 == Members
 
@@ -39,3 +45,8 @@ Intended for use by fixture scripts.
 === newPermissionNoCheck(ApplicationRole, ApplicationPermissionRule, ApplicationPermissionMode, ApplicationFeatureSort, String)
 
 Intended for use by fixture scripts.
+
+[#findByUserMemento__UserMemento]
+=== findByUserMemento(UserMemento)
+
+To support impersonation by role
diff --git a/antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/role/seed/IsisExtCommandReplayPrimaryRoleAndPermissions.adoc
similarity index 70%
copy from antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc
copy to antora/components/refguide-index/modules/extensions/pages/index/secman/applib/role/seed/IsisExtCommandReplayPrimaryRoleAndPermissions.adoc
index 46693d0..048fc1f 100644
--- a/antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/role/seed/IsisExtCommandReplayPrimaryRoleAndPermissions.adoc
@@ -1,16 +1,17 @@
-= WebModuleKeycloak
+= IsisExtCommandReplayPrimaryRoleAndPermissions
 :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 [...]
 
-WebModule to enable support for Keycloak.
+Access to the command replay primary menu.
 
 == API
 
 [source,java]
-.WebModuleKeycloak.java
+.IsisExtCommandReplayPrimaryRoleAndPermissions.java
 ----
-class WebModuleKeycloak {
-  WebModuleKeycloak(ServiceInjector serviceInjector)
-  Can<ServletContextListener> init(ServletContext ctx)
+class IsisExtCommandReplayPrimaryRoleAndPermissions {
+  public static final String NAMESPACE;
+  public static final String ROLE_NAME;
+  IsisExtCommandReplayPrimaryRoleAndPermissions()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/role/seed/IsisExtCommandReplaySecondaryRoleAndPermissions.adoc
similarity index 70%
copy from antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc
copy to antora/components/refguide-index/modules/extensions/pages/index/secman/applib/role/seed/IsisExtCommandReplaySecondaryRoleAndPermissions.adoc
index 46693d0..e9dcb2b 100644
--- a/antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/role/seed/IsisExtCommandReplaySecondaryRoleAndPermissions.adoc
@@ -1,16 +1,17 @@
-= WebModuleKeycloak
+= IsisExtCommandReplaySecondaryRoleAndPermissions
 :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 [...]
 
-WebModule to enable support for Keycloak.
+Access to the command replay secondary menu.
 
 == API
 
 [source,java]
-.WebModuleKeycloak.java
+.IsisExtCommandReplaySecondaryRoleAndPermissions.java
 ----
-class WebModuleKeycloak {
-  WebModuleKeycloak(ServiceInjector serviceInjector)
-  Can<ServletContextListener> init(ServletContext ctx)
+class IsisExtCommandReplaySecondaryRoleAndPermissions {
+  public static final String NAMESPACE;
+  public static final String ROLE_NAME;
+  IsisExtCommandReplaySecondaryRoleAndPermissions()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/user/fixtures/AbstractUserAndRolesFixtureScript.adoc b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/user/fixtures/AbstractUserAndRolesFixtureScript.adoc
index ea84753..8f92314 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/user/fixtures/AbstractUserAndRolesFixtureScript.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/user/fixtures/AbstractUserAndRolesFixtureScript.adoc
@@ -10,7 +10,9 @@ Convenience fixture script intended to be easily subclassed in order to set up a
 ----
 class AbstractUserAndRolesFixtureScript {
   AbstractUserAndRolesFixtureScript(final String username, final String password, final AccountType accountType, final Can<String> roleNames)
+  AbstractUserAndRolesFixtureScript(final Supplier<String> usernameSupplier, final Supplier<String> passwordSupplier, final Supplier<AccountType> accountTypeSupplier, final Supplier<Can<String>> roleNamesSupplier)
   AbstractUserAndRolesFixtureScript(final String username, final String password, final String emailAddress, final String tenancyPath, final AccountType accountType, final Can<String> roleNames)
+  AbstractUserAndRolesFixtureScript(final Supplier<String> usernameSupplier, final Supplier<String> passwordSupplier, final Supplier<String> emailAddressSupplier, final Supplier<String> tenancyPathSupplier, final Supplier<AccountType> accountTypeSupplier, final Supplier<Can<String>> roleNamesSupplier)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/AddressLine.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/AddressLine.adoc
new file mode 100644
index 0000000..b2ca907
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/AddressLine.adoc
@@ -0,0 +1,27 @@
+= @AddressLine
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing a line of an address.
+
+== API
+
+[source,java]
+.AddressLine.java
+----
+@interface AddressLine {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Description.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Description.adoc
new file mode 100644
index 0000000..fd9fa6b
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Description.adoc
@@ -0,0 +1,32 @@
+= @Description
+: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 [...]
+
+Meta-annotation for an optional _String_ property or parameter representing a description of some sort.
+
+== API
+
+[source,java]
+.Description.java
+----
+@interface Description {
+  int MAX_LENGTH;
+  int MULTI_LINE;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "true";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+  @AliasFor(annotation = PropertyLayout.class, attribute = "multiLine")
+int propertyLayoutMultiLine() default MULTI_LINE;
+  @AliasFor(annotation = ParameterLayout.class, attribute = "multiLine")
+int parameterLayoutMultiLine() default MULTI_LINE;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Email.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Email.adoc
new file mode 100644
index 0000000..07adfa4
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Email.adoc
@@ -0,0 +1,59 @@
+= @Email
+: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 [...]
+
+Meta-annotation for an optional _String_ property or parameter representing an email address.
+
+== API
+
+[source,java]
+.Email.java
+----
+@interface Email {
+  int MAX_LENGTH;     // <.>
+  String REGEX_PATTERN;     // <.>
+  String REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Property.class, attribute = "regexPattern")
+String propertyRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPattern")
+String parameterRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Property.class, attribute = "regexPatternReplacement")
+String propertyRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPatternReplacement")
+String parameterRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "true";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
+<.> xref:#MAX_LENGTH[MAX_LENGTH]
++
+--
+Seemaximum length of an email address.
+--
+<.> xref:#REGEX_PATTERN[REGEX_PATTERN]
++
+--
+as per http://emailregex.com/
+--
+
+== Members
+
+[#MAX_LENGTH]
+=== MAX_LENGTH
+
+Seemaximum length of an email address.
+
+[#REGEX_PATTERN]
+=== REGEX_PATTERN
+
+as per http://emailregex.com/
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Fqcn.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Fqcn.adoc
similarity index 55%
copy from antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Fqcn.adoc
copy to antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Fqcn.adoc
index 53f9bb1..4c87aaa 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Fqcn.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Fqcn.adoc
@@ -9,7 +9,19 @@ Meta-annotation for a _String_ property or parameter representing a fully qualif
 .Fqcn.java
 ----
 @interface Fqcn {
-  int MAX_LEN;
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/LogicalTypeName.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/LogicalTypeName.adoc
new file mode 100644
index 0000000..d4f2ae8
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/LogicalTypeName.adoc
@@ -0,0 +1,27 @@
+= @LogicalTypeName
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing a logical type name of a domain object (as per @ _DomainObject#logicalTypeName() DomainObject#logicalTypeName_ or @ _DomainService#logicalTypeName() DomainObject#logicalTypeName_ ).
+
+== API
+
+[source,java]
+.LogicalTypeName.java
+----
+@interface LogicalTypeName {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Money.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Money.adoc
new file mode 100644
index 0000000..1f82a6a
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Money.adoc
@@ -0,0 +1,30 @@
+= @Money
+: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 [...]
+
+Meta-annotation for an optional _java.math.BigDecimal_ property or parameter representing a monetary amount.
+
+== API
+
+[source,java]
+.Money.java
+----
+@interface Money {
+  int INTEGER;
+  int FRACTION;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "true";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default Money.INTEGER + Money.FRACTION;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "scale")
+int columnScale() default Money.FRACTION;
+  @AliasFor(annotation = javax.validation.constraints.Digits.class, attribute = "integer")
+int digitsInteger() default Money.INTEGER;
+  @AliasFor(annotation = javax.validation.constraints.Digits.class, attribute = "fraction")
+int digitsFraction() default Money.FRACTION;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Name.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Name.adoc
new file mode 100644
index 0000000..0525c39
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Name.adoc
@@ -0,0 +1,27 @@
+= @Name
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing a name of some sort.
+
+== API
+
+[source,java]
+.Name.java
+----
+@interface Name {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Notes.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Notes.adoc
new file mode 100644
index 0000000..046929e
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Notes.adoc
@@ -0,0 +1,32 @@
+= @Notes
+: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 [...]
+
+Meta-annotation for an optional _String_ property or parameter representing a notes or comments about some object.
+
+== API
+
+[source,java]
+.Notes.java
+----
+@interface Notes {
+  int MAX_LENGTH;
+  int MULTI_LINE;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "true";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+  @AliasFor(annotation = PropertyLayout.class, attribute = "multiLine")
+int propertyLayoutMultiLine() default MULTI_LINE;
+  @AliasFor(annotation = ParameterLayout.class, attribute = "multiLine")
+int parameterLayoutMultiLine() default MULTI_LINE;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/ObjectIdentifier.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/ObjectIdentifier.adoc
new file mode 100644
index 0000000..5c57519
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/ObjectIdentifier.adoc
@@ -0,0 +1,27 @@
+= @ObjectIdentifier
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing a the identity of a domain object (with respect to its logical type, as per @ _DomainObject#logicalTypeName() DomainObject#logicalTypeName_ or @ _DomainService#logicalTypeName() DomainObject#logicalTypeName_ ).
+
+== API
+
+[source,java]
+.ObjectIdentifier.java
+----
+@interface ObjectIdentifier {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Percentage.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Percentage.adoc
new file mode 100644
index 0000000..23f84ad
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Percentage.adoc
@@ -0,0 +1,30 @@
+= @Percentage
+: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 [...]
+
+Meta-annotation for an optional _java.math.BigDecimal_ property or parameter representing a percentage amount.
+
+== API
+
+[source,java]
+.Percentage.java
+----
+@interface Percentage {
+  int INTEGER;
+  int FRACTION;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "true";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default Percentage.INTEGER + Percentage.FRACTION;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "scale")
+int columnScale() default Percentage.FRACTION;
+  @AliasFor(annotation = javax.validation.constraints.Digits.class, attribute = "integer")
+int digitsInteger() default Percentage.INTEGER;
+  @AliasFor(annotation = javax.validation.constraints.Digits.class, attribute = "fraction")
+int digitsFraction() default Percentage.FRACTION;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/PhoneNumber.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/PhoneNumber.adoc
new file mode 100644
index 0000000..5d97c15
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/PhoneNumber.adoc
@@ -0,0 +1,37 @@
+= @PhoneNumber
+: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 [...]
+
+Meta-annotation for an optional _String_ property or parameter representing a phone number.
+
+== API
+
+[source,java]
+.PhoneNumber.java
+----
+@interface PhoneNumber {
+  int MAX_LENGTH;
+  String REGEX_PATTERN;
+  String REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Property.class, attribute = "regexPattern")
+String propertyRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPattern")
+String parameterRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Property.class, attribute = "regexPatternReplacement")
+String propertyRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPatternReplacement")
+String parameterRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "true";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/PostalCode.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/PostalCode.adoc
new file mode 100644
index 0000000..7a66076
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/PostalCode.adoc
@@ -0,0 +1,27 @@
+= @PostalCode
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing a postal code or zip code.
+
+== API
+
+[source,java]
+.PostalCode.java
+----
+@interface PostalCode {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/ProperName.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/ProperName.adoc
new file mode 100644
index 0000000..a3a1606
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/ProperName.adoc
@@ -0,0 +1,27 @@
+= @ProperName
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing the "proper" (or formal) name of some sort.
+
+== API
+
+[source,java]
+.ProperName.java
+----
+@interface ProperName {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Reference.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Reference.adoc
new file mode 100644
index 0000000..9799d1c
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Reference.adoc
@@ -0,0 +1,37 @@
+= @Reference
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing A unique reference code of some sort, restricted to capitals, numbers and '_', '/' and '-'.
+
+== API
+
+[source,java]
+.Reference.java
+----
+@interface Reference {
+  int MAX_LENGTH;
+  String REGEX_PATTERN;
+  String REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Property.class, attribute = "regexPattern")
+String propertyRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPattern")
+String parameterRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Property.class, attribute = "regexPatternReplacement")
+String propertyRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPatternReplacement")
+String parameterRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Title.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Title.adoc
new file mode 100644
index 0000000..b05affd
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Title.adoc
@@ -0,0 +1,27 @@
+= @Title
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing a title (or perhaps label) of some sort.
+
+== API
+
+[source,java]
+.Title.java
+----
+@interface Title {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/UrlTemplate.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/UrlTemplate.adoc
new file mode 100644
index 0000000..50c462c
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/UrlTemplate.adoc
@@ -0,0 +1,27 @@
+= @UrlTemplate
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing a URL template, for example for an entity that holds configuration data to access external systems.
+
+== API
+
+[source,java]
+.UrlTemplate.java
+----
+@interface UrlTemplate {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Username.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Username.adoc
new file mode 100644
index 0000000..1e39bb5
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/applib/types/Username.adoc
@@ -0,0 +1,27 @@
+= @Username
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing the unique username (or login name) of a user of the system.
+
+== API
+
+[source,java]
+.Username.java
+----
+@interface Username {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "allowsNull")
+String columnAllowsNull() default "false";
+  @AliasFor(annotation = javax.jdo.annotations.Column.class, attribute = "length")
+int columnLength() default MAX_LENGTH;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/IsisEntityListener.adoc
similarity index 70%
copy from antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc
copy to antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/IsisEntityListener.adoc
index d65ff10..4dd78e8 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/IsisEntityListener.adoc
@@ -1,7 +1,7 @@
-= JpaEntityInjectionPointResolver
+= IsisEntityListener
 :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 [...]
 
-EntityListener class for listing with the _javax.persistence.EntityListeners_ annotation, to support injection point resolving for entities.
+EntityListener class for listing with the _javax.persistence.EntityListeners_ annotation, to support injection point resolving for entities, and to notify xref:refguide:core:index/transaction/changetracking/EntityChangeTracker.adoc[EntityChangeTracker] of changes.
 
 Instances of this class are not managed by Spring, but by the persistence layer.
 
@@ -10,9 +10,16 @@ The particular persistence layer implementation in use needs to be configured, w
 == API
 
 [source,java]
-.JpaEntityInjectionPointResolver.java
+.IsisEntityListener.java
 ----
-class JpaEntityInjectionPointResolver {
+class IsisEntityListener {
+  void onPrePersist(Object entityPojo)
+  void onPreUpdate(Object entityPojo)
+  void onPreRemove(Object entityPojo)
+  void onPostPersist(Object entityPojo)
+  void onPostUpdate(Object entityPojo)
+  void onPostRemove(Object entityPojo)
+  void onPostLoad(Object entityPojo)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/types/BlobJpaEmbeddable.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/types/BlobJpaEmbeddable.adoc
new file mode 100644
index 0000000..aa44d51
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/types/BlobJpaEmbeddable.adoc
@@ -0,0 +1,46 @@
+= BlobJpaEmbeddable
+: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 utility class to enable the persisting of xref:refguide:applib:index/value/Blob.adoc[Blob] s.
+
+Although JPA supports custom value types, these can only be for simple values; seeeclipse-ee4j/jpa-api/issues/105.
+
+EclipseLink _does_ provide its own extension,
+
+== API
+
+[source,java]
+.BlobJpaEmbeddable.java
+----
+class BlobJpaEmbeddable {
+  BlobJpaEmbeddable fromBlob(Blob blob)     // <.>
+  Blob toBlob(final BlobJpaEmbeddable blobJpaEmbeddable)     // <.>
+  Blob asBlob()
+  String toString()
+  boolean equals(final Object o)
+  int hashCode()
+}
+----
+
+<.> xref:#fromBlob__Blob[fromBlob(Blob)]
++
+--
+Factory method to marshall a xref:refguide:applib:index/value/Blob.adoc[Blob] into a xref:refguide:persistence:index/jpa/applib/types/BlobJpaEmbeddable.adoc[BlobJpaEmbeddable]
+--
+<.> xref:#toBlob__BlobJpaEmbeddable[toBlob(BlobJpaEmbeddable)]
++
+--
+Reciprocal method to marshall a xref:refguide:persistence:index/jpa/applib/types/BlobJpaEmbeddable.adoc[BlobJpaEmbeddable] into a xref:refguide:applib:index/value/Blob.adoc[Blob]
+--
+
+== Members
+
+[#fromBlob__Blob]
+=== fromBlob(Blob)
+
+Factory method to marshall a xref:refguide:applib:index/value/Blob.adoc[Blob] into a xref:refguide:persistence:index/jpa/applib/types/BlobJpaEmbeddable.adoc[BlobJpaEmbeddable]
+
+[#toBlob__BlobJpaEmbeddable]
+=== toBlob(BlobJpaEmbeddable)
+
+Reciprocal method to marshall a xref:refguide:persistence:index/jpa/applib/types/BlobJpaEmbeddable.adoc[BlobJpaEmbeddable] into a xref:refguide:applib:index/value/Blob.adoc[Blob]
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/types/ClobJpaEmbeddable.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/types/ClobJpaEmbeddable.adoc
new file mode 100644
index 0000000..0a04474
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/types/ClobJpaEmbeddable.adoc
@@ -0,0 +1,46 @@
+= ClobJpaEmbeddable
+: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 utility class to enable the persisting of xref:refguide:applib:index/value/Clob.adoc[Clob] s.
+
+Although JPA supports custom value types, these can only be for simple values; seeeclipse-ee4j/jpa-api/issues/105.
+
+EclipseLink _does_ provide its own extension,
+
+== API
+
+[source,java]
+.ClobJpaEmbeddable.java
+----
+class ClobJpaEmbeddable {
+  ClobJpaEmbeddable fromClob(Clob clob)     // <.>
+  Clob toClob(final ClobJpaEmbeddable clobJpaEmbeddable)     // <.>
+  Clob asClob()
+  String toString()
+  boolean equals(final Object o)
+  int hashCode()
+}
+----
+
+<.> xref:#fromClob__Clob[fromClob(Clob)]
++
+--
+Factory method to marshall a xref:refguide:applib:index/value/Clob.adoc[Clob] into a xref:refguide:persistence:index/jpa/applib/types/ClobJpaEmbeddable.adoc[ClobJpaEmbeddable]
+--
+<.> xref:#toClob__ClobJpaEmbeddable[toClob(ClobJpaEmbeddable)]
++
+--
+Reciprocal method to marshall a xref:refguide:persistence:index/jpa/applib/types/ClobJpaEmbeddable.adoc[ClobJpaEmbeddable] into a xref:refguide:applib:index/value/Clob.adoc[Clob]
+--
+
+== Members
+
+[#fromClob__Clob]
+=== fromClob(Clob)
+
+Factory method to marshall a xref:refguide:applib:index/value/Clob.adoc[Clob] into a xref:refguide:persistence:index/jpa/applib/types/ClobJpaEmbeddable.adoc[ClobJpaEmbeddable]
+
+[#toClob__ClobJpaEmbeddable]
+=== toClob(ClobJpaEmbeddable)
+
+Reciprocal method to marshall a xref:refguide:persistence:index/jpa/applib/types/ClobJpaEmbeddable.adoc[ClobJpaEmbeddable] into a xref:refguide:applib:index/value/Clob.adoc[Clob]
diff --git a/antora/components/refguide-index/modules/security/pages/index/keycloak/IsisModuleSecurityKeycloak.adoc b/antora/components/refguide-index/modules/security/pages/index/keycloak/IsisModuleSecurityKeycloak.adoc
index 2e668e1..1280680 100644
--- a/antora/components/refguide-index/modules/security/pages/index/keycloak/IsisModuleSecurityKeycloak.adoc
+++ b/antora/components/refguide-index/modules/security/pages/index/keycloak/IsisModuleSecurityKeycloak.adoc
@@ -1,7 +1,7 @@
 = IsisModuleSecurityKeycloak
 :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 [...]
 
-Configuration Bean to support Isis Security using Shiro.
+Configuration Bean to support Isis Security using Keycloak.
 
 == API
 
@@ -9,6 +9,8 @@ Configuration Bean to support Isis Security using Shiro.
 .IsisModuleSecurityKeycloak.java
 ----
 class IsisModuleSecurityKeycloak {
+  WebSecurityConfigurerAdapter webSecurityConfigurer(final IsisConfiguration isisConfiguration, final KeycloakOauth2UserService keycloakOidcUserService, final List<LoginSuccessHandlerUNUSED> loginSuccessHandlersUNUSED, final List<LogoutHandler> logoutHandlers)
+  KeycloakOauth2UserService keycloakOidcUserService(OAuth2ClientProperties oauth2ClientProperties)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/security/pages/index/keycloak/authentication/AuthenticatorKeycloak.adoc b/antora/components/refguide-index/modules/security/pages/index/keycloak/authentication/AuthenticatorKeycloak.adoc
deleted file mode 100644
index 9123b36..0000000
--- a/antora/components/refguide-index/modules/security/pages/index/keycloak/authentication/AuthenticatorKeycloak.adoc
+++ /dev/null
@@ -1,15 +0,0 @@
-= AuthenticatorKeycloak
-: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]
-.AuthenticatorKeycloak.java
-----
-class AuthenticatorKeycloak {
-  boolean canAuthenticate(final Class<? extends AuthenticationRequest> authenticationRequestClass)
-  InteractionContext authenticate(final AuthenticationRequest request, final String code)
-  void logout(final InteractionContext session)
-}
-----
-
diff --git a/antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/KeycloakFilter.adoc b/antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/KeycloakFilter.adoc
deleted file mode 100644
index 24d6009..0000000
--- a/antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/KeycloakFilter.adoc
+++ /dev/null
@@ -1,15 +0,0 @@
-= KeycloakFilter
-: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]
-.KeycloakFilter.java
-----
-class KeycloakFilter {
-  void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain)
-  List<String> toClaims(final String claimsHeader)
-  List<String> asRoles(String claimsHeader)
-}
-----
-
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/AddressLine.adoc
similarity index 54%
copy from antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc
copy to antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/AddressLine.adoc
index d65ff10..e55b2e9 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/AddressLine.adoc
@@ -1,18 +1,23 @@
-= JpaEntityInjectionPointResolver
+= @AddressLine
 :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 [...]
 
-EntityListener class for listing with the _javax.persistence.EntityListeners_ annotation, to support injection point resolving for entities.
-
-Instances of this class are not managed by Spring, but by the persistence layer.
-
-The particular persistence layer implementation in use needs to be configured, with a BeanManager, that is able to resolve injection points for this EntityListener.
+Meta-annotation for a mandatory _String_ property or parameter representing a line of an address.
 
 == API
 
 [source,java]
-.JpaEntityInjectionPointResolver.java
+.AddressLine.java
 ----
-class JpaEntityInjectionPointResolver {
+@interface AddressLine {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Description.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Description.adoc
index 0701c9f..e49e001 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Description.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Description.adoc
@@ -1,7 +1,7 @@
 = @Description
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing a description of some sort.
+Meta-annotation for an optional _String_ property or parameter representing a description of some sort.
 
 == API
 
@@ -9,8 +9,20 @@ Meta-annotation for a _String_ property or parameter representing a description
 .Description.java
 ----
 @interface Description {
-  int MAX_LEN;
+  int MAX_LENGTH;
   int MULTI_LINE;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = PropertyLayout.class, attribute = "multiLine")
+int propertyLayoutMultiLine() default MULTI_LINE;
+  @AliasFor(annotation = ParameterLayout.class, attribute = "multiLine")
+int parameterLayoutMultiLine() default MULTI_LINE;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Email.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Email.adoc
new file mode 100644
index 0000000..84ed1be
--- /dev/null
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Email.adoc
@@ -0,0 +1,55 @@
+= @Email
+: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 [...]
+
+Meta-annotation for an optional _String_ property or parameter representing an email address.
+
+== API
+
+[source,java]
+.Email.java
+----
+@interface Email {
+  int MAX_LENGTH;     // <.>
+  String REGEX_PATTERN;     // <.>
+  String REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Property.class, attribute = "regexPattern")
+String propertyRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPattern")
+String parameterRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Property.class, attribute = "regexPatternReplacement")
+String propertyRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPatternReplacement")
+String parameterRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+}
+----
+
+<.> xref:#MAX_LENGTH[MAX_LENGTH]
++
+--
+Seemaximum length of an email address.
+--
+<.> xref:#REGEX_PATTERN[REGEX_PATTERN]
++
+--
+as per http://emailregex.com/
+--
+
+== Members
+
+[#MAX_LENGTH]
+=== MAX_LENGTH
+
+Seemaximum length of an email address.
+
+[#REGEX_PATTERN]
+=== REGEX_PATTERN
+
+as per http://emailregex.com/
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Fqcn.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Fqcn.adoc
index 53f9bb1..caf5ebd 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Fqcn.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Fqcn.adoc
@@ -9,7 +9,15 @@ Meta-annotation for a _String_ property or parameter representing a fully qualif
 .Fqcn.java
 ----
 @interface Fqcn {
-  int MAX_LEN;
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/LogicalTypeName.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/LogicalTypeName.adoc
new file mode 100644
index 0000000..1e01c36
--- /dev/null
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/LogicalTypeName.adoc
@@ -0,0 +1,23 @@
+= @LogicalTypeName
+: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 [...]
+
+Meta-annotation for a mandatory _String_ property or parameter representing a logical type name of a domain object (as per @ _DomainObject#logicalTypeName() DomainObject#logicalTypeName_ or @ _DomainService#logicalTypeName() DomainObject#logicalTypeName_ ).
+
+== API
+
+[source,java]
+.LogicalTypeName.java
+----
+@interface LogicalTypeName {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Money.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Money.adoc
index 58d638c..027b983 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Money.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Money.adoc
@@ -1,7 +1,7 @@
 = @Money
 :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 [...]
 
-Meta-annotation for a _java.math.BigDecimal_ property or parameter representing a monetary amount.
+Meta-annotation for an optional _java.math.BigDecimal_ property or parameter representing a monetary amount.
 
 == API
 
@@ -9,7 +9,16 @@ Meta-annotation for a _java.math.BigDecimal_ property or parameter representing
 .Money.java
 ----
 @interface Money {
-  int SCALE;
+  int INTEGER;
+  int FRACTION;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = javax.validation.constraints.Digits.class, attribute = "integer")
+int digitsInteger() default Money.INTEGER;
+  @AliasFor(annotation = javax.validation.constraints.Digits.class, attribute = "fraction")
+int digitsFraction() default Money.FRACTION;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc
index b738171..2bc5e57 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc
@@ -1,7 +1,7 @@
 = @Name
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing a name of some sort.
+Meta-annotation for a mandatory _String_ property or parameter representing a name of some sort.
 
 == API
 
@@ -9,7 +9,15 @@ Meta-annotation for a _String_ property or parameter representing a name of some
 .Name.java
 ----
 @interface Name {
-  int MAX_LEN;
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Notes.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Notes.adoc
index 0f20f4e..2135c54 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Notes.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Notes.adoc
@@ -1,7 +1,7 @@
 = @Notes
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing a notes or comments about some object.
+Meta-annotation for an optional _String_ property or parameter representing a notes or comments about some object.
 
 == API
 
@@ -9,8 +9,20 @@ Meta-annotation for a _String_ property or parameter representing a notes or com
 .Notes.java
 ----
 @interface Notes {
-  int MAX_LEN;
+  int MAX_LENGTH;
   int MULTI_LINE;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = PropertyLayout.class, attribute = "multiLine")
+int propertyLayoutMultiLine() default MULTI_LINE;
+  @AliasFor(annotation = ParameterLayout.class, attribute = "multiLine")
+int parameterLayoutMultiLine() default MULTI_LINE;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/ObjectIdentifier.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/ObjectIdentifier.adoc
index 9f59cb3..6f000bd 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/ObjectIdentifier.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/ObjectIdentifier.adoc
@@ -1,7 +1,7 @@
 = @ObjectIdentifier
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing a the identity of a domain object (with respect to its logical type).
+Meta-annotation for a mandatory _String_ property or parameter representing a the identity of a domain object (with respect to its logical type, as per @ _DomainObject#logicalTypeName() DomainObject#logicalTypeName_ or @ _DomainService#logicalTypeName() DomainObject#logicalTypeName_ ).
 
 == API
 
@@ -9,7 +9,15 @@ Meta-annotation for a _String_ property or parameter representing a the identity
 .ObjectIdentifier.java
 ----
 @interface ObjectIdentifier {
-  int MAX_LEN;
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Percentage.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Percentage.adoc
index ab6b410..6812296 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Percentage.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Percentage.adoc
@@ -1,7 +1,7 @@
 = @Percentage
 :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 [...]
 
-Meta-annotation for a numeric property or parameter representing a the identity of a domain object (with respect to its logical type).
+Meta-annotation for an optional _java.math.BigDecimal_ property or parameter representing a percentage amount.
 
 == API
 
@@ -9,7 +9,16 @@ Meta-annotation for a numeric property or parameter representing a the identity
 .Percentage.java
 ----
 @interface Percentage {
-  int SCALE;
+  int INTEGER;
+  int FRACTION;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = javax.validation.constraints.Digits.class, attribute = "integer")
+int digitsInteger() default Money.INTEGER;
+  @AliasFor(annotation = javax.validation.constraints.Digits.class, attribute = "fraction")
+int digitsFraction() default Money.FRACTION;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/PhoneNumber.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/PhoneNumber.adoc
new file mode 100644
index 0000000..b918984
--- /dev/null
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/PhoneNumber.adoc
@@ -0,0 +1,33 @@
+= @PhoneNumber
+: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 [...]
+
+Meta-annotation for an optional _String_ property or parameter representing a phone number.
+
+== API
+
+[source,java]
+.PhoneNumber.java
+----
+@interface PhoneNumber {
+  int MAX_LENGTH;
+  String REGEX_PATTERN;
+  String REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Property.class, attribute = "regexPattern")
+String propertyRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPattern")
+String parameterRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Property.class, attribute = "regexPatternReplacement")
+String propertyRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPatternReplacement")
+String parameterRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+}
+----
+
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/PostalCode.adoc
similarity index 54%
rename from antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc
rename to antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/PostalCode.adoc
index d65ff10..a5ece97 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/PostalCode.adoc
@@ -1,18 +1,23 @@
-= JpaEntityInjectionPointResolver
+= @PostalCode
 :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 [...]
 
-EntityListener class for listing with the _javax.persistence.EntityListeners_ annotation, to support injection point resolving for entities.
-
-Instances of this class are not managed by Spring, but by the persistence layer.
-
-The particular persistence layer implementation in use needs to be configured, with a BeanManager, that is able to resolve injection points for this EntityListener.
+Meta-annotation for a mandatory _String_ property or parameter representing a postal code or zip code.
 
 == API
 
 [source,java]
-.JpaEntityInjectionPointResolver.java
+.PostalCode.java
 ----
-class JpaEntityInjectionPointResolver {
+@interface PostalCode {
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/ProperName.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/ProperName.adoc
index a7a353a..47df767 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/ProperName.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/ProperName.adoc
@@ -1,7 +1,7 @@
 = @ProperName
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing the "proper" (or formal) name of some sort.
+Meta-annotation for a mandatory _String_ property or parameter representing the "proper" (or formal) name of some sort.
 
 == API
 
@@ -9,7 +9,15 @@ Meta-annotation for a _String_ property or parameter representing the "proper" (
 .ProperName.java
 ----
 @interface ProperName {
-  int MAX_LEN;
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Reference.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Reference.adoc
index 9430f4b..0381c69 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Reference.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Reference.adoc
@@ -1,7 +1,7 @@
 = @Reference
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing A unique reference code of some sort.
+Meta-annotation for a mandatory _String_ property or parameter representing A unique reference code of some sort, restricted to capitals, numbers and '_', '/' and '-'.
 
 == API
 
@@ -9,9 +9,25 @@ Meta-annotation for a _String_ property or parameter representing A unique refer
 .Reference.java
 ----
 @interface Reference {
-  int MAX_LEN;
-  String REGEX;
-  String REGEX_DESCRIPTION;
+  int MAX_LENGTH;
+  String REGEX_PATTERN;
+  String REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.OPTIONAL;
+  @AliasFor(annotation = Property.class, attribute = "regexPattern")
+String propertyRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPattern")
+String parameterRegexPattern() default REGEX_PATTERN;
+  @AliasFor(annotation = Property.class, attribute = "regexPatternReplacement")
+String propertyRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
+  @AliasFor(annotation = Parameter.class, attribute = "regexPatternReplacement")
+String parameterRegexPatternReplacement() default REGEX_PATTERN_REPLACEMENT;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Title.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Title.adoc
index 6156a11..7ade8bb 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Title.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Title.adoc
@@ -1,7 +1,7 @@
 = @Title
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing a title (or perhaps label) of some sort.
+Meta-annotation for a mandatory _String_ property or parameter representing a title (or perhaps label) of some sort.
 
 == API
 
@@ -9,7 +9,15 @@ Meta-annotation for a _String_ property or parameter representing a title (or pe
 .Title.java
 ----
 @interface Title {
-  int MAX_LEN;
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/UrlTemplate.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/UrlTemplate.adoc
index d1abe04..59aaa4c 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/UrlTemplate.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/UrlTemplate.adoc
@@ -1,7 +1,7 @@
 = @UrlTemplate
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing a URL template, for example for an entity that holds configuration data to access external systems.
+Meta-annotation for a mandatory _String_ property or parameter representing a URL template, for example for an entity that holds configuration data to access external systems.
 
 == API
 
@@ -9,7 +9,15 @@ Meta-annotation for a _String_ property or parameter representing a URL template
 .UrlTemplate.java
 ----
 @interface UrlTemplate {
-  int MAX_LEN;
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Username.adoc b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Username.adoc
index 450d857..2bb4f43 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Username.adoc
+++ b/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Username.adoc
@@ -1,7 +1,7 @@
 = @Username
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing the unique username (or login name) of a user of the system.
+Meta-annotation for a mandatory _String_ property or parameter representing the unique username (or login name) of a user of the system.
 
 == API
 
@@ -9,7 +9,15 @@ Meta-annotation for a _String_ property or parameter representing the unique use
 .Username.java
 ----
 @interface Username {
-  int MAX_LEN;
+  int MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "maxLength")
+int propertyMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Parameter.class, attribute = "maxLength")
+int parameterMaxLength() default MAX_LENGTH;
+  @AliasFor(annotation = Property.class, attribute = "optionality")
+Optionality propertyOptionality() default Optionality.MANDATORY;
+  @AliasFor(annotation = Parameter.class, attribute = "optionality")
+Optionality parameterOptionality() default Optionality.MANDATORY;
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/IsisModuleTestingArchTestSupportApplib.adoc
similarity index 85%
copy from antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc
copy to antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/IsisModuleTestingArchTestSupportApplib.adoc
index b738171..1567865 100644
--- a/antora/components/refguide-index/modules/subdomains/pages/index/base/applib/types/Name.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/IsisModuleTestingArchTestSupportApplib.adoc
@@ -1,15 +1,12 @@
-= @Name
+= IsisModuleTestingArchTestSupportApplib
 :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 [...]
 
-Meta-annotation for a _String_ property or parameter representing a name of some sort.
-
 == API
 
 [source,java]
-.Name.java
+.IsisModuleTestingArchTestSupportApplib.java
 ----
-@interface Name {
-  int MAX_LEN;
+class IsisModuleTestingArchTestSupportApplib {
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureDomainRules.adoc b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureDomainRules.adoc
new file mode 100644
index 0000000..14dc838
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureDomainRules.adoc
@@ -0,0 +1,196 @@
+= ArchitectureDomainRules
+: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 library of architecture tests to ensure coding conventions are followed for domain classes, for example as annotated with xref:refguide:applib:index/annotation/DomainObject.adoc[DomainObject] or xref:refguide:applib:index/annotation/DomainService.adoc[DomainService] but also more generally, for example repositories that are not necessarily part of the framework's metamodel.
+
+== API
+
+[source,java]
+.ArchitectureDomainRules.java
+----
+class ArchitectureDomainRules {
+  ArchRule every_DomainObject_must_specify_logicalTypeName()     // <.>
+  ArchRule every_DomainService_must_specify_logicalTypeName()     // <.>
+  ArchRule every_DomainObject_must_also_be_annotated_with_DomainObjectLayout()     // <.>
+  ArchRule every_DomainService_must_also_be_annotated_with_DomainServiceLayout()     // <.>
+  DescribedPredicate<JavaAnnotation<?>> DomainService_logicalTypeName()
+  DescribedPredicate<JavaAnnotation<?>> DomainObject_logicalTypeName()
+  DescribedPredicate<JavaAnnotation<?>> DomainXxx_logicalTypeName(final Class<? extends Annotation> annotationClass)
+  ArchRule every_Action_mixin_must_follow_naming_convention()     // <.>
+  ArchRule every_Property_mixin_must_follow_naming_convention()     // <.>
+  ArchRule every_Collection_mixin_must_follow_naming_convention()     // <.>
+  ArchRule every_Repository_must_follow_naming_conventions()     // <.>
+  ArchRule every_Controller_must_be_follow_naming_conventions()     // <.>
+  ArchRule every_class_named_Repository_must_be_annotated_correctly()     // <.>
+  ArchRule every_class_named_Controller_must_be_annotated_correctly()     // <.>
+  ArchRule every_injected_field_of_jaxb_view_model_must_be_annotated_with_XmlTransient()     // <.>
+  ArchRule every_injected_field_of_serializable_view_model_must_be_transient()     // <.>
+  ArchRule every_finder_method_in_Repository_must_return_either_Collection_or_Optional()     // <.>
+  DescribedPredicate<JavaClass> eitherOptionalOrCollection()
+}
+----
+
+<.> xref:#every_DomainObject_must_specify_logicalTypeName__[every_DomainObject_must_specify_logicalTypeName()]
++
+--
+This rule requires that classes annotated with the xref:refguide:applib:index/annotation/DomainObject.adoc[DomainObject] annotation must specify their _DomainObject#logicalTypeName() logicalTypeName_ .
+--
+<.> xref:#every_DomainService_must_specify_logicalTypeName__[every_DomainService_must_specify_logicalTypeName()]
++
+--
+This rule requires that classes annotated with the xref:refguide:applib:index/annotation/DomainService.adoc[DomainService] annotation must specify their _DomainService#logicalTypeName() logicalTypeName_ .
+--
+<.> xref:#every_DomainObject_must_also_be_annotated_with_DomainObjectLayout__[every_DomainObject_must_also_be_annotated_with_DomainObjectLayout()]
++
+--
+This rule requires that classes annotated with the xref:refguide:applib:index/annotation/DomainObject.adoc[DomainObject] annotation must also be annotated with the xref:refguide:applib:index/annotation/DomainObjectLayout.adoc[DomainObjectLayout] annotation.
+--
+<.> xref:#every_DomainService_must_also_be_annotated_with_DomainServiceLayout__[every_DomainService_must_also_be_annotated_with_DomainServiceLayout()]
++
+--
+This rule requires that classes annotated with the xref:refguide:applib:index/annotation/DomainService.adoc[DomainService] annotation must also be annotated with the xref:refguide:applib:index/annotation/DomainServiceLayout.adoc[DomainServiceLayout] annotation.
+--
+<.> xref:#every_Action_mixin_must_follow_naming_convention__[every_Action_mixin_must_follow_naming_convention()]
++
+--
+This rule requires that action mixin classes should follow the naming convention `ClassName_actionId` , where the `ClassName` is the parameter type of a 1-arg constructor. In addition, there should be a method to be invoked for the method (typically "act", but checked against _DomainObject#mixinMethod() @DomainObject#mixinMethod_ if overridden.
+--
+<.> xref:#every_Property_mixin_must_follow_naming_convention__[every_Property_mixin_must_follow_naming_convention()]
++
+--
+This rule requires that action mixin classes should follow the naming convention `ClassName_propertyId` , where the `ClassName` is the parameter type of a 1-arg constructor. In addition, there should be a method to be invoked for the method (typically "prop", but checked against _DomainObject#mixinMethod() @DomainObject#mixinMethod_ if overridden.
+--
+<.> xref:#every_Collection_mixin_must_follow_naming_convention__[every_Collection_mixin_must_follow_naming_convention()]
++
+--
+This rule requires that action mixin classes should follow the naming convention `ClassName_collectionId` , where the `ClassName` is the parameter type of a 1-arg constructor. In addition, there should be a method to be invoked for the method (typically "coll", but checked against _DomainObject#mixinMethod() @DomainObject#mixinMethod_ if overridden.
+--
+<.> xref:#every_Repository_must_follow_naming_conventions__[every_Repository_must_follow_naming_conventions()]
++
+--
+This rule requires that classes annotated with the _Repository_ annotation should follow the naming convention `XxxRepository` .
+--
+<.> xref:#every_Controller_must_be_follow_naming_conventions__[every_Controller_must_be_follow_naming_conventions()]
++
+--
+This rule requires that classes annotated with the _org.springframework.stereotype.Controller_ annotation should follow the naming convention `XxxController` .
+--
+<.> xref:#every_class_named_Repository_must_be_annotated_correctly__[every_class_named_Repository_must_be_annotated_correctly()]
++
+--
+This rule requires that classes named `XxxRepository` should also be annotated with the _org.springframework.stereotype.Repository_ annotation.
+--
+<.> xref:#every_class_named_Controller_must_be_annotated_correctly__[every_class_named_Controller_must_be_annotated_correctly()]
++
+--
+This rule requires that classes named `XxxController` should also be annotated with the _org.springframework.stereotype.Controller_ annotation.
+--
+<.> xref:#every_injected_field_of_jaxb_view_model_must_be_annotated_with_XmlTransient__[every_injected_field_of_jaxb_view_model_must_be_annotated_with_XmlTransient()]
++
+--
+This rule requires that injected fields in jaxb view models (that is, classes annotated with the JAXB _javax.xml.bind.annotation.XmlRootElement_ annotation) must also be annotated with JAXB _javax.xml.bind.annotation.XmlTransient_ annotation.
+--
+<.> xref:#every_injected_field_of_serializable_view_model_must_be_transient__[every_injected_field_of_serializable_view_model_must_be_transient()]
++
+--
+This rule requires that injected fields in jaxb view models (that is, classes annotated with the JAXB _javax.xml.bind.annotation.XmlRootElement_ annotation) must also be annotated with JAXB _javax.xml.bind.annotation.XmlTransient_ annotation.
+--
+<.> xref:#every_finder_method_in_Repository_must_return_either_Collection_or_Optional__[every_finder_method_in_Repository_must_return_either_Collection_or_Optional()]
++
+--
+This rule requires that finders of repos reutrn either _java.util.Collection_ s or _java.util.Optional_ s.
+--
+
+== Members
+
+[#every_DomainObject_must_specify_logicalTypeName__]
+=== every_DomainObject_must_specify_logicalTypeName()
+
+This rule requires that classes annotated with the xref:refguide:applib:index/annotation/DomainObject.adoc[DomainObject] annotation must specify their _DomainObject#logicalTypeName() logicalTypeName_ .
+
+[#every_DomainService_must_specify_logicalTypeName__]
+=== every_DomainService_must_specify_logicalTypeName()
+
+This rule requires that classes annotated with the xref:refguide:applib:index/annotation/DomainService.adoc[DomainService] annotation must specify their _DomainService#logicalTypeName() logicalTypeName_ .
+
+[#every_DomainObject_must_also_be_annotated_with_DomainObjectLayout__]
+=== every_DomainObject_must_also_be_annotated_with_DomainObjectLayout()
+
+This rule requires that classes annotated with the xref:refguide:applib:index/annotation/DomainObject.adoc[DomainObject] annotation must also be annotated with the xref:refguide:applib:index/annotation/DomainObjectLayout.adoc[DomainObjectLayout] annotation.
+
+[#every_DomainService_must_also_be_annotated_with_DomainServiceLayout__]
+=== every_DomainService_must_also_be_annotated_with_DomainServiceLayout()
+
+This rule requires that classes annotated with the xref:refguide:applib:index/annotation/DomainService.adoc[DomainService] annotation must also be annotated with the xref:refguide:applib:index/annotation/DomainServiceLayout.adoc[DomainServiceLayout] annotation.
+
+[#every_Action_mixin_must_follow_naming_convention__]
+=== every_Action_mixin_must_follow_naming_convention()
+
+This rule requires that action mixin classes should follow the naming convention `ClassName_actionId` , where the `ClassName` is the parameter type of a 1-arg constructor. In addition, there should be a method to be invoked for the method (typically "act", but checked against _DomainObject#mixinMethod() @DomainObject#mixinMethod_ if overridden.
+
+The rationale is so that the pattern is easy to spot and to search for, with common programming model errors detected during unit testing rather tha relying on integration testing.
+
+[#every_Property_mixin_must_follow_naming_convention__]
+=== every_Property_mixin_must_follow_naming_convention()
+
+This rule requires that action mixin classes should follow the naming convention `ClassName_propertyId` , where the `ClassName` is the parameter type of a 1-arg constructor. In addition, there should be a method to be invoked for the method (typically "prop", but checked against _DomainObject#mixinMethod() @DomainObject#mixinMethod_ if overridden.
+
+The rationale is so that the pattern is easy to spot and to search for, with common programming model errors detected during unit testing rather tha relying on integration testing.
+
+[#every_Collection_mixin_must_follow_naming_convention__]
+=== every_Collection_mixin_must_follow_naming_convention()
+
+This rule requires that action mixin classes should follow the naming convention `ClassName_collectionId` , where the `ClassName` is the parameter type of a 1-arg constructor. In addition, there should be a method to be invoked for the method (typically "coll", but checked against _DomainObject#mixinMethod() @DomainObject#mixinMethod_ if overridden.
+
+The rationale is so that the pattern is easy to spot and to search for, with common programming model errors detected during unit testing rather tha relying on integration testing.
+
+[#every_Repository_must_follow_naming_conventions__]
+=== every_Repository_must_follow_naming_conventions()
+
+This rule requires that classes annotated with the _Repository_ annotation should follow the naming convention `XxxRepository` .
+
+The rationale is so that the pattern is easy to spot and to search for,
+
+[#every_Controller_must_be_follow_naming_conventions__]
+=== every_Controller_must_be_follow_naming_conventions()
+
+This rule requires that classes annotated with the _org.springframework.stereotype.Controller_ annotation should follow the naming convention `XxxController` .
+
+The rationale is so that the pattern is easy to spot and to search for,
+
+[#every_class_named_Repository_must_be_annotated_correctly__]
+=== every_class_named_Repository_must_be_annotated_correctly()
+
+This rule requires that classes named `XxxRepository` should also be annotated with the _org.springframework.stereotype.Repository_ annotation.
+
+The rationale is so that the pattern is easy to spot and to search for,
+
+[#every_class_named_Controller_must_be_annotated_correctly__]
+=== every_class_named_Controller_must_be_annotated_correctly()
+
+This rule requires that classes named `XxxController` should also be annotated with the _org.springframework.stereotype.Controller_ annotation.
+
+The rationale is so that the pattern is easy to spot and to search for,
+
+[#every_injected_field_of_jaxb_view_model_must_be_annotated_with_XmlTransient__]
+=== every_injected_field_of_jaxb_view_model_must_be_annotated_with_XmlTransient()
+
+This rule requires that injected fields in jaxb view models (that is, classes annotated with the JAXB _javax.xml.bind.annotation.XmlRootElement_ annotation) must also be annotated with JAXB _javax.xml.bind.annotation.XmlTransient_ annotation.
+
+The rationale here is that injected services are managed by the runtime and are not/cannot be serialized to XML.
+
+[#every_injected_field_of_serializable_view_model_must_be_transient__]
+=== every_injected_field_of_serializable_view_model_must_be_transient()
+
+This rule requires that injected fields in jaxb view models (that is, classes annotated with the JAXB _javax.xml.bind.annotation.XmlRootElement_ annotation) must also be annotated with JAXB _javax.xml.bind.annotation.XmlTransient_ annotation.
+
+The rationale here is that injected services are managed by the runtime and are not/cannot be serialized to XML.
+
+[#every_finder_method_in_Repository_must_return_either_Collection_or_Optional__]
+=== every_finder_method_in_Repository_must_return_either_Collection_or_Optional()
+
+This rule requires that finders of repos reutrn either _java.util.Collection_ s or _java.util.Optional_ s.
+
+In particular, this excludes the option of returning a simple scalar, such as `Customer` ; they must return an `Optional<Customer>` instead. This forces the caller to handle the fact that the result might be empty (ie no result).
+
+One exception is that methods named "findOrCreate", which are allowed to return an instance rather than an optional.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureJdoRules.adoc b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureJdoRules.adoc
new file mode 100644
index 0000000..dab8e80
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureJdoRules.adoc
@@ -0,0 +1,124 @@
+= ArchitectureJdoRules
+: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 library of architecture tests to ensure coding conventions are followed for classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation.
+
+== API
+
+[source,java]
+.ArchitectureJdoRules.java
+----
+class ArchitectureJdoRules {
+  ArchRule every_jdo_PersistenceCapable_must_be_annotated_with_DomainObject_nature_of_ENTITY()     // <.>
+  ArchRule every_jdo_PersistenceCapable_must_be_annotated_with_Version()     // <.>
+  ArchRule every_jdo_PersistenceCapable_must_be_annotated_as_XmlJavaAdapter_PersistentEntityAdapter()     // <.>
+  ArchRule every_jdo_PersistenceCapable_must_implement_Comparable()     // <.>
+  ArchRule every_jdo_PersistenceCapable_must_be_annotated_as_Uniques_or_Unique()     // <.>
+  ArchRule every_jdo_PersistenceCapable_with_DATASTORE_identityType_must_be_annotated_as_DataStoreIdentity()     // <.>
+  ArchRule every_jdo_PersistenceCapable_must_have_schema()     // <.>
+  DescribedPredicate<JavaAnnotation<?>> PersistenceCapable_schema()
+  DescribedPredicate<JavaAnnotation<?>> PersistenceCapable_with_DATASTORE_identityType()
+  ArchRule every_injected_field_of_jdo_PersistenceCapable_must_be_annotated_with_NotPersistent()     // <.>
+  DescribedPredicate<JavaClass> areEntities()
+  DescribedPredicate<? super JavaClass> areSubtypeEntities()
+}
+----
+
+<.> xref:#every_jdo_PersistenceCapable_must_be_annotated_with_DomainObject_nature_of_ENTITY__[every_jdo_PersistenceCapable_must_be_annotated_with_DomainObject_nature_of_ENTITY()]
++
+--
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also be annotated with the Apache Isis xref:refguide:applib:index/annotation/DomainObject.adoc[DomainObject] annotation specifying that its _DomainObject#nature() nature_ is an _org.apache.isis.applib.annotation.Nature#ENTITY entity_ .
+--
+<.> xref:#every_jdo_PersistenceCapable_must_be_annotated_with_Version__[every_jdo_PersistenceCapable_must_be_annotated_with_Version()]
++
+--
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also be annotated with the JDO _javax.jdo.annotations.Version_ annotation (in support of optimistic locking checks).
+--
+<.> xref:#every_jdo_PersistenceCapable_must_be_annotated_as_XmlJavaAdapter_PersistentEntityAdapter__[every_jdo_PersistenceCapable_must_be_annotated_as_XmlJavaAdapter_PersistentEntityAdapter()]
++
+--
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also be annotated with the Apache Isis _javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter_ annotation with a value of _org.apache.isis.applib.jaxb.PersistentEntityAdapter_ `.class` .
+--
+<.> xref:#every_jdo_PersistenceCapable_must_implement_Comparable__[every_jdo_PersistenceCapable_must_implement_Comparable()]
++
+--
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also implement _Comparable_ .
+--
+<.> xref:#every_jdo_PersistenceCapable_must_be_annotated_as_Uniques_or_Unique__[every_jdo_PersistenceCapable_must_be_annotated_as_Uniques_or_Unique()]
++
+--
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation and is not a subtype entity, must also be annotated with the JDO _javax.jdo.annotations.Uniques_ or _javax.jdo.annotations.Unique_ constraints.
+--
+<.> xref:#every_jdo_PersistenceCapable_with_DATASTORE_identityType_must_be_annotated_as_DataStoreIdentity__[every_jdo_PersistenceCapable_with_DATASTORE_identityType_must_be_annotated_as_DataStoreIdentity()]
++
+--
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also be annotated with the JDO _javax.jdo.annotations.Uniques_ or _javax.jdo.annotations.Unique_ constraints.
+--
+<.> xref:#every_jdo_PersistenceCapable_must_have_schema__[every_jdo_PersistenceCapable_must_have_schema()]
++
+--
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must have the _javax.jdo.annotations.PersistenceCapable#schema() schema_ attribute set.
+--
+<.> xref:#every_injected_field_of_jdo_PersistenceCapable_must_be_annotated_with_NotPersistent__[every_injected_field_of_jdo_PersistenceCapable_must_be_annotated_with_NotPersistent()]
++
+--
+This rule requires that injected fields in classes annotated with the JDO _PersistenceCapable_ annotation must also be annotated with JDO _javax.jdo.annotations.NotPersistent_ annotation.
+--
+
+== Members
+
+[#every_jdo_PersistenceCapable_must_be_annotated_with_DomainObject_nature_of_ENTITY__]
+=== every_jdo_PersistenceCapable_must_be_annotated_with_DomainObject_nature_of_ENTITY()
+
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also be annotated with the Apache Isis xref:refguide:applib:index/annotation/DomainObject.adoc[DomainObject] annotation specifying that its _DomainObject#nature() nature_ is an _org.apache.isis.applib.annotation.Nature#ENTITY entity_ .
+
+[#every_jdo_PersistenceCapable_must_be_annotated_with_Version__]
+=== every_jdo_PersistenceCapable_must_be_annotated_with_Version()
+
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also be annotated with the JDO _javax.jdo.annotations.Version_ annotation (in support of optimistic locking checks).
+
+The rule does _not_ apply to any entities that are subtype entities where there is a supertype entity.
+
+[#every_jdo_PersistenceCapable_must_be_annotated_as_XmlJavaAdapter_PersistentEntityAdapter__]
+=== every_jdo_PersistenceCapable_must_be_annotated_as_XmlJavaAdapter_PersistentEntityAdapter()
+
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also be annotated with the Apache Isis _javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter_ annotation with a value of _org.apache.isis.applib.jaxb.PersistentEntityAdapter_ `.class` .
+
+Tnis is so that entities can be transparently referenced from XML-style view models.
+
+[#every_jdo_PersistenceCapable_must_implement_Comparable__]
+=== every_jdo_PersistenceCapable_must_implement_Comparable()
+
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also implement _Comparable_ .
+
+This is so that entities have a natural ordering and can safely be added to parented collections of type _java.util.SortedSet_ .
+
+[#every_jdo_PersistenceCapable_must_be_annotated_as_Uniques_or_Unique__]
+=== every_jdo_PersistenceCapable_must_be_annotated_as_Uniques_or_Unique()
+
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation and is not a subtype entity, must also be annotated with the JDO _javax.jdo.annotations.Uniques_ or _javax.jdo.annotations.Unique_ constraints.
+
+This is so that entities will have an alternative business key in addition to the system-defined surrogate key.
+
+[#every_jdo_PersistenceCapable_with_DATASTORE_identityType_must_be_annotated_as_DataStoreIdentity__]
+=== every_jdo_PersistenceCapable_with_DATASTORE_identityType_must_be_annotated_as_DataStoreIdentity()
+
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must also be annotated with the JDO _javax.jdo.annotations.Uniques_ or _javax.jdo.annotations.Unique_ constraints.
+
+This is so that entities will have an alternative business key in addition to the system-defined surrogate key.
+
+[#every_jdo_PersistenceCapable_must_have_schema__]
+=== every_jdo_PersistenceCapable_must_have_schema()
+
+This rule requires that classes annotated with the JDO _javax.jdo.annotations.PersistenceCapable_ annotation must have the _javax.jdo.annotations.PersistenceCapable#schema() schema_ attribute set.
+
+This is so that entity tables are organised into an appropriate structure (ideally mirroring that of the entities).
+
+[#every_injected_field_of_jdo_PersistenceCapable_must_be_annotated_with_NotPersistent__]
+=== every_injected_field_of_jdo_PersistenceCapable_must_be_annotated_with_NotPersistent()
+
+This rule requires that injected fields in classes annotated with the JDO _PersistenceCapable_ annotation must also be annotated with JDO _javax.jdo.annotations.NotPersistent_ annotation.
+
+The rationale here is that injected services are managed by the runtime and are not/cannot be persisted.
+
+In fact, JDO is tolerant to such fields and will not trip up. So another more pragmatic reason is that, if using JDO type-safe queries, then the injected fields will not appear incorrectly in the generated Q classes.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureJpaRules.adoc b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureJpaRules.adoc
new file mode 100644
index 0000000..90bfed2
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/classrules/ArchitectureJpaRules.adoc
@@ -0,0 +1,163 @@
+= ArchitectureJpaRules
+: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 library of architecture tests to ensure coding conventions are followed for classes annotated with the JPA _Entity_ annotation.
+
+== API
+
+[source,java]
+.ArchitectureJpaRules.java
+----
+class ArchitectureJpaRules {
+  ArchRule every_jpa_Entity_must_be_annotated_with_DomainObject_nature_of_ENTITY()     // <.>
+  ArchRule every_jpa_Entity_must_be_annotated_with_XmlJavaAdapter_of_PersistentEntityAdapter()     // <.>
+  ArchRule every_jpa_Entity_must_be_annotated_as_an_IsisEntityListener()     // <.>
+  DescribedPredicate<JavaAnnotation<?>> EntityListeners_with_IsisEntityListener()
+  ArchRule every_jpa_Entity_must_implement_Comparable()     // <.>
+  ArchRule every_jpa_Entity_must_be_annotated_as_Table_with_uniqueConstraints()     // <.>
+  ArchRule every_jpa_Entity_must_be_annotated_as_Table_with_schema()     // <.>
+  ArchRule every_enum_field_of_jpa_Entity_must_be_annotated_with_Enumerable_STRING()     // <.>
+  ArchRule every_injected_field_of_jpa_Entity_must_be_annotated_with_Transient()     // <.>
+  ArchRule every_jpa_Entity_must_have_an_id_field()     // <.>
+  ArchRule every_jpa_Entity_must_have_a_version_field()     // <.>
+  ClassesShouldConjunction everyJpa_Entity_must_have_a_field_named_and_annotated(final String fieldName, final Class<? extends Annotation> annotationClass)
+  DescribedPredicate<JavaAnnotation<?>> Table_schema()
+  DescribedPredicate<JavaClass> areEntities()
+  DescribedPredicate<JavaAnnotation<?>> Table_uniqueConstraints()
+  ArchRule every_jpa_Entity_must_have_protected_no_arg_constructor()     // <.>
+  DescribedPredicate<? super JavaClass> areSubtypeEntities()
+}
+----
+
+<.> xref:#every_jpa_Entity_must_be_annotated_with_DomainObject_nature_of_ENTITY__[every_jpa_Entity_must_be_annotated_with_DomainObject_nature_of_ENTITY()]
++
+--
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the Apache Isis xref:refguide:applib:index/annotation/DomainObject.adoc[DomainObject] annotation specifying that its _DomainObject#nature() nature_ is an _org.apache.isis.applib.annotation.Nature#ENTITY entity_ .
+--
+<.> xref:#every_jpa_Entity_must_be_annotated_with_XmlJavaAdapter_of_PersistentEntityAdapter__[every_jpa_Entity_must_be_annotated_with_XmlJavaAdapter_of_PersistentEntityAdapter()]
++
+--
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the Apache Isis _javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter_ annotation with a value of _org.apache.isis.applib.jaxb.PersistentEntityAdapter_ `.class` .
+--
+<.> xref:#every_jpa_Entity_must_be_annotated_as_an_IsisEntityListener__[every_jpa_Entity_must_be_annotated_as_an_IsisEntityListener()]
++
+--
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the _javax.persistence.EntityListeners_ annotation that includes a value of `org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener.class` .
+--
+<.> xref:#every_jpa_Entity_must_implement_Comparable__[every_jpa_Entity_must_implement_Comparable()]
++
+--
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be implement _Comparable_ .
+--
+<.> xref:#every_jpa_Entity_must_be_annotated_as_Table_with_uniqueConstraints__[every_jpa_Entity_must_be_annotated_as_Table_with_uniqueConstraints()]
++
+--
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the JPA _Table_ annotation which includes _Table#uniqueConstraints() uniqueConstraints_ .
+--
+<.> xref:#every_jpa_Entity_must_be_annotated_as_Table_with_schema__[every_jpa_Entity_must_be_annotated_as_Table_with_schema()]
++
+--
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the JPA _Table_ annotation which includes _Table#schema()_ schema}.
+--
+<.> xref:#every_enum_field_of_jpa_Entity_must_be_annotated_with_Enumerable_STRING__[every_enum_field_of_jpa_Entity_must_be_annotated_with_Enumerable_STRING()]
++
+--
+This rule requires that enum fields in classes annotated with the JPA _Entity_ annotation must also be annotated with the JPA _Enumerated_ annotation indicating that they should be persisted as _javax.persistence.EnumType#STRING string_ s (rather than ordinal numbers).
+--
+<.> xref:#every_injected_field_of_jpa_Entity_must_be_annotated_with_Transient__[every_injected_field_of_jpa_Entity_must_be_annotated_with_Transient()]
++
+--
+This rule requires that injected fields in classes annotated with the JPA _Entity_ annotation must also be annotated with JPA _Transient_ annotation.
+--
+<.> xref:#every_jpa_Entity_must_have_an_id_field__[every_jpa_Entity_must_have_an_id_field()]
++
+--
+This rule requires that classes annotated with the JPA _Entity_ annotation must contain an `id` field that is itself annotated with _Id_ .
+--
+<.> xref:#every_jpa_Entity_must_have_a_version_field__[every_jpa_Entity_must_have_a_version_field()]
++
+--
+This rule requires that classes annotated with the JPA _Entity_ annotation must contain a `version` field that is itself annotated with _javax.persistence.Version_ .
+--
+<.> xref:#every_jpa_Entity_must_have_protected_no_arg_constructor__[every_jpa_Entity_must_have_protected_no_arg_constructor()]
++
+--
+This rule requires that concrete classes annotated with the JPA _Entity_ annotation have a no-arg constructor with `protected` visibility.
+--
+
+== Members
+
+[#every_jpa_Entity_must_be_annotated_with_DomainObject_nature_of_ENTITY__]
+=== every_jpa_Entity_must_be_annotated_with_DomainObject_nature_of_ENTITY()
+
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the Apache Isis xref:refguide:applib:index/annotation/DomainObject.adoc[DomainObject] annotation specifying that its _DomainObject#nature() nature_ is an _org.apache.isis.applib.annotation.Nature#ENTITY entity_ .
+
+[#every_jpa_Entity_must_be_annotated_with_XmlJavaAdapter_of_PersistentEntityAdapter__]
+=== every_jpa_Entity_must_be_annotated_with_XmlJavaAdapter_of_PersistentEntityAdapter()
+
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the Apache Isis _javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter_ annotation with a value of _org.apache.isis.applib.jaxb.PersistentEntityAdapter_ `.class` .
+
+Tnis is so that entities can be transparently referenced from XML-style view models.
+
+[#every_jpa_Entity_must_be_annotated_as_an_IsisEntityListener__]
+=== every_jpa_Entity_must_be_annotated_as_an_IsisEntityListener()
+
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the _javax.persistence.EntityListeners_ annotation that includes a value of `org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener.class` .
+
+Tnis is so that entities can be transparently referenced from XML-style view models.
+
+[#every_jpa_Entity_must_implement_Comparable__]
+=== every_jpa_Entity_must_implement_Comparable()
+
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be implement _Comparable_ .
+
+This is so that entities have a natural ordering and can safely be added to parented collections of type _java.util.SortedSet_ .
+
+[#every_jpa_Entity_must_be_annotated_as_Table_with_uniqueConstraints__]
+=== every_jpa_Entity_must_be_annotated_as_Table_with_uniqueConstraints()
+
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the JPA _Table_ annotation which includes _Table#uniqueConstraints() uniqueConstraints_ .
+
+This is so that entities will have an alternative business key in addition to the system-defined surrogate key.
+
+[#every_jpa_Entity_must_be_annotated_as_Table_with_schema__]
+=== every_jpa_Entity_must_be_annotated_as_Table_with_schema()
+
+This rule requires that classes annotated with the JPA _Entity_ annotation must also be annotated with the JPA _Table_ annotation which includes _Table#schema()_ schema}.
+
+This is so that entity tables are organised into an appropriate structure (ideally mirroring that of the entities).
+
+[#every_enum_field_of_jpa_Entity_must_be_annotated_with_Enumerable_STRING__]
+=== every_enum_field_of_jpa_Entity_must_be_annotated_with_Enumerable_STRING()
+
+This rule requires that enum fields in classes annotated with the JPA _Entity_ annotation must also be annotated with the JPA _Enumerated_ annotation indicating that they should be persisted as _javax.persistence.EnumType#STRING string_ s (rather than ordinal numbers).
+
+The rationale here is that a string is (arguably) more stable than an ordinal number, and is certainly easier to work with when querying the database. The downside is slightly more space to persist the data, and slightly less performant (not that it would be noticeable).
+
+[#every_injected_field_of_jpa_Entity_must_be_annotated_with_Transient__]
+=== every_injected_field_of_jpa_Entity_must_be_annotated_with_Transient()
+
+This rule requires that injected fields in classes annotated with the JPA _Entity_ annotation must also be annotated with JPA _Transient_ annotation.
+
+The rationale here is that injected services are managed by the runtime and are not/cannot be persisted.
+
+[#every_jpa_Entity_must_have_an_id_field__]
+=== every_jpa_Entity_must_have_an_id_field()
+
+This rule requires that classes annotated with the JPA _Entity_ annotation must contain an `id` field that is itself annotated with _Id_ .
+
+This is part of the standard contract for JPA entities.
+
+[#every_jpa_Entity_must_have_a_version_field__]
+=== every_jpa_Entity_must_have_a_version_field()
+
+This rule requires that classes annotated with the JPA _Entity_ annotation must contain a `version` field that is itself annotated with _javax.persistence.Version_ .
+
+This is good practice for JPA entities to implement optimistic locking
+
+[#every_jpa_Entity_must_have_protected_no_arg_constructor__]
+=== every_jpa_Entity_must_have_protected_no_arg_constructor()
+
+This rule requires that concrete classes annotated with the JPA _Entity_ annotation have a no-arg constructor with `protected` visibility.
+
+The rationale is to encourage the use of static factory methods.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/ArchitectureModuleRules.adoc b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/ArchitectureModuleRules.adoc
new file mode 100644
index 0000000..d29bb83
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/ArchitectureModuleRules.adoc
@@ -0,0 +1,60 @@
+= ArchitectureModuleRules
+: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 library of architecture tests to ensure correct layering and usage of packages.
+
+== API
+
+[source,java]
+.ArchitectureModuleRules.java
+----
+class ArchitectureModuleRules {
+  List<Class<?>> analyzeClasses_packagesOf(Class<?> clazz)     // <.>
+  Architectures.LayeredArchitecture code_dependencies_follow_module_Imports(List<Class<?>> moduleClasses)     // <.>
+  Architectures.LayeredArchitecture code_dependencies_follow_module_Imports_and_subpackage_rules(List<Class<?>> moduleClasses, List<Subpackage> subpackages)     // <.>
+  String nameOf(Class<?> moduleClass, final String subpackageName)
+  String[] namesOf(Class<?> moduleClass, String... subpackageNames)
+  String[] namesOf(Set<Class<?>> importingClasses, String... subpackageNames)
+  String packageIdentifierFor(Class<?> moduleClass)
+  String packageIdentifierFor(Class<?> moduleClass, Subpackage subpackage)
+  String[] both(String str, String[] arr)
+  String[] both(String[] arr1, String[] arr2)
+  Map<T, Set<T>> invert(Map<T, Set<T>> valueSetByKey)
+  void accumulateTransitiveDependencies(final Class<?> referringClass, final Map<Class<?>, Set<Class<?>>> directDependenciesByReferringClass, final Set<Class<?>> transitiveDependenciesOfReferringClass)
+}
+----
+
+<.> xref:#analyzeClasses_packagesOf__Class[analyzeClasses_packagesOf(Class)]
++
+--
+Utility method to aggregate the module classes (named "XxxModule") that are extracted from the _AnalyzeClasses_ annotation on the provided class.
+--
+<.> xref:#code_dependencies_follow_module_Imports__List[code_dependencies_follow_module_Imports(List)]
++
+--
+Ensures that the actual dependencies between classes within modules honour the module dependency graph inferred from the _Import_ statements of each module.
+--
+<.> xref:#code_dependencies_follow_module_Imports_and_subpackage_rules__List_List[code_dependencies_follow_module_Imports_and_subpackage_rules(List, List)]
++
+--
+Ensures that the actual dependencies between classes within modules honour the module dependency graph inferred from the _Import_ statements of each module AND also ensures that the subpackages within those rules only access the allowed subpackages of both their own &local;local&local; and the subpackages of other modules that they might reference.
+--
+
+== Members
+
+[#analyzeClasses_packagesOf__Class]
+=== analyzeClasses_packagesOf(Class)
+
+Utility method to aggregate the module classes (named "XxxModule") that are extracted from the _AnalyzeClasses_ annotation on the provided class.
+
+The result is intended to be passed into _#code_dependencies_follow_module_Imports(List)_ and _#code_dependencies_follow_module_Imports_and_subpackage_rules(List, List)_ .
+
+[#code_dependencies_follow_module_Imports__List]
+=== code_dependencies_follow_module_Imports(List)
+
+Ensures that the actual dependencies between classes within modules honour the module dependency graph inferred from the _Import_ statements of each module.
+
+[#code_dependencies_follow_module_Imports_and_subpackage_rules__List_List]
+=== code_dependencies_follow_module_Imports_and_subpackage_rules(List, List)
+
+Ensures that the actual dependencies between classes within modules honour the module dependency graph inferred from the _Import_ statements of each module AND also ensures that the subpackages within those rules only access the allowed subpackages of both their own &local;local&local; and the subpackages of other modules that they might reference.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/Subpackage.adoc b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/Subpackage.adoc
new file mode 100644
index 0000000..fc8f652
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/Subpackage.adoc
@@ -0,0 +1,58 @@
+= Subpackage _(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 [...]
+
+Defines the rules for which subpackages or a module to check and whether the classes in those subpackages can access the classes in other subpackages either for the same module, or for modules that are referenced ( _org.springframework.context.annotation.Import_ ed) directly or transitively.
+
+== API
+
+[source,java]
+.Subpackage.java
+----
+interface Subpackage {
+  String getName()     // <.>
+  List<String> mayBeAccessedBySubpackagesInSameModule()     // <.>
+  List<String> mayBeAccessedBySubpackagesInReferencingModules()     // <.>
+  String packageIdentifier()
+}
+----
+
+<.> xref:#getName__[getName()]
++
+--
+The name of the subpackage, for example "dom", "api", "spi" or "fixtures".
+--
+<.> xref:#mayBeAccessedBySubpackagesInSameModule__[mayBeAccessedBySubpackagesInSameModule()]
++
+--
+A list of the (names of the) subpackages where classes in the same module as this package have access.
+--
+<.> xref:#mayBeAccessedBySubpackagesInReferencingModules__[mayBeAccessedBySubpackagesInReferencingModules()]
++
+--
+A list of the (names of the) subpackages where classes in the packages of other referencing modules may have access.
+--
+
+== Members
+
+[#getName__]
+=== getName()
+
+The name of the subpackage, for example "dom", "api", "spi" or "fixtures".
+
+[#mayBeAccessedBySubpackagesInSameModule__]
+=== mayBeAccessedBySubpackagesInSameModule()
+
+A list of the (names of the) subpackages where classes in the same module as this package have access.
+
+For example, the "dom" subpackage can probably be referenced from the "menu" subpackage, but not vice versa.
+
+The special value of "*" is a wildcard meaning that all subpackages (in the same module) can access.
+
+[#mayBeAccessedBySubpackagesInReferencingModules__]
+=== mayBeAccessedBySubpackagesInReferencingModules()
+
+A list of the (names of the) subpackages where classes in the packages of other referencing modules may have access.
+
+For example, in some cases the the "dom" subpackage may _not_ be accessible from other modules if the intention is to require all programmatic access through an "api" subpackage (where the classes in `dom` implement interfaces defined in `api` ).
+
+The special value of "*" is a wildcard meaning that all subpackages (in other modules) can access.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/SubpackageEnum.adoc b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/SubpackageEnum.adoc
new file mode 100644
index 0000000..cb09e96
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/archtestsupport/applib/modulerules/SubpackageEnum.adoc
@@ -0,0 +1,161 @@
+= SubpackageEnum _(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 [...]
+
+A default implementation of xref:refguide:testing:index/archtestsupport/applib/modulerules/Subpackage.adoc[Subpackage] that constrains how (the classes in) subpackages across and within modules can reference either.
+
+== API
+
+[source,java]
+.SubpackageEnum.java
+----
+enum SubpackageEnum {
+  dom     // <.>
+  api     // <.>
+  app     // <.>
+  menu     // <.>
+  contributions     // <.>
+  subscribers     // <.>
+  restapi     // <.>
+  spi     // <.>
+  spiimpl     // <.>
+  fixtures     // <.>
+  seed     // <.>
+  integtests
+  final List<String> local;
+  final List<String> referencing;
+  String getName()
+  List<String> mayBeAccessedBySubpackagesInSameModule()
+  List<String> mayBeAccessedBySubpackagesInReferencingModules()
+}
+----
+
+<.> xref:#dom[dom]
++
+--
+The _domain object model_ module, containing the main business logic of the module.
+--
+<.> xref:#api[api]
++
+--
+Optional, constitutes a formal API to the module.
+--
+<.> xref:#app[app]
++
+--
+Optional, but if used then will hold view model that implement some sort of assisted business process, for example dashboards, or filtering.
+--
+<.> xref:#menu[menu]
++
+--
+Holds the menus that are visible in the UI.
+--
+<.> xref:#contributions[contributions]
++
+--
+Holds mixins that contribute functionality to OTHER modules.
+--
+<.> xref:#subscribers[subscribers]
++
+--
+Holds domain services that subscribe to events fired from OTHER modules.
+--
+<.> xref:#restapi[restapi]
++
+--
+Holds the menus that are visible as the REST endpoints.
+--
+<.> xref:#spi[spi]
++
+--
+Define an interface for OTHER modules to implement; this is therefore an alternative and more structured way to decoupled modules.
+--
+<.> xref:#spiimpl[spiimpl]
++
+--
+These are this module's implementations of OTHER modules' SPI services.
+--
+<.> xref:#fixtures[fixtures]
++
+--
+Fixture scripts used to setup the systen when prototyping and for integ tests.
+--
+<.> xref:#seed[seed]
++
+--
+Seed scripts used to setup the systen, for example reference data).
+--
+
+== Members
+
+[#dom]
+=== dom
+
+The _domain object model_ module, containing the main business logic of the module.
+
+Typically consists of entities and view models and associated repositories and stateless services used by those entities and view models.
+
+[#api]
+=== api
+
+Optional, constitutes a formal API to the module.
+
+If used, then access to the _dom_ module is likely to be restricted to only the subpackages of its own "local" module with no access granted to subpackages of other "external" referencing modules.
+
+[#app]
+=== app
+
+Optional, but if used then will hold view model that implement some sort of assisted business process, for example dashboards, or filtering.
+
+[#menu]
+=== menu
+
+Holds the menus that are visible in the UI.
+
+These should only be called by the framework, not programmatically (except for tests).
+
+[#contributions]
+=== contributions
+
+Holds mixins that contribute functionality to OTHER modules.
+
+Mixins are one of the main techniques for decoupling dependencies between modules.
+
+Note that mixins to THIS module normally would just live in the _dom_ subpackage, eg _dom.mixins_ .
+
+[#subscribers]
+=== subscribers
+
+Holds domain services that subscribe to events fired from OTHER modules.
+
+Subscriptions is the other main technique for decoupling dependencies between modules.
+
+[#restapi]
+=== restapi
+
+Holds the menus that are visible as the REST endpoints.
+
+These should only be called by the framework, not programmatically (except for tests).
+
+[#spi]
+=== spi
+
+Define an interface for OTHER modules to implement; this is therefore an alternative and more structured way to decoupled modules.
+
+With events, the module that emits the event doesn't know much about what the action to be performed in the other module might be. But if we use an SPI, then this module will call all implementations of the SPI at certain well-defined points; so it kind of is like a lifecycle sort of thing.
+
+Also, the SPI's interface could be more exotic, ie "fatter" than the simple event.
+
+[#spiimpl]
+=== spiimpl
+
+These are this module's implementations of OTHER modules' SPI services.
+
+[#fixtures]
+=== fixtures
+
+Fixture scripts used to setup the systen when prototyping and for integ tests.
+
+[#seed]
+=== seed
+
+Seed scripts used to setup the systen, for example reference data).
diff --git a/antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc b/antora/components/refguide-index/modules/viewer/pages/index/wicket/viewer/services/ImpersonatedUserHolderForWicket.adoc
similarity index 69%
rename from antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc
rename to antora/components/refguide-index/modules/viewer/pages/index/wicket/viewer/services/ImpersonatedUserHolderForWicket.adoc
index 46693d0..a48249a 100644
--- a/antora/components/refguide-index/modules/security/pages/index/keycloak/webmodule/WebModuleKeycloak.adoc
+++ b/antora/components/refguide-index/modules/viewer/pages/index/wicket/viewer/services/ImpersonatedUserHolderForWicket.adoc
@@ -1,16 +1,18 @@
-= WebModuleKeycloak
+= ImpersonatedUserHolderForWicket
 :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 [...]
 
-WebModule to enable support for Keycloak.
+Implementation that supports impersonation, using the Wicket _Session_ to store the value.
 
 == API
 
 [source,java]
-.WebModuleKeycloak.java
+.ImpersonatedUserHolderForWicket.java
 ----
-class WebModuleKeycloak {
-  WebModuleKeycloak(ServiceInjector serviceInjector)
-  Can<ServletContextListener> init(ServletContext ctx)
+class ImpersonatedUserHolderForWicket {
+  boolean supportsImpersonation()
+  void setUserMemento(final UserMemento userMemento)
+  Optional<UserMemento> getUserMemento()
+  void clearUserMemento()
 }
 ----
 
diff --git a/core/adoc/modules/_overview/pages/about.adoc b/core/adoc/modules/_overview/pages/about.adoc
index f5820a1..1cf4fa6 100644
--- a/core/adoc/modules/_overview/pages/about.adoc
+++ b/core/adoc/modules/_overview/pages/about.adoc
@@ -104,15 +104,21 @@ skinparam rectangle<<9>> {
   FontColor #fffffe
   BorderColor #2E6295
 }
+skinparam rectangle<<10>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2E6295
+}
 package "Mavendeps\n[Software System]" {
   rectangle "==Apache Isis Maven Deps\n<size:10>[Container: packaging: pom]</size>" <<2>> as 2
-  rectangle "==Apache Isis Maven Deps - BDD Integ Spec\n<size:10>[Container: packaging: pom]</size>" <<3>> as 3
-  rectangle "==Apache Isis Maven Deps - Integration Testing\n<size:10>[Container: packaging: pom]</size>" <<4>> as 4
-  rectangle "==Apache Isis Maven Deps - JDK11\n<size:10>[Container: packaging: pom]</size>" <<5>> as 5
-  rectangle "==Apache Isis Maven Deps - JDO\n<size:10>[Container: packaging: pom]</size>" <<6>> as 6
-  rectangle "==Apache Isis Maven Deps - JPA\n<size:10>[Container: packaging: pom]</size>" <<7>> as 7
-  rectangle "==Apache Isis Maven Deps - Testing\n<size:10>[Container: packaging: pom]</size>" <<8>> as 8
-  rectangle "==Apache Isis Maven Deps - Webapp\n<size:10>[Container: packaging: pom]</size>" <<9>> as 9
+  rectangle "==Apache Isis Maven Deps - Arch Testing\n<size:10>[Container: packaging: pom]</size>" <<3>> as 3
+  rectangle "==Apache Isis Maven Deps - BDD Integ Spec\n<size:10>[Container: packaging: pom]</size>" <<4>> as 4
+  rectangle "==Apache Isis Maven Deps - Integration Testing\n<size:10>[Container: packaging: pom]</size>" <<5>> as 5
+  rectangle "==Apache Isis Maven Deps - JDK11\n<size:10>[Container: packaging: pom]</size>" <<6>> as 6
+  rectangle "==Apache Isis Maven Deps - JDO\n<size:10>[Container: packaging: pom]</size>" <<7>> as 7
+  rectangle "==Apache Isis Maven Deps - JPA\n<size:10>[Container: packaging: pom]</size>" <<8>> as 8
+  rectangle "==Apache Isis Maven Deps - Unit Testing\n<size:10>[Container: packaging: pom]</size>" <<9>> as 9
+  rectangle "==Apache Isis Maven Deps - Webapp\n<size:10>[Container: packaging: pom]</size>" <<10>> as 10
 }
 2 .[#707070].> 3 : ""
 2 .[#707070].> 4 : ""
@@ -121,6 +127,7 @@ package "Mavendeps\n[Software System]" {
 2 .[#707070].> 7 : ""
 2 .[#707070].> 8 : ""
 2 .[#707070].> 9 : ""
+2 .[#707070].> 10 : ""
 @enduml
 ----
 .Projects/Modules (Mavendeps)
@@ -138,6 +145,21 @@ Directory: /mavendeps
 ----
 |Collection of Apache Isis Maven Dependency Bundles.
 
+|Apache Isis Maven Deps - Arch Testing
+[source,yaml]
+----
+Group: org.apache.isis.mavendeps
+Artifact: isis-mavendeps-archtests
+Type: pom
+Directory: /mavendeps/archtests
+----
+|Defines a module that can be used as a single dependency for architecture testing.
+
+.Dependencies
+****
+org.apache.isis.testing:isis-testing-archtestsupport-applib:jar:<managed> +
+****
+
 |Apache Isis Maven Deps - BDD Integ Spec
 [source,yaml]
 ----
@@ -220,7 +242,7 @@ org.apache.isis.core:isis-schema:jar:<managed> +
 org.apache.isis.persistence:isis-persistence-jpa-eclipselink:jar:<managed> +
 ****
 
-|Apache Isis Maven Deps - Testing
+|Apache Isis Maven Deps - Unit Testing
 [source,yaml]
 ----
 Group: org.apache.isis.mavendeps
@@ -256,9 +278,7 @@ org.apache.isis.core:isis-core-runtimeservices:jar:<managed> +
 org.apache.isis.core:isis-core-security:jar:<managed> +
 org.apache.isis.core:isis-schema:jar:<managed> +
 org.apache.isis.security:isis-security-bypass:jar:<managed> +
-org.apache.isis.security:isis-security-keycloak:jar:<managed> +
 org.apache.isis.viewer:isis-viewer-restfulobjects-jaxrsresteasy4:jar:<managed> +
-org.apache.isis.viewer:isis-viewer-restfulobjects-viewer:jar:<managed> +
 org.apache.isis.viewer:isis-viewer-wicket-viewer:jar:<managed> +
 org.springframework.boot:spring-boot-starter-tomcat:jar:<managed> +
 org.springframework.boot:spring-boot-starter-web:jar:<managed> +
@@ -322,6 +342,11 @@ skinparam rectangle<<18>> {
   FontColor #fffffe
   BorderColor #2E6295
 }
+skinparam rectangle<<19>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2E6295
+}
 skinparam rectangle<<2>> {
   BackgroundColor #438dd5
   FontColor #fffffe
@@ -362,6 +387,11 @@ skinparam rectangle<<9>> {
   FontColor #fffffe
   BorderColor #2E6295
 }
+skinparam rectangle<<20>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2E6295
+}
 skinparam rectangle<<10>> {
   BackgroundColor #438dd5
   FontColor #fffffe
@@ -369,39 +399,43 @@ skinparam rectangle<<10>> {
 }
 package "Testing\n[Software System]" {
   rectangle "==Apache Isis Testing\n<size:10>[Container: packaging: pom]</size>" <<2>> as 2
-  rectangle "==Apache Isis Tst - FakeData (applib)\n<size:10>[Container: packaging: jar]</size>" <<4>> as 4
-  rectangle "==Apache Isis Tst - FakeData (fixtures)\n<size:10>[Container: packaging: jar]</size>" <<5>> as 5
-  rectangle "==Apache Isis Tst - FakeData (integ tests)\n<size:10>[Container: packaging: jar]</size>" <<6>> as 6
-  rectangle "==Apache Isis Tst - FakeData (parent)\n<size:10>[Container: packaging: pom]</size>" <<3>> as 3
-  rectangle "==Apache Isis Tst - Fixtures (applib)\n<size:10>[Container: packaging: jar]</size>" <<8>> as 8
-  rectangle "==Apache Isis Tst - Fixtures (parent)\n<size:10>[Container: packaging: pom]</size>" <<7>> as 7
-  rectangle "==Apache Isis Tst - H2 Console (parent)\n<size:10>[Container: packaging: pom]</size>" <<9>> as 9
-  rectangle "==Apache Isis Tst - H2 Console (ui)\n<size:10>[Container: packaging: jar]</size>" <<10>> as 10
-  rectangle "==Apache Isis Tst - HSQLDB Manager\n<size:10>[Container: packaging: jar]</size>" <<12>> as 12
-  rectangle "==Apache Isis Tst - HSQLDB Manager (parent)\n<size:10>[Container: packaging: pom]</size>" <<11>> as 11
-  rectangle "==Apache Isis Tst - Integ Test Support (applib)\n<size:10>[Container: packaging: jar]</size>" <<14>> as 14
-  rectangle "==Apache Isis Tst - Integ Test Support (parent)\n<size:10>[Container: packaging: pom]</size>" <<13>> as 13
-  rectangle "==Apache Isis Tst - Spec/Cucumber (applib)\n<size:10>[Container: packaging: jar]</size>" <<16>> as 16
-  rectangle "==Apache Isis Tst - Spec/Cucumber (parent)\n<size:10>[Container: packaging: pom]</size>" <<15>> as 15
-  rectangle "==Apache Isis Tst - Unit Test Support (applib)\n<size:10>[Container: packaging: jar]</size>" <<18>> as 18
-  rectangle "==Apache Isis Tst - Unit Test Support (parent)\n<size:10>[Container: packaging: pom]</size>" <<17>> as 17
+  rectangle "==Apache Isis Tst - Architecture Test Support (applib)\n<size:10>[Container: packaging: jar]</size>" <<4>> as 4
+  rectangle "==Apache Isis Tst - Architecture Test Support (parent)\n<size:10>[Container: packaging: pom]</size>" <<3>> as 3
+  rectangle "==Apache Isis Tst - FakeData (applib)\n<size:10>[Container: packaging: jar]</size>" <<6>> as 6
+  rectangle "==Apache Isis Tst - FakeData (fixtures)\n<size:10>[Container: packaging: jar]</size>" <<7>> as 7
+  rectangle "==Apache Isis Tst - FakeData (integ tests)\n<size:10>[Container: packaging: jar]</size>" <<8>> as 8
+  rectangle "==Apache Isis Tst - FakeData (parent)\n<size:10>[Container: packaging: pom]</size>" <<5>> as 5
+  rectangle "==Apache Isis Tst - Fixtures (applib)\n<size:10>[Container: packaging: jar]</size>" <<10>> as 10
+  rectangle "==Apache Isis Tst - Fixtures (parent)\n<size:10>[Container: packaging: pom]</size>" <<9>> as 9
+  rectangle "==Apache Isis Tst - H2 Console (parent)\n<size:10>[Container: packaging: pom]</size>" <<11>> as 11
+  rectangle "==Apache Isis Tst - H2 Console (ui)\n<size:10>[Container: packaging: jar]</size>" <<12>> as 12
+  rectangle "==Apache Isis Tst - HSQLDB Manager\n<size:10>[Container: packaging: jar]</size>" <<14>> as 14
+  rectangle "==Apache Isis Tst - HSQLDB Manager (parent)\n<size:10>[Container: packaging: pom]</size>" <<13>> as 13
+  rectangle "==Apache Isis Tst - Integ Test Support (applib)\n<size:10>[Container: packaging: jar]</size>" <<16>> as 16
+  rectangle "==Apache Isis Tst - Integ Test Support (parent)\n<size:10>[Container: packaging: pom]</size>" <<15>> as 15
+  rectangle "==Apache Isis Tst - Spec/Cucumber (applib)\n<size:10>[Container: packaging: jar]</size>" <<18>> as 18
+  rectangle "==Apache Isis Tst - Spec/Cucumber (parent)\n<size:10>[Container: packaging: pom]</size>" <<17>> as 17
+  rectangle "==Apache Isis Tst - Unit Test Support (applib)\n<size:10>[Container: packaging: jar]</size>" <<20>> as 20
+  rectangle "==Apache Isis Tst - Unit Test Support (parent)\n<size:10>[Container: packaging: pom]</size>" <<19>> as 19
 }
 2 .[#707070].> 3 : ""
-2 .[#707070].> 7 : ""
+2 .[#707070].> 5 : ""
 2 .[#707070].> 9 : ""
 2 .[#707070].> 11 : ""
 2 .[#707070].> 13 : ""
 2 .[#707070].> 15 : ""
 2 .[#707070].> 17 : ""
+2 .[#707070].> 19 : ""
 3 .[#707070].> 4 : ""
-3 .[#707070].> 5 : ""
-3 .[#707070].> 6 : ""
-7 .[#707070].> 8 : ""
+5 .[#707070].> 6 : ""
+5 .[#707070].> 7 : ""
+5 .[#707070].> 8 : ""
 9 .[#707070].> 10 : ""
 11 .[#707070].> 12 : ""
 13 .[#707070].> 14 : ""
 15 .[#707070].> 16 : ""
 17 .[#707070].> 18 : ""
+19 .[#707070].> 20 : ""
 @enduml
 ----
 .Projects/Modules (Testing)
@@ -419,6 +453,42 @@ Directory: /testing
 ----
 |A library of utilities, mini-frameworks and tools for prototyping and testing Apache Isis applications.
 
+|Apache Isis Tst - Architecture Test Support (parent)
+[source,yaml]
+----
+Group: org.apache.isis.testing
+Artifact: isis-testing-archtestsupport
+Type: pom
+Directory: /testing/archtestsupport
+----
+|A module providing a library of architecture tests
+
+|Apache Isis Tst - Architecture Test Support (applib)
+[source,yaml]
+----
+Group: org.apache.isis.testing
+Artifact: isis-testing-archtestsupport-applib
+Type: jar
+Directory: /testing/archtestsupport/applib
+----
+|.Dependencies
+****
+com.tngtech.archunit:archunit-junit5-api:jar:<managed> +
+com.tngtech.archunit:archunit-junit5-engine:jar:<managed> +
+org.apache.isis.core:isis-applib:jar:<managed> +
+org.apache.isis.persistence:isis-persistence-jdo-integration:jar:<managed> +
+org.apache.isis.persistence:isis-persistence-jpa-integration:jar:<managed> +
+org.datanucleus:javax.jdo:jar:<managed> +
+org.slf4j:slf4j-api:jar:<managed> +
+org.springframework:spring-test:jar:<managed> +
+org.springframework.boot:spring-boot-starter-test:jar:<managed> +
+****
+
+.Document Index Entries
+****
+xref:refguide:testing:index/archtestsupport/applib/IsisModuleTestingArchTestSupportApplib.adoc[IsisModuleTestingArchTestSupportApplib], xref:refguide:testing:index/archtestsupport/applib/classrules/ArchitectureDomainRules.adoc[ArchitectureDomainRules], xref:refguide:testing:index/archtestsupport/applib/classrules/ArchitectureJdoRules.adoc[ArchitectureJdoRules], xref:refguide:testing:index/archtestsupport/applib/classrules/ArchitectureJpaRules.adoc[ArchitectureJpaRules], xref:refguide:tes [...]
+****
+
 |Apache Isis Tst - FakeData (parent)
 [source,yaml]
 ----
@@ -625,7 +695,7 @@ org.apache.isis.core:isis-core-runtimeservices:jar:<managed> +
 org.apache.isis.security:isis-security-bypass:jar:<managed> +
 org.hamcrest:hamcrest-library:jar:<managed> +
 org.hsqldb:hsqldb:jar:<managed> +
-org.slf4j:slf4j-api:jar:${slf4j-api.version} +
+org.slf4j:slf4j-api:jar:<managed> +
 org.springframework:spring-test:jar:<managed> +
 org.springframework.boot:spring-boot-starter-test:jar:<managed> +
 ****
@@ -889,6 +959,7 @@ demoapp.dom.services.extensions.secman.apptenancy.ApplicationTenancyEvaluatorFor
 demoapp.dom.services.extensions.secman.apptenancy.jdo.TenantedJdoEntities +
 demoapp.dom.services.extensions.secman.apptenancy.jpa.TenantedJpaEntities +
 demoapp.dom.services.extensions.secman.apptenancy.persistence.TenantedSeeding +
+demoapp.dom.services.extensions.secman.appuser.seed.AppUserSeeding +
 demoapp.dom.types.isis.blobs.jdo.IsisBlobJdoEntities +
 demoapp.dom.types.isis.blobs.jpa.IsisBlobJpaEntities +
 demoapp.dom.types.isis.blobs.persistence.IsisBlobSeeding +
@@ -1533,7 +1604,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)
@@ -1645,7 +1716,7 @@ org.junit.jupiter:junit-jupiter-engine:jar:<managed> +
 org.junit.vintage:junit-vintage-engine:jar:<managed> +
 org.mockito:mockito-core:jar:<managed> +
 org.picocontainer:picocontainer:jar:<managed> +
-org.slf4j:slf4j-api:jar:${slf4j-api.version} +
+org.slf4j:slf4j-api:jar:<managed> +
 org.springframework:spring-test:jar:<managed> +
 org.springframework.boot:spring-boot-starter-test:jar:<managed> +
 ****
@@ -1680,6 +1751,7 @@ o.a.i.core.metamodel.services.layout.LayoutServiceDefault +
 o.a.i.core.metamodel.services.metamodel.MetaModelServiceDefault +
 o.a.i.core.metamodel.services.registry.ServiceRegistryDefault +
 o.a.i.core.metamodel.services.tablecol.TableColumnOrderServiceDefault +
+o.a.i.core.metamodel.services.tablecol.TableColumnOrderServiceUsingTxtFile +
 o.a.i.core.metamodel.services.title.TitleServiceDefault +
 o.a.i.core.metamodel.specloader.ProgrammingModelServiceDefault +
 o.a.i.core.metamodel.specloader.SpecificationLoaderDefault +
@@ -1702,7 +1774,7 @@ org.jmock:jmock:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:core:index/metamodel/services/command/CommandDtoFactory.adoc[CommandDtoFactory], xref:refguide:core:index/metamodel/services/ixn/InteractionDtoFactory.adoc[InteractionDtoFactory], xref:refguide:core:index/metamodel/services/publishing/CommandPublisher.adoc[CommandPublisher], xref:refguide:core:index/metamodel/services/publishing/ExecutionPublisher.adoc[ExecutionPublisher], xref:refguide:core:index/metamodel/services/tablecol/TableColumnOrderServiceDefault.adoc[TableColumnOr [...]
+xref:refguide:core:index/metamodel/services/command/CommandDtoFactory.adoc[CommandDtoFactory], xref:refguide:core:index/metamodel/services/ixn/InteractionDtoFactory.adoc[InteractionDtoFactory], xref:refguide:core:index/metamodel/services/publishing/CommandPublisher.adoc[CommandPublisher], xref:refguide:core:index/metamodel/services/publishing/ExecutionPublisher.adoc[ExecutionPublisher], xref:refguide:core:index/metamodel/services/tablecol/TableColumnOrderServiceDefault.adoc[TableColumnOr [...]
 ****
 
 |Apache Isis Core - Runtime
@@ -1844,7 +1916,7 @@ org.apache.isis.core:isis-core-metamodel:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:core:index/transaction/changetracking/EntityChangeTracker.adoc[EntityChangeTracker], xref:refguide:core:index/transaction/changetracking/EntityChangeTrackerDefault.adoc[EntityChangeTrackerDefault], xref:refguide:core:index/transaction/changetracking/EntityChangesPublisher.adoc[EntityChangesPublisher], xref:refguide:core:index/transaction/changetracking/EntityPropertyChangePublisher.adoc[EntityPropertyChangePublisher], xref:refguide:core:index/transaction/events/TransactionA [...]
+xref:refguide:core:index/transaction/changetracking/EntityChangeTracker.adoc[EntityChangeTracker], xref:refguide:core:index/transaction/changetracking/EntityChangeTrackerDefault.adoc[EntityChangeTrackerDefault], xref:refguide:core:index/transaction/changetracking/EntityChangeTrackerWithPreValue.adoc[EntityChangeTrackerWithPreValue], xref:refguide:core:index/transaction/changetracking/EntityChangesPublisher.adoc[EntityChangesPublisher], xref:refguide:core:index/transaction/changetracking/ [...]
 ****
 
 |Apache Isis Core - WebApp
@@ -2040,7 +2112,7 @@ org.datanucleus:javax.jdo:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:persistence:index/jdo/applib/IsisModulePersistenceJdoApplib.adoc[IsisModulePersistenceJdoApplib], xref:refguide:persistence:index/jdo/applib/services/JdoSupportService.adoc[JdoSupportService]
+xref:refguide:persistence:index/jdo/applib/IsisModulePersistenceJdoApplib.adoc[IsisModulePersistenceJdoApplib], xref:refguide:persistence:index/jdo/applib/services/JdoSupportService.adoc[JdoSupportService], xref:refguide:persistence:index/jdo/applib/types/AddressLine.adoc[AddressLine], xref:refguide:persistence:index/jdo/applib/types/Description.adoc[Description], xref:refguide:persistence:index/jdo/applib/types/Email.adoc[Email], xref:refguide:persistence:index/jdo/applib/types/Fqcn.ado [...]
 ****
 
 |Apache Isis Persistence - JDO Provider (DataNucleus)
@@ -2257,11 +2329,12 @@ Directory: /persistence/jpa/applib
 ****
 org.apache.isis.commons:isis-commons:jar:<managed> +
 org.apache.isis.core:isis-applib:jar:<managed> +
+org.apache.isis.core:isis-core-transaction:jar:<managed> +
 ****
 
 .Document Index Entries
 ****
-xref:refguide:persistence:index/jpa/applib/integration/JpaEntityInjectionPointResolver.adoc[JpaEntityInjectionPointResolver], xref:refguide:persistence:index/jpa/applib/services/JpaSupportService.adoc[JpaSupportService]
+xref:refguide:persistence:index/jpa/applib/integration/IsisEntityListener.adoc[IsisEntityListener], xref:refguide:persistence:index/jpa/applib/services/JpaSupportService.adoc[JpaSupportService], xref:refguide:persistence:index/jpa/applib/types/BlobJpaEmbeddable.adoc[BlobJpaEmbeddable], xref:refguide:persistence:index/jpa/applib/types/ClobJpaEmbeddable.adoc[ClobJpaEmbeddable]
 ****
 
 |Apache Isis Persistence - JPA EclipseLink
@@ -2505,8 +2578,7 @@ Directory: /security/keycloak
 
 .Components
 ****
-o.a.i.security.keycloak.authentication.AuthenticatorKeycloak +
-o.a.i.security.keycloak.webmodule.WebModuleKeycloak +
+o.a.i.security.keycloak.handler.LogoutHandlerForKeycloak +
 ****
 
 .Dependencies
@@ -2515,11 +2587,16 @@ org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
 org.apache.isis.core:isis-core-runtime:jar:<managed> +
 org.apache.isis.core:isis-core-runtimeservices:jar:<managed> +
 org.apache.isis.core:isis-core-webapp:jar:<managed> +
+org.apache.isis.security:isis-security-spring:jar:<managed> +
+org.springframework.boot:spring-boot-starter-security:jar:<managed> +
+org.springframework.security:spring-security-oauth2-client:jar:<managed> +
+org.springframework.security:spring-security-oauth2-core:jar:<managed> +
+org.springframework.security:spring-security-oauth2-jose:jar:<managed> +
 ****
 
 .Document Index Entries
 ****
-xref:refguide:security:index/keycloak/IsisModuleSecurityKeycloak.adoc[IsisModuleSecurityKeycloak], xref:refguide:security:index/keycloak/authentication/AuthenticatorKeycloak.adoc[AuthenticatorKeycloak], xref:refguide:security:index/keycloak/webmodule/KeycloakFilter.adoc[KeycloakFilter], xref:refguide:security:index/keycloak/webmodule/WebModuleKeycloak.adoc[WebModuleKeycloak]
+xref:refguide:security:index/keycloak/IsisModuleSecurityKeycloak.adoc[IsisModuleSecurityKeycloak]
 ****
 |===
 
@@ -2979,6 +3056,7 @@ de.agilecoders.wicket:wicket-bootstrap-core:jar:<managed> +
 de.agilecoders.wicket:wicket-bootstrap-extensions:jar:<managed> +
 de.agilecoders.wicket:wicket-bootstrap-themes:jar:<managed> +
 de.agilecoders.wicket.webjars:wicket-webjars:jar:<managed> +
+javax.servlet:javax.servlet-api:jar:<managed> +
 org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
 org.apache.isis.viewer:isis-viewer-wicket-model:jar:<managed> +
 org.apache.wicket:wicket-auth-roles:jar:<managed> +
@@ -2987,7 +3065,7 @@ org.apache.wicket:wicket-devutils:jar:<managed> +
 org.apache.wicket:wicket-extensions:jar:<managed> +
 org.apache.wicket:wicket-spring:jar:<managed> +
 org.datanucleus:javax.jdo:jar:<managed> +
-org.slf4j:slf4j-api:jar:${slf4j-api.version} +
+org.slf4j:slf4j-api:jar:<managed> +
 org.webjars:bootstrap:jar:<managed> +
 org.webjars:jquery:jar:<managed> +
 org.webjars:jquery-ui:jar:<managed> +
@@ -3020,6 +3098,7 @@ o.a.i.viewer.wicket.viewer.services.BookmarkUiServiceWicket +
 o.a.i.viewer.wicket.viewer.services.DeepLinkServiceWicket +
 o.a.i.viewer.wicket.viewer.services.HintStoreUsingWicketSession +
 o.a.i.viewer.wicket.viewer.services.ImageResourceCacheClassPath +
+o.a.i.viewer.wicket.viewer.services.ImpersonatedUserHolderForWicket +
 o.a.i.viewer.wicket.viewer.services.LocaleProviderWicket +
 o.a.i.viewer.wicket.viewer.services.TranslationsResolverWicket +
 o.a.i.viewer.wicket.viewer.services.WicketViewerSettingsDefault +
@@ -3043,7 +3122,7 @@ org.webjars:popper.js:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:viewer:index/wicket/viewer/IsisModuleViewerWicketViewer.adoc[IsisModuleViewerWicketViewer], xref:refguide:viewer:index/wicket/viewer/mixins/Object_clearHints.adoc[Object_clearHints]
+xref:refguide:viewer:index/wicket/viewer/IsisModuleViewerWicketViewer.adoc[IsisModuleViewerWicketViewer], xref:refguide:viewer:index/wicket/viewer/mixins/Object_clearHints.adoc[Object_clearHints], xref:refguide:viewer:index/wicket/viewer/services/ImpersonatedUserHolderForWicket.adoc[ImpersonatedUserHolderForWicket]
 ****
 |===
 
@@ -3308,12 +3387,7 @@ Artifact: isis-valuetypes-asciidoc-ui-vaa
 Type: jar
 Directory: /valuetypes/asciidoc/ui/vaadin
 ----
-|.Components
-****
-o.a.i.valuetypes.asciidoc.ui.vaa.components.AsciiDocFieldFactoryVaa +
-****
-
-.Dependencies
+|.Dependencies
 ****
 org.apache.isis.incubator.viewer:isis-viewer-vaadin-ui:jar:${project.version} +
 ****
@@ -4382,6 +4456,7 @@ Directory: /extensions/security/secman/applib
 o.a.i.extensions.secman.applib.feature.api.ApplicationFeatureChoices +
 o.a.i.extensions.secman.applib.role.dom.ApplicationRoleRepositoryAbstract +
 o.a.i.extensions.secman.applib.seed.SeedSecurityModuleService +
+o.a.i.extensions.secman.applib.user.menu.MeService$UserMenuMeActionAdvisor +
 ****
 
 .Dependencies
@@ -4391,7 +4466,7 @@ org.apache.isis.testing:isis-testing-fixtures-applib:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:extensions:index/secman/applib/IsisModuleExtSecmanApplib.adoc[IsisModuleExtSecmanApplib], xref:refguide:extensions:index/secman/applib/SecmanConfiguration.adoc[SecmanConfiguration], xref:refguide:extensions:index/secman/applib/permission/dom/ApplicationPermission.adoc[ApplicationPermission], xref:refguide:extensions:index/secman/applib/permission/dom/ApplicationPermissionMode.adoc[ApplicationPermissionMode], xref:refguide:extensions:index/secman/applib/permission/dom/Applic [...]
+xref:refguide:extensions:index/secman/applib/IsisModuleExtSecmanApplib.adoc[IsisModuleExtSecmanApplib], xref:refguide:extensions:index/secman/applib/SecmanConfiguration.adoc[SecmanConfiguration], xref:refguide:extensions:index/secman/applib/permission/dom/ApplicationPermission.adoc[ApplicationPermission], xref:refguide:extensions:index/secman/applib/permission/dom/ApplicationPermissionMode.adoc[ApplicationPermissionMode], xref:refguide:extensions:index/secman/applib/permission/dom/Applic [...]
 ****
 
 |Apache Isis Ext - Sec Man Encryption (Using jbcrypt)
@@ -5264,7 +5339,7 @@ org.datanucleus:javax.jdo:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:subdomains:index/base/applib/Chained.adoc[Chained], xref:refguide:subdomains:index/base/applib/Dflt.adoc[Dflt], xref:refguide:subdomains:index/base/applib/IsisModuleSubdomainsBaseApplib.adoc[IsisModuleSubdomainsBaseApplib], xref:refguide:subdomains:index/base/applib/PowerType.adoc[PowerType], xref:refguide:subdomains:index/base/applib/Titled.adoc[Titled], xref:refguide:subdomains:index/base/applib/TitledEnum.adoc[TitledEnum], xref:refguide:subdomains:index/base/applib/servi [...]
+xref:refguide:subdomains:index/base/applib/Chained.adoc[Chained], xref:refguide:subdomains:index/base/applib/Dflt.adoc[Dflt], xref:refguide:subdomains:index/base/applib/IsisModuleSubdomainsBaseApplib.adoc[IsisModuleSubdomainsBaseApplib], xref:refguide:subdomains:index/base/applib/PowerType.adoc[PowerType], xref:refguide:subdomains:index/base/applib/Titled.adoc[Titled], xref:refguide:subdomains:index/base/applib/TitledEnum.adoc[TitledEnum], xref:refguide:subdomains:index/base/applib/servi [...]
 ****
 |===
 
@@ -5961,24 +6036,7 @@ Artifact: isis-regressiontests-stable
 Type: jar
 Directory: /regressiontests/stable
 ----
-|.Components
-****
-o.a.i.testdomain.applayer.ApplicationLayerTestFactory +
-o.a.i.testdomain.applayer.ApplicationLayerTestFactory$PreCommitListener +
-o.a.i.testdomain.applayer.publishing.CommandSubscriberForTesting +
-o.a.i.testdomain.applayer.publishing.EntityChangesSubscriberForTesting +
-o.a.i.testdomain.applayer.publishing.EntityPropertyChangeSubscriberForTesting +
-o.a.i.testdomain.applayer.publishing.ExecutionSubscriberForTesting +
-o.a.i.testdomain.conf.Configuration_headless$HeadlessCommandSupport +
-o.a.i.testdomain.jdo.JdoInventoryDao +
-o.a.i.testdomain.jpa.JpaInventoryDao +
-o.a.i.testdomain.jpa.springdata.EmployeeRepository +
-o.a.i.testdomain.util.interaction.InteractionBoundaryProbe +
-o.a.i.testdomain.util.kv.KVStoreForTesting +
-o.a.i.testdomain.util.rest.RestEndpointService +
-****
-
-.Dependencies
+|.Dependencies
 ****
 org.apache.isis.extensions:isis-extensions-cors-impl:jar:<managed> +
 org.glassfish.jersey.ext:jersey-spring5:jar:<managed> +

[isis] 01/02: ISIS-2813: improves docs on column order

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

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

commit fe533857d743bbc70c28fc342f1ad2bc9e7a59f2
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jul 26 11:27:08 2021 +0100

    ISIS-2813: improves docs on column order
---
 .../modules/applib-classes/pages/layout.adoc       |  1 -
 .../applib-classes/pages/layout/column-order.adoc  | 63 ----------------
 .../modules/fun/pages/ui/table-columns.adoc        | 88 ++++++++++++++++++++--
 3 files changed, 82 insertions(+), 70 deletions(-)

diff --git a/antora/components/refguide/modules/applib-classes/pages/layout.adoc b/antora/components/refguide/modules/applib-classes/pages/layout.adoc
index e442801..53deec6 100644
--- a/antora/components/refguide/modules/applib-classes/pages/layout.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/layout.adoc
@@ -5,4 +5,3 @@
 
 include::layout/object-layout.adoc[leveloffset=+1]
 include::layout/menubars.adoc[leveloffset=+1]
-include::layout/column-order.adoc[leveloffset=+1]
diff --git a/antora/components/refguide/modules/applib-classes/pages/layout/column-order.adoc b/antora/components/refguide/modules/applib-classes/pages/layout/column-order.adoc
index 1446eef..1b10543 100644
--- a/antora/components/refguide/modules/applib-classes/pages/layout/column-order.adoc
+++ b/antora/components/refguide/modules/applib-classes/pages/layout/column-order.adoc
@@ -5,66 +5,3 @@
 :page-partial:
 
 
-The xref:refguide:applib:index/services/tablecol/TableColumnOrderService.adoc[TableColumnOrderService] SPI allows applications to define the order in which property columns appear in tables, for both parented and standalone collections.
-
-Although this is an SPI, the framework also provides an out-of-the-box implementation that uses simple text files to specify the column order.
-These simple files can be reloaded dynamically during prototyping, so make it easy to change the order of columns (or hide columns completely).
-
-== Parented Collections
-
-For parented collections, the file should be called `ParentedClass#collectionId.columnOrder.txt`.
-
-For example, suppose that `Customer` has an `orders` collection consisting of ``Order``s, where the default ordering of properties (from the xref:refguide:applib:index/annotation/PropertyLayout.adoc#sequence[@PropertyLayout#sequence] annotation) is (say) "orderNum", "orderStatus", "orderDate", "orderAmount".
-
-This order can be changed using this file:
-
-[source,text]
-.Customer#orders.columnOrder.txt
-----
-orderNum
-orderDate
-orderStatus
-----
-
-=== Commented out and unknown properties
-
-Note also that the following would return the same result:
-
-[source,text]
-.Customer#orders.columnOrder.txt
-----
-orderNum
-#orderAmount
-orderDate
-orderStatus
-nonsense
-----
-
-Here the "orderAmount" is commented out and so is excluded because the line is not an exact match.
-The same is true for "nonsense"; it doesn't match any of the original properties of the `Order` class.
-
-
-== Standalone Collections
-
-For parented collections, the file should be called `Class.columnOrder.txt`.
-
-For example, suppose that the `Order` entity is returned from various repository queries as a standalone collection, where (as in the example above) the default ordering of properties (from the xref:refguide:applib:index/annotation/PropertyLayout.adoc#sequence[@PropertyLayout#sequence] annotation) is (say) "orderNum", "orderStatus", "orderDate", "orderAmount".
-
-This order can be changed using this file:
-
-[source,text]
-.Order.columnOrder.txt
-----
-orderNum
-orderDate
-orderStatus
-----
-
-== Customising the Implementation
-
-The above behaviour is provided by the xref:refguide:core:index/metamodel/services/tablecol/TableColumnOrderServiceUsingTxtFile.adoc[TableColumnOrderServiceUsingTxtFile] implementation of the xref:refguide:applib:index/services/tablecol/TableColumnOrderService.adoc[TableColumnOrderService] SPI.
-
-If necessary, the class can be subclassed to change the convention for searching for class files; just make sure that the subclass has an earlier `Precedence` than the framework so that it is picked up first.
-
-You could of course also use it as the inspiration of your own more sophisticated implementation.
-
diff --git a/antora/components/userguide/modules/fun/pages/ui/table-columns.adoc b/antora/components/userguide/modules/fun/pages/ui/table-columns.adoc
index 139063c..540de08 100644
--- a/antora/components/userguide/modules/fun/pages/ui/table-columns.adoc
+++ b/antora/components/userguide/modules/fun/pages/ui/table-columns.adoc
@@ -8,23 +8,99 @@
 
 The optional xref:refguide:applib:index/services/tablecol/TableColumnOrderService.adoc[TableColumnOrderService] SPI service can be used to reorder columns in a table, either for a parented collection (owned by parent domain object) or a standalone collection (returned from an action invocation).
 
+== Parented Collections
+
 For example, suppose there is a `Customer` and an `Order`:
 
 [plantuml]
 ....
+hide empty members
+
 Customer "1" *-r-> "0..*" Order : "    orders"
 
 class Order {
-    int num
-    Date placedOn
-    Date shippedOn
-    State state
+    num: int
+    placedOn: Date
+    shippedOn: Date
+    state: State
+    amount: BigDecimal
 }
 ....
 
-The order of these properties of `Order`, when rendered in the context of its owning `Customer`, can be controlled using this implementation of `TableColumnOrderService`:
+The order of these properties of `Order`, when rendered in the context of its owning `Customer`, can be controlled using this implementation of `TableColumnOrderService`.
+
+
+
+Although xref:refguide:applib:index/services/tablecol/TableColumnOrderService.adoc[TableColumnOrderService] is an SPI, the framework also provides an out-of-the-box implementation that uses simple text files to specify the column order.
+These simple files can be reloaded dynamically during prototyping, so make it easy to change the order of columns (or hide columns completely).
+
+In the parented collections this file's name follows the format  "<ParentedClass>#<collectionId>.columnOrder.txt".
+In the example above it would therefore be called `Customer#orders.columnOrder.txt`, and would look something like:
+
+[source,text]
+.Customer#orders.columnOrder.txt
+----
+num
+placedOn
+state
+shippedOn
+----
+
+=== Commented out and unknown properties
+
+Note also that the following would return the same result:
+
+[source,text]
+.Customer#orders.columnOrder.txt
+----
+num
+placedOn
+#amount
+state
+shippedOn
+nonsense
+----
+
+Here the "amount" is commented out and so is excluded because the line is not an exact match.
+The same is true for "nonsense"; it doesn't match any of the original properties of the `Order` class.
+
+
+== Standalone Collections
+
+For parented collections, the file name should be called `<Class>.columnOrder.txt`.
+
+For example, suppose that the `Order` entity is returned from various repository queries as a standalone collection, with a default ordering of properties inferred from the xref:refguide:applib:index/annotation/PropertyLayout.adoc#sequence[@PropertyLayout#sequence] annotation or by reading from `Order.layout.xml`.
+
+This column order can be changed using this file:
+
+[source,text]
+.Order.columnOrder.txt
+----
+num
+placedOn
+state
+----
+
+
+== Customising the Default Implementation
+
+The above behaviour is provided by the xref:refguide:core:index/metamodel/services/tablecol/TableColumnOrderServiceUsingTxtFile.adoc[TableColumnOrderServiceUsingTxtFile] implementation of the xref:refguide:applib:index/services/tablecol/TableColumnOrderService.adoc[TableColumnOrderService] SPI.
+
+If necessary, the class can be subclassed to change the convention for searching for class files; just make sure that the subclass has an earlier `Precedence` than the framework so that it is picked up first.
+
+You could of course also use it as the inspiration of your own more sophisticated implementation.
+
+
+
+
+== Fully Custom Implementation
+
+If the out-of-the-box implementation provided by provided by the xref:refguide:core:index/metamodel/services/tablecol/TableColumnOrderServiceUsingTxtFile.adoc[TableColumnOrderServiceUsingTxtFile] is too inflexible, then it can be overridden with a fully custom implementation.
+
+For example:
 
 [source,java]
+.TableColumnOrderServiceForCustomerOrders.java
 ----
 @Service
 @Priority(PriorityPrecedence.EARLY)                     // <.>
@@ -51,4 +127,4 @@ public class TableColumnOrderServiceForCustomerOrders
 <.> represents the collection that this service can advise upon
 <.> provides no advice
 
-
+(Of course, this particular implementation does nothing that is not also provided by the default implementation).
\ No newline at end of file