You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/08/11 13:58:56 UTC

[isis] branch master updated: ISIS-3119: updates doc index

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 205d3addfb ISIS-3119: updates doc index
205d3addfb is described below

commit 205d3addfb7cde3607450fac73035840921be7b7
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Aug 11 15:58:50 2022 +0200

    ISIS-3119: updates doc index
---
 .../mixins/layout/Object_downloadLayoutXml.adoc    |   8 +-
 .../mixins/metamodel/Object_logicalTypeName.adoc   |   4 +-
 .../index/services/bookmark/IdStringifier.adoc     |  26 +--
 .../pages/index/services/grid/GridService.adoc     |   7 +-
 .../services/iactnlayer/InteractionContext.adoc    |  11 ++
 .../keyvaluestore/KeyValueSessionStore.adoc        |  70 ++++++++
 .../index/services/layout/LayoutExportStyle.adoc   |  43 +++++
 .../pages/index/services/layout/LayoutService.adoc |  16 +-
 .../applib/pages/index/services/layout/Style.adoc  |  70 --------
 .../services/urlencoding/UrlEncodingService.adoc   |  22 +++
 ...rlEncodingServiceUsingBaseEncodingAbstract.adoc |  16 --
 .../services/user/ImpersonatedUserHolder.adoc      |   2 +-
 .../user/UserCurrentSessionTimeZoneHolder.adoc     |  51 ++++++
 .../pages/index/value/semantics/Renderer.adoc      |  11 ++
 .../value/semantics/ValueSemanticsAbstract.adoc    |   1 +
 .../value/semantics/ValueSemanticsProvider.adoc    |  11 ++
 .../publish/LifecycleCallbackNotifier.adoc}        |  19 ++-
 .../publish/ObjectLifecyclePublisherDefault.adoc   |  10 +-
 .../manager/AuthorizationManager.adoc              |   2 +-
 .../changetracking/EntityChangeTracker.adoc        |  69 +++-----
 .../EntityPropertyChangePublisher.adoc             |   8 +-
 .../KeyValueStoreUsingHttpSession.adoc}            |  14 +-
 .../executionlog/applib/app/ExecutionLogMenu.adoc  |   2 +
 .../HasInteractionId_executionLogEntries.adoc      |   4 +-
 .../HasUsername_recentExecutionsByUser.adoc}       |  11 +-
 .../applib/app/ExecutionOutboxMenu.adoc}           |   8 +-
 .../secman/applib/user/dom/ApplicationUser.adoc    |   2 +
 .../IsisModulePersistenceJdoDatanucleus.adoc       |   2 +-
 ...ter.adoc => OffsetDateTimeConverterForJdo.adoc} |  10 +-
 ...nverter.adoc => OffsetTimeConverterForJdo.adoc} |   6 +-
 ...rter.adoc => ZonedDateTimeConverterForJdo.adoc} |   8 +-
 .../{applib => }/ByteArrayBlobRdbmsMapping.adoc    |   0
 .../applib => valuemappings}/IsisBlobMapping.adoc  |   0
 .../applib => valuemappings}/IsisClobMapping.adoc  |   0
 .../changetracking/EntityChangeTrackerJdo.adoc     |  39 -----
 .../jpa/applib/integration/IsisEntityListener.adoc |   2 +-
 .../index/jpa/applib/types/BlobJpaEmbeddable.adoc  |  24 ++-
 .../index/jpa/applib/types/ClobJpaEmbeddable.adoc  |  24 ++-
 .../changetracking/EntityChangeTrackerDefault.adoc |  51 ++++++
 .../PersistenceMetricsServiceJpa.adoc              |  14 --
 .../java/time/OffsetDateTimeConverterForJpa.adoc}  |  10 +-
 ...nverter.adoc => OffsetTimeConverterForJpa.adoc} |   6 +-
 ...rter.adoc => ZonedDateTimeConverterForJpa.adoc} |   8 +-
 .../authconverters/AuthenticationConverter.adoc    |   2 +-
 .../index/markdown/applib/value/Converter.adoc     |  25 +--
 .../applib/services/bookmark/IdStringifier.java    |   6 +-
 core/adoc/modules/_overview/pages/about.adoc       | 184 +++++++++++++--------
 47 files changed, 564 insertions(+), 375 deletions(-)

diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_downloadLayoutXml.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_downloadLayoutXml.adoc
index 373308ce2e..b1ba634ed6 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_downloadLayoutXml.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/layout/Object_downloadLayoutXml.adoc
@@ -9,9 +9,9 @@ Provides the ability to download the layout XML for any domain entity or view mo
 .Object_downloadLayoutXml.java
 ----
 class Object_downloadLayoutXml {
-  Object act(String fileName, Style style)
+  Object act(String fileName, LayoutExportStyle style)
   String default0Act()     // <.>
-  Style default1Act()     // <.>
+  LayoutExportStyle default1Act()     // <.>
 }
 ----
 
@@ -23,7 +23,7 @@ Defaults to the (simple) name of the domain object's class, with a `.layout` suf
 <.> xref:#default1Act_[default1Act()]
 +
 --
-Default style is _Style#NORMALIZED_ .
+Default style is _LayoutExportStyle#MINIMAL_ .
 --
 
 == Members
@@ -36,6 +36,6 @@ Defaults to the (simple) name of the domain object's class, with a `.layout` suf
 [#default1Act_]
 === default1Act()
 
-Default style is _Style#NORMALIZED_ .
+Default style is _LayoutExportStyle#MINIMAL_ .
 
 include::hooks/Object_downloadLayoutXml_see-also.adoc[]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/metamodel/Object_logicalTypeName.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/metamodel/Object_logicalTypeName.adoc
index f8510042a6..2ce848093e 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/mixins/metamodel/Object_logicalTypeName.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/metamodel/Object_logicalTypeName.adoc
@@ -1,9 +1,9 @@
 = Object_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 [...]
 
-Contributes a property exposing the logical object type of the domain object, typically as specified by _DomainObject#logicalTypeName()_ .
+Contributes a property exposing the logical object type of the domain object, typically as specified by _javax.inject.Named_ .
 
-The object type is also accessible from the _org.apache.isis.applib.services.bookmark.Bookmark_ of the object.
+The logical type name is also accessible from the _org.apache.isis.applib.services.bookmark.Bookmark_ of the object.
 
 == API
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/IdStringifier.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/IdStringifier.adoc
index 03b6f82868..d68261a7a1 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/IdStringifier.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/IdStringifier.adoc
@@ -13,23 +13,18 @@ The framework provides default implementations of this SPI for JDO (data store a
 .IdStringifier.java
 ----
 interface IdStringifier<T> {
-  boolean handles(Class<?> candidateValueClass)     // <.>
+  Class<T> getCorrespondingClass()
   String enstring(T value)     // <.>
-  T destring(String stringified, Class<?> targetEntityClass)     // <.>
+  T destring(String stringified)     // <.>
 }
 ----
 
-<.> xref:#handles_Class[handles(Class)]
-+
---
-Whether this xref:refguide:applib:index/services/bookmark/IdStringifier.adoc[IdStringifier] is able to _#enstring(Object)_ or _#destring(String, Class)_ values of this type.
---
 <.> xref:#enstring_T[enstring(T)]
 +
 --
-Convert the value (which will be of the same type as is _#handles(Class) handled_ into a string representation.
+Convert the value (which will be of the same type as returned by _#getCorrespondingClass()_ into a string representation.
 --
-<.> xref:#destring_String_Class[destring(String, Class)]
+<.> xref:#destring_String[destring(String)]
 +
 --
 Convert a string representation of the identifier (as returned by _#enstring(Object)_ ) into an object that can be used to retrieve.
@@ -37,19 +32,12 @@ Convert a string representation of the identifier (as returned by _#enstring(Obj
 
 == Members
 
-[#handles_Class]
-=== handles(Class)
-
-Whether this xref:refguide:applib:index/services/bookmark/IdStringifier.adoc[IdStringifier] is able to _#enstring(Object)_ or _#destring(String, Class)_ values of this type.
-
-Even though some implementations also require the owning entity type in order to _#destring(String, Class)_ , we do not consider that as part of this function; we assume that the entity type will be provided when necessary (by the JDO entity facet, in fact). This is sufficient.
-
 [#enstring_T]
 === enstring(T)
 
-Convert the value (which will be of the same type as is _#handles(Class) handled_ into a string representation.
+Convert the value (which will be of the same type as returned by _#getCorrespondingClass()_ into a string representation.
 
-[#destring_String_Class]
-=== destring(String, Class)
+[#destring_String]
+=== destring(String)
 
 Convert a string representation of the identifier (as returned by _#enstring(Object)_ ) into an object that can be used to retrieve.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/grid/GridService.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/grid/GridService.adoc
index 181a5611f9..cf5bbdfcc5 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/grid/GridService.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/grid/GridService.adoc
@@ -18,6 +18,7 @@ interface GridService {
   Grid normalize(Grid grid)     // <.>
   Grid complete(Grid grid)     // <.>
   Grid minimal(Grid grid)     // <.>
+  Grid toGridForExport(Class<?> domainClass, LayoutExportStyle style)
 }
 ----
 
@@ -122,21 +123,21 @@ The default implementation searches through all available xref:refguide:applib:i
 
 Returns a normalized grid for the domain class obtained previously using _#load(Class)_ .
 
-If a "normalized" grid is persisted as the `layout.xml` , then the expectation is that the _MemberOrder_ annotation can be removed from the domain class because the binding of properties/collections/actions will be within the XML. However, the layout annotations ( xref:refguide:applib:index/annotation/DomainObjectLayout.adoc[DomainObjectLayout] , xref:refguide:applib:index/annotation/ActionLayout.adoc[ActionLayout] , xref:refguide:applib:index/annotation/PropertyLayout.adoc[PropertyLayou [...]
+If a 'normalized' grid is persisted as the `layout.xml` , then the expectation is that any ordering metadata from layout annotations can be removed from the domain class because the binding of properties/collections/actions will be within the XML. However, the layout annotations ( xref:refguide:applib:index/annotation/DomainObjectLayout.adoc[DomainObjectLayout] , xref:refguide:applib:index/annotation/ActionLayout.adoc[ActionLayout] , xref:refguide:applib:index/annotation/PropertyLayout.a [...]
 
 [#complete_Grid]
 === complete(Grid)
 
 Modifies the provided xref:refguide:applib:index/layout/grid/Grid.adoc[Grid] with additional metadata, broadly speaking corresponding to the xref:refguide:applib:index/annotation/DomainObjectLayout.adoc[DomainObjectLayout] , xref:refguide:applib:index/annotation/ActionLayout.adoc[ActionLayout] , xref:refguide:applib:index/annotation/PropertyLayout.adoc[PropertyLayout] and xref:refguide:applib:index/annotation/CollectionLayout.adoc[CollectionLayout] .
 
-If a "completed" grid is persisted as the `layout.xml` , then there should be no need for any of the layout annotations, nor the _MemberOrder_ annotations, to be required in the domain class itself.
+If a 'complete' grid is persisted as the `layout.xml` , then there should be no need for any of the layout annotations, to be required in the domain class itself.
 
 [#minimal_Grid]
 === minimal(Grid)
 
 Modifies the provided xref:refguide:applib:index/layout/grid/Grid.adoc[Grid] , removing all metadata except the basic grid structure.
 
-If a "minimal" grid is persisted as the `layout.xml` , then the expectation is that most of the layout annotations ( xref:refguide:applib:index/annotation/DomainObjectLayout.adoc[DomainObjectLayout] , xref:refguide:applib:index/annotation/ActionLayout.adoc[ActionLayout] , xref:refguide:applib:index/annotation/PropertyLayout.adoc[PropertyLayout] , xref:refguide:applib:index/annotation/CollectionLayout.adoc[CollectionLayout] , but also _MemberOrder_ ) will still be retained in the domain c [...]
+If a 'minimal' grid is persisted as the `layout.xml` , then the expectation is that most of the layout annotations ( xref:refguide:applib:index/annotation/DomainObjectLayout.adoc[DomainObjectLayout] , xref:refguide:applib:index/annotation/ActionLayout.adoc[ActionLayout] , xref:refguide:applib:index/annotation/PropertyLayout.adoc[PropertyLayout] , xref:refguide:applib:index/annotation/CollectionLayout.adoc[CollectionLayout] will still be retained in the domain class code.
 
 include::hooks/GridService_010-implementation.adoc[]
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/iactnlayer/InteractionContext.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/iactnlayer/InteractionContext.adoc
index 7b92c97fd9..5f254ee6ec 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/iactnlayer/InteractionContext.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/iactnlayer/InteractionContext.adoc
@@ -11,6 +11,7 @@ Provides the user and scenario specific environment for an xref:refguide:applib:
 class InteractionContext {
   InteractionContext ofUserWithSystemDefaults(UserMemento user)     // <.>
   UserLocale getLocale()
+  InteractionContext withTimeZoneIfAny(Optional<ZoneId> zoneIdIfAny)     // <.>
   UnaryOperator<InteractionContext> switchUser(UserMemento userMemento)     // <.>
   UnaryOperator<InteractionContext> switchClock(VirtualClock clock)     // <.>
   UnaryOperator<InteractionContext> switchLocale(UserLocale locale)     // <.>
@@ -26,6 +27,11 @@ class InteractionContext {
 --
 Creates a new xref:refguide:applib:index/services/iactnlayer/InteractionContext.adoc[InteractionContext] with the specified user and system defaults for clock, locale and time-zone.
 --
+<.> xref:#withTimeZoneIfAny_Optional[withTimeZoneIfAny(Optional)]
++
+--
+Only override if zoneIdIfAny is present, otherwise acts as identity operation.
+--
 <.> xref:#switchUser_UserMemento[switchUser(UserMemento)]
 +
 --
@@ -69,6 +75,11 @@ Returns the _ZoneOffset_ at the current time _Instant_ (at which _ZoneId_ rules
 
 Creates a new xref:refguide:applib:index/services/iactnlayer/InteractionContext.adoc[InteractionContext] with the specified user and system defaults for clock, locale and time-zone.
 
+[#withTimeZoneIfAny_Optional]
+=== withTimeZoneIfAny(Optional)
+
+Only override if zoneIdIfAny is present, otherwise acts as identity operation.
+
 [#switchUser_UserMemento]
 === switchUser(UserMemento)
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/keyvaluestore/KeyValueSessionStore.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/keyvaluestore/KeyValueSessionStore.adoc
new file mode 100644
index 0000000000..cc676da34b
--- /dev/null
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/keyvaluestore/KeyValueSessionStore.adoc
@@ -0,0 +1,70 @@
+= KeyValueSessionStore
+: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 a mechanism for viewers to store arbitrary key value pairs on a per-session basis. That is usually a _HttpSession_ .
+
+This store _is_ used by the Wicket viewer. For example, the viewer remembers which time-zone the user has logged in. Or when impersonating.
+
+== API
+
+[source,java]
+.KeyValueSessionStore.java
+----
+interface KeyValueSessionStore {
+  boolean isSessionAvailable()     // <.>
+  void put(String key, Serializable value)     // <.>
+  Optional<T> lookupAs(String key, Class<T> requiredType)     // <.>
+  void clear(String key)     // <.>
+  Optional<String> lookupAsString(String key)
+  boolean getAsBoolean(String key)
+}
+----
+
+<.> xref:#isSessionAvailable_[isSessionAvailable()]
++
+--
+Whether a session is available, for storing/retrieving key/value pairs.
+--
+<.> xref:#put_String_Serializable[put(String, Serializable)]
++
+--
+Puts given value onto the session store, overriding any existing value. If value is null, removes the entry from the store.
+--
+<.> xref:#lookupAs_String_Class[lookupAs(String, Class)]
++
+--
+Optionally returns the value that is stored under given key, based on whether a corresponding entry exists.
+--
+<.> xref:#clear_String[clear(String)]
++
+--
+Removes the entry from the store.
+--
+
+== Members
+
+[#isSessionAvailable_]
+=== isSessionAvailable()
+
+Whether a session is available, for storing/retrieving key/value pairs.
+
+[#put_String_Serializable]
+=== put(String, Serializable)
+
+Puts given value onto the session store, overriding any existing value. If value is null, removes the entry from the store.
+
+In case there is no session for storing available, acts as a no-op.
+
+[#lookupAs_String_Class]
+=== lookupAs(String, Class)
+
+Optionally returns the value that is stored under given key, based on whether a corresponding entry exists.
+
+In case there is no session for storing available, will return _Optional#empty()_ .
+
+[#clear_String]
+=== clear(String)
+
+Removes the entry from the store.
+
+In case there is no session for storing available, acts as a no-op.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/layout/LayoutExportStyle.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/layout/LayoutExportStyle.adoc
new file mode 100644
index 0000000000..f9a1b8d721
--- /dev/null
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/layout/LayoutExportStyle.adoc
@@ -0,0 +1,43 @@
+= LayoutExportStyle _(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 [...]
+
+Format option when generating a layout file (while prototyping).
+
+Once a layout file is in place, its layout data takes precedence over any conflicting layout data from annotations.
+
+== API
+
+[source,java]
+.LayoutExportStyle.java
+----
+enum LayoutExportStyle {
+  COMPLETE     // <.>
+  MINIMAL     // <.>
+  LayoutExportStyle defaults()
+}
+----
+
+<.> xref:#COMPLETE[COMPLETE]
++
+--
+Format that yields a full representation for the `layout.xml` , such that any layout metadata annotations could be removed from the code, without affecting the resulting xref:refguide:applib:index/layout/grid/Grid.adoc[Grid] , when loaded from `layout.xml` .
+--
+<.> xref:#MINIMAL[MINIMAL]
++
+--
+Format that yields a minimal representation for the `layout.xml` , such that layout annotations are required in code to at least 'bind' the properties/collections/actions to their regions (groups and tabs).
+--
+
+== Members
+
+[#COMPLETE]
+=== COMPLETE
+
+Format that yields a full representation for the `layout.xml` , such that any layout metadata annotations could be removed from the code, without affecting the resulting xref:refguide:applib:index/layout/grid/Grid.adoc[Grid] , when loaded from `layout.xml` .
+
+[#MINIMAL]
+=== MINIMAL
+
+Format that yields a minimal representation for the `layout.xml` , such that layout annotations are required in code to at least 'bind' the properties/collections/actions to their regions (groups and tabs).
+
+In other words: the `layout.xml` is used only to specify the positioning of the groups and tabs.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/layout/LayoutService.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/layout/LayoutService.adoc
index 28d8a916c5..7b4a6887f5 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/layout/LayoutService.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/layout/LayoutService.adoc
@@ -9,18 +9,18 @@ Provides the ability to obtain the XML layout for a single domain object or for
 .LayoutService.java
 ----
 interface LayoutService {
-  String toXml(Class<?> domainClass, Style style)     // <.>
-  byte[] toZip(Style style)     // <.>
+  String toXml(Class<?> domainClass, LayoutExportStyle style)     // <.>
+  byte[] toZip(LayoutExportStyle style)     // <.>
   String toMenuBarsXml(MenuBarsService.Type type)     // <.>
 }
 ----
 
-<.> xref:#toXml_Class_Style[toXml(Class, Style)]
+<.> xref:#toXml_Class_LayoutExportStyle[toXml(Class, LayoutExportStyle)]
 +
 --
 Obtains the serialized XML form of the layout (grid) for the specified domain class.
 --
-<.> xref:#toZip_Style[toZip(Style)]
+<.> xref:#toZip_LayoutExportStyle[toZip(LayoutExportStyle)]
 +
 --
 Obtains a zip file of the serialized XML of the layouts (grids) of all domain entities and view models.
@@ -33,13 +33,13 @@ Obtains the serialized XML form of the menu bars layout ( xref:refguide:applib:i
 
 == Members
 
-[#toXml_Class_Style]
-=== toXml(Class, Style)
+[#toXml_Class_LayoutExportStyle]
+=== toXml(Class, LayoutExportStyle)
 
 Obtains the serialized XML form of the layout (grid) for the specified domain class.
 
-[#toZip_Style]
-=== toZip(Style)
+[#toZip_LayoutExportStyle]
+=== toZip(LayoutExportStyle)
 
 Obtains a zip file of the serialized XML of the layouts (grids) of all domain entities and view models.
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/layout/Style.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/layout/Style.adoc
deleted file mode 100644
index e1a5f3368f..0000000000
--- a/antora/components/refguide-index/modules/applib/pages/index/services/layout/Style.adoc
+++ /dev/null
@@ -1,70 +0,0 @@
-= Style _(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 [...]
-
-Mode of operation when downloading a layout file (while prototyping).
-
-It affects the way the file's content is assembled. Once a layout file is in place, its layout data takes precedence over any conflicting layout data from annotations.
-
-== API
-
-[source,java]
-.Style.java
-----
-enum Style {
-  CURRENT     // <.>
-  COMPLETE     // <.>
-  NORMALIZED     // <.>
-  MINIMAL     // <.>
-}
-----
-
-<.> xref:#CURRENT[CURRENT]
-+
---
-The current layout for the domain class.
---
-<.> xref:#COMPLETE[COMPLETE]
-+
---
-As per _#NORMALIZED_ , but also with all (non-null) facets for all properties/collections/actions also included included in the grid.
---
-<.> xref:#NORMALIZED[NORMALIZED]
-+
---
-Default, whereby missing properties/collections/actions are added to regions, and unused/empty regions are removed/trimmed.
---
-<.> xref:#MINIMAL[MINIMAL]
-+
---
-As per _#NORMALIZED_ , but with no properties/collections/actions.
---
-
-== Members
-
-[#CURRENT]
-=== CURRENT
-
-The current layout for the domain class.
-
-If a `layout.xml` exists, then the grid returned will correspond to that grid, having been _org.apache.isis.applib.services.grid.GridService#normalize(Grid) normalized_ . If there is no `layout.xml` file, then the grid returned will be the _org.apache.isis.applib.services.grid.GridService#defaultGridFor(Class) default grid_ , also _org.apache.isis.applib.services.grid.GridService#normalize(Grid) normalized_ .
-
-[#COMPLETE]
-=== COMPLETE
-
-As per _#NORMALIZED_ , but also with all (non-null) facets for all properties/collections/actions also included included in the grid.
-
-The intention here is that any layout metadata annotations can be removed from the code.
-
-[#NORMALIZED]
-=== NORMALIZED
-
-Default, whereby missing properties/collections/actions are added to regions, and unused/empty regions are removed/trimmed.
-
-It should be possible to remove any _PropertyLayout#sequence()_ , _CollectionLayout#sequence()_ and _ActionLayout#sequence()_ annotation attributes, but _PropertyLayout#fieldSetId()_ / _PropertyLayout#fieldSetName()_ annotation attributes would need to be retained.
-
-[#MINIMAL]
-=== MINIMAL
-
-As per _#NORMALIZED_ , but with no properties/collections/actions.
-
-The intention here is for layout annotations that "bind" the properties/collections/actions to the regions to be retained; the `layout.xml` is used only to specify the positioning of the groups and tabs.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/urlencoding/UrlEncodingService.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/urlencoding/UrlEncodingService.adoc
index 37cd6a9225..d4009c1031 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/urlencoding/UrlEncodingService.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/urlencoding/UrlEncodingService.adoc
@@ -15,6 +15,8 @@ interface UrlEncodingService {
   byte[] decode(String str)     // <.>
   String encodeString(String str)
   String decodeToString(String str)
+  UrlEncodingService forTesting()     // <.>
+  UrlEncodingService forTestingNoCompression()     // <.>
 }
 ----
 
@@ -28,6 +30,16 @@ Converts the string (eg view model memento) into a string safe for use within an
 --
 Unconverts the string from its URL form into its original form URL.
 --
+<.> xref:#forTesting_[forTesting()]
++
+--
+Uses base64 with compression.
+--
+<.> xref:#forTestingNoCompression_[forTestingNoCompression()]
++
+--
+Uses base64 without compression.
+--
 
 == Members
 
@@ -43,6 +55,16 @@ Unconverts the string from its URL form into its original form URL.
 
 Reciprocal of _#encode(byte[])_ .
 
+[#forTesting_]
+=== forTesting()
+
+Uses base64 with compression.
+
+[#forTestingNoCompression_]
+=== forTestingNoCompression()
+
+Uses base64 without compression.
+
 include::hooks/UrlEncodingService_010-implementation.adoc[]
 
 include::hooks/UrlEncodingService_020-examples-and-usage.adoc[]
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/urlencoding/UrlEncodingServiceUsingBaseEncodingAbstract.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/urlencoding/UrlEncodingServiceUsingBaseEncodingAbstract.adoc
deleted file mode 100644
index 3a63e02305..0000000000
--- a/antora/components/refguide-index/modules/applib/pages/index/services/urlencoding/UrlEncodingServiceUsingBaseEncodingAbstract.adoc
+++ /dev/null
@@ -1,16 +0,0 @@
-= UrlEncodingServiceUsingBaseEncodingAbstract
-: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 [...]
-
-Provided as a convenient base class for providing alternative implementations of xref:refguide:applib:index/services/urlencoding/UrlEncodingService.adoc[UrlEncodingService] .
-
-== API
-
-[source,java]
-.UrlEncodingServiceUsingBaseEncodingAbstract.java
-----
-class UrlEncodingServiceUsingBaseEncodingAbstract {
-  String encode(byte[] bytes)
-  byte[] decode(String str)
-}
-----
-
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/user/ImpersonatedUserHolder.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/user/ImpersonatedUserHolder.adoc
index 2a9419a42b..8b70d0bca5 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/services/user/ImpersonatedUserHolder.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/user/ImpersonatedUserHolder.adoc
@@ -3,7 +3,7 @@
 
 Used by the framework's default implementation of xref:refguide:applib:index/services/user/UserService.adoc[UserService] to allow the current user to be temporarily impersonated.
 
-The intention is that viewers provide an implementation of this service.. Note that the Wicket viewer _does_ implement this service and uses an _HttpSession_ ; this will have the side-effect
+The intention is that viewers provide an implementation of this service. Note that the Wicket viewer _does_ implement this service and uses an _HttpSession_ ; this will have the side-effect
 
 == API
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/user/UserCurrentSessionTimeZoneHolder.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/user/UserCurrentSessionTimeZoneHolder.adoc
new file mode 100644
index 0000000000..8e94b3ef71
--- /dev/null
+++ b/antora/components/refguide-index/modules/applib/pages/index/services/user/UserCurrentSessionTimeZoneHolder.adoc
@@ -0,0 +1,51 @@
+= UserCurrentSessionTimeZoneHolder
+: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 [...]
+
+Stores the user's current _ZoneId_ with session scope.
+
+eg. on application login
+
+== API
+
+[source,java]
+.UserCurrentSessionTimeZoneHolder.java
+----
+interface UserCurrentSessionTimeZoneHolder {
+  void setUserTimeZone(ZoneId zoneId)     // <.>
+  Optional<ZoneId> getUserTimeZone()     // <.>
+  void clearUserTimeZone()     // <.>
+}
+----
+
+<.> xref:#setUserTimeZone_ZoneId[setUserTimeZone(ZoneId)]
++
+--
+Sets the user's current _ZoneId_ within the context of the current session.
+--
+<.> xref:#getUserTimeZone_[getUserTimeZone()]
++
+--
+Optionally returns the user's current _ZoneId_ , based on whether it was set before, within the context of the current session.
+--
+<.> xref:#clearUserTimeZone_[clearUserTimeZone()]
++
+--
+Clears the user's current _ZoneId_ within the context of the current session.
+--
+
+== Members
+
+[#setUserTimeZone_ZoneId]
+=== setUserTimeZone(ZoneId)
+
+Sets the user's current _ZoneId_ within the context of the current session.
+
+[#getUserTimeZone_]
+=== getUserTimeZone()
+
+Optionally returns the user's current _ZoneId_ , based on whether it was set before, within the context of the current session.
+
+[#clearUserTimeZone_]
+=== clearUserTimeZone()
+
+Clears the user's current _ZoneId_ within the context of the current session.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/value/semantics/Renderer.adoc b/antora/components/refguide-index/modules/applib/pages/index/value/semantics/Renderer.adoc
index ebe71d12fa..7b527cc8dd 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/value/semantics/Renderer.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/value/semantics/Renderer.adoc
@@ -9,6 +9,7 @@
 interface Renderer<T> {
   String titlePresentation(ValueSemanticsProvider.Context context, T value)     // <.>
   String htmlPresentation(ValueSemanticsProvider.Context context, T value)     // <.>
+  SyntaxHighlighter syntaxHighlighter()     // <.>
 }
 ----
 
@@ -22,6 +23,11 @@ The value in its read-only summarizing text presentation form. (title form)
 --
 The value rendered as HTML.
 --
+<.> xref:#syntaxHighlighter_[syntaxHighlighter()]
++
+--
+Governs whether, to switch on client-side syntax highlighting.
+--
 
 == Members
 
@@ -34,3 +40,8 @@ The value in its read-only summarizing text presentation form. (title form)
 === htmlPresentation(ValueSemanticsProvider_Context, T)
 
 The value rendered as HTML.
+
+[#syntaxHighlighter_]
+=== syntaxHighlighter()
+
+Governs whether, to switch on client-side syntax highlighting.
diff --git a/antora/components/refguide-index/modules/applib/pages/index/value/semantics/ValueSemanticsAbstract.adoc b/antora/components/refguide-index/modules/applib/pages/index/value/semantics/ValueSemanticsAbstract.adoc
index 520b0e2c09..1a0f1d6af0 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/value/semantics/ValueSemanticsAbstract.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/value/semantics/ValueSemanticsAbstract.adoc
@@ -12,6 +12,7 @@ class ValueSemanticsAbstract<T> {
   Renderer<T> getRenderer()
   Parser<T> getParser()
   DefaultsProvider<T> getDefaultsProvider()
+  IdStringifier<T> getIdStringifier()
   Can<T> getExamples()     // <.>
 }
 ----
diff --git a/antora/components/refguide-index/modules/applib/pages/index/value/semantics/ValueSemanticsProvider.adoc b/antora/components/refguide-index/modules/applib/pages/index/value/semantics/ValueSemanticsProvider.adoc
index 1b03e501d2..76ed92e8b1 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/value/semantics/ValueSemanticsProvider.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/value/semantics/ValueSemanticsProvider.adoc
@@ -22,6 +22,7 @@ interface ValueSemanticsProvider<T> {
   Renderer<T> getRenderer()     // <.>
   Parser<T> getParser()     // <.>
   DefaultsProvider<T> getDefaultsProvider()     // <.>
+  IdStringifier<T> getIdStringifier()     // <.>
   ValueSemanticsProvider<X> castTo(Class<X> cls)
   boolean isEnumType()
   boolean isNumberType()
@@ -70,6 +71,11 @@ The xref:refguide:applib:index/value/semantics/Parser.adoc[Parser] , if any.
 --
 The xref:refguide:applib:index/value/semantics/DefaultsProvider.adoc[DefaultsProvider] , if any.
 --
+<.> xref:#getIdStringifier_[getIdStringifier()]
++
+--
+The xref:refguide:applib:index/services/bookmark/IdStringifier.adoc[IdStringifier] , if any.
+--
 
 == Members
 
@@ -114,3 +120,8 @@ The xref:refguide:applib:index/value/semantics/Parser.adoc[Parser] , if any.
 The xref:refguide:applib:index/value/semantics/DefaultsProvider.adoc[DefaultsProvider] , if any.
 
 If not `null` , implies that the value has (or may have) a default.
+
+[#getIdStringifier_]
+=== getIdStringifier()
+
+The xref:refguide:applib:index/services/bookmark/IdStringifier.adoc[IdStringifier] , if any.
diff --git a/antora/components/refguide-index/modules/core/pages/index/webapp/impersonation/ImpersonatedUserHolderUsingHttpSession.adoc b/antora/components/refguide-index/modules/core/pages/index/runtimeservices/publish/LifecycleCallbackNotifier.adoc
similarity index 63%
rename from antora/components/refguide-index/modules/core/pages/index/webapp/impersonation/ImpersonatedUserHolderUsingHttpSession.adoc
rename to antora/components/refguide-index/modules/core/pages/index/runtimeservices/publish/LifecycleCallbackNotifier.adoc
index b756d10d3f..5fbe58bf9d 100644
--- a/antora/components/refguide-index/modules/core/pages/index/webapp/impersonation/ImpersonatedUserHolderUsingHttpSession.adoc
+++ b/antora/components/refguide-index/modules/core/pages/index/runtimeservices/publish/LifecycleCallbackNotifier.adoc
@@ -1,18 +1,21 @@
-= ImpersonatedUserHolderUsingHttpSession
+= LifecycleCallbackNotifier
 :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 [...]
 
-Implementation that supports impersonation, using the _HttpSession_ to store the value.
+Calls lifecycle callbacks for entities, ensuring that any given entity is only ever called once.
 
 == API
 
 [source,java]
-.ImpersonatedUserHolderUsingHttpSession.java
+.LifecycleCallbackNotifier.java
 ----
-class ImpersonatedUserHolderUsingHttpSession {
-  boolean supportsImpersonation()
-  void setUserMemento(UserMemento userMemento)
-  Optional<UserMemento> getUserMemento()
-  void clearUserMemento()
+class LifecycleCallbackNotifier {
+  void postCreate(ManagedObject entity)
+  void postLoad(ManagedObject entity)
+  void prePersist(ManagedObject entity)
+  void postPersist(ManagedObject entity)
+  void preUpdate(ManagedObject entity)
+  void postUpdate(ManagedObject entity)
+  void preRemove(ManagedObject entity)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/core/pages/index/runtimeservices/publish/ObjectLifecyclePublisherDefault.adoc b/antora/components/refguide-index/modules/core/pages/index/runtimeservices/publish/ObjectLifecyclePublisherDefault.adoc
index 7d5809ac89..81bd3f111e 100644
--- a/antora/components/refguide-index/modules/core/pages/index/runtimeservices/publish/ObjectLifecyclePublisherDefault.adoc
+++ b/antora/components/refguide-index/modules/core/pages/index/runtimeservices/publish/ObjectLifecyclePublisherDefault.adoc
@@ -7,14 +7,14 @@
 .ObjectLifecyclePublisherDefault.java
 ----
 class ObjectLifecyclePublisherDefault {
-  ObjectLifecyclePublisherDefault(EventBusService eventBusService, EntityPropertyChangePublisher entityPropertyChangePublisher)
-  void onPostCreate(ManagedObject domainObject)
+  LifecycleCallbackNotifier lifecycleCallbackNotifier()
+  void onPostCreate(ManagedObject entity)
+  void onPostLoad(ManagedObject entity)
   void onPrePersist(ManagedObject entity)
-  void onPreUpdate(ManagedObject entity, Can<PropertyChangeRecord> changeRecords)
-  void onPreRemove(ManagedObject entity)
   void onPostPersist(ManagedObject entity)
+  void onPreUpdate(ManagedObject entity, Can<PropertyChangeRecord> changeRecords)
   void onPostUpdate(ManagedObject entity)
-  void onPostLoad(ManagedObject entity)
+  void onPreRemove(ManagedObject entity)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/core/pages/index/security/authorization/manager/AuthorizationManager.adoc b/antora/components/refguide-index/modules/core/pages/index/security/authorization/manager/AuthorizationManager.adoc
index f604497d6c..1887e25f5f 100644
--- a/antora/components/refguide-index/modules/core/pages/index/security/authorization/manager/AuthorizationManager.adoc
+++ b/antora/components/refguide-index/modules/core/pages/index/security/authorization/manager/AuthorizationManager.adoc
@@ -9,7 +9,7 @@ Authorizes the user in the current session view and use members of an object.
 .AuthorizationManager.java
 ----
 class AuthorizationManager {
-  AuthorizationManager(List<Authorizor> authorizors, AuthorizorChooser authorizorChooser)
+  AuthorizationManager(List<Authorizor> authorizors, Optional<AuthorizorChooser> authorizorChooserIfAny)
   boolean isUsable(InteractionContext authentication, Identifier identifier)     // <.>
   boolean isVisible(InteractionContext authentication, Identifier identifier)     // <.>
 }
diff --git a/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTracker.adoc b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTracker.adoc
index 2621a2429e..d7e7d0d6e5 100644
--- a/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTracker.adoc
+++ b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTracker.adoc
@@ -9,86 +9,71 @@ Responsible for collecting the details of all changes to domain objects within a
 .EntityChangeTracker.java
 ----
 interface EntityChangeTracker {
+  EntityChangeTracker NOOP;     // <.>
   void enlistCreated(ManagedObject entity)     // <.>
+  void enlistUpdating(ManagedObject entity, Can<PropertyChangeRecord> propertyChangeRecords)     // <.>
   void enlistDeleting(ManagedObject entity)     // <.>
-  void enlistUpdating(ManagedObject entity)     // <.>
-  void recognizeLoaded(ManagedObject entity)     // <.>
-  void recognizePersisting(ManagedObject entity)     // <.>
-  void recognizeUpdating(ManagedObject entity)     // <.>
+  void incrementLoaded(ManagedObject entity)     // <.>
 }
 ----
 
-<.> xref:#enlistCreated_ManagedObject[enlistCreated(ManagedObject)]
+<.> xref:#NOOP[NOOP]
 +
 --
-Publishing support: for object stores to enlist an object that has just been created, capturing a dummy value `'[NEW]'` for the pre-modification value.
+Provided primarily for testing, but also used in cases where an attempt is made to resolve a bean but there is no active interaction.
 --
-<.> xref:#enlistDeleting_ManagedObject[enlistDeleting(ManagedObject)]
+<.> xref:#enlistCreated_ManagedObject[enlistCreated(ManagedObject)]
 +
 --
-Publishing support: for object stores to enlist an object that is about to be deleted, capturing the pre-deletion value of the properties of the _ManagedObject_ .
+Publishing support: for object stores to enlist an object that has just been created, capturing a dummy value `'[NEW]'` for the pre-modification value.
 --
-<.> xref:#enlistUpdating_ManagedObject[enlistUpdating(ManagedObject)]
+<.> xref:#enlistUpdating_ManagedObject_Can[enlistUpdating(ManagedObject, Can)]
 +
 --
 Publishing support: for object stores to enlist an object that is about to be updated, capturing the pre-modification values of the properties of the _ManagedObject_ .
 --
-<.> xref:#recognizeLoaded_ManagedObject[recognizeLoaded(ManagedObject)]
-+
---
-Fires the appropriate event and lifecycle callback: _LOADED_
---
-<.> xref:#recognizePersisting_ManagedObject[recognizePersisting(ManagedObject)]
+<.> xref:#enlistDeleting_ManagedObject[enlistDeleting(ManagedObject)]
 +
 --
-Fires the appropriate event and lifecycle callback: _PERSISTING_
+Publishing support: for object stores to enlist an object that is about to be deleted, capturing the pre-deletion value of the properties of the _ManagedObject_ .
 --
-<.> xref:#recognizeUpdating_ManagedObject[recognizeUpdating(ManagedObject)]
+<.> xref:#incrementLoaded_ManagedObject[incrementLoaded(ManagedObject)]
 +
 --
-Fires the appropriate event and lifecycle callback: _UPDATING_
+Not strictly part of the concern of entity tracking, but allows the default implementation to also implement the _org.apache.isis.applib.services.metrics.MetricsService_ .
 --
 
 == Members
 
+[#NOOP]
+=== NOOP
+
+Provided primarily for testing, but also used in cases where an attempt is made to resolve a bean but there is no active interaction.
+
 [#enlistCreated_ManagedObject]
 === enlistCreated(ManagedObject)
 
 Publishing support: for object stores to enlist an object that has just been created, capturing a dummy value `'[NEW]'` for the pre-modification value.
 
-Fires the appropriate event and lifecycle callback: _PERSISTED_
-
 The post-modification values are captured when the transaction commits.
 
-[#enlistDeleting_ManagedObject]
-=== enlistDeleting(ManagedObject)
-
-Publishing support: for object stores to enlist an object that is about to be deleted, capturing the pre-deletion value of the properties of the _ManagedObject_ .
-
-Fires the appropriate event and lifecycle callback: _REMOVING_
-
-The post-modification values are captured when the transaction commits. In the case of deleted objects, a dummy value `'[DELETED]'` is used as the post-modification value.
-
-[#enlistUpdating_ManagedObject]
-=== enlistUpdating(ManagedObject)
+[#enlistUpdating_ManagedObject_Can]
+=== enlistUpdating(ManagedObject, Can)
 
 Publishing support: for object stores to enlist an object that is about to be updated, capturing the pre-modification values of the properties of the _ManagedObject_ .
 
-Fires the appropriate event and lifecycle callback: _UPDATING_
-
 The post-modification values are captured when the transaction commits.
 
-[#recognizeLoaded_ManagedObject]
-=== recognizeLoaded(ManagedObject)
+Overload as an optimization for ORMs (specifically, JPA) where already have access to the changed records by accessing the ORM-specific data structures ( `EntityManager` 's unit-of-work).
 
-Fires the appropriate event and lifecycle callback: _LOADED_
+[#enlistDeleting_ManagedObject]
+=== enlistDeleting(ManagedObject)
 
-[#recognizePersisting_ManagedObject]
-=== recognizePersisting(ManagedObject)
+Publishing support: for object stores to enlist an object that is about to be deleted, capturing the pre-deletion value of the properties of the _ManagedObject_ .
 
-Fires the appropriate event and lifecycle callback: _PERSISTING_
+The post-modification values are captured when the transaction commits. In the case of deleted objects, a dummy value `'[DELETED]'` is used as the post-modification value.
 
-[#recognizeUpdating_ManagedObject]
-=== recognizeUpdating(ManagedObject)
+[#incrementLoaded_ManagedObject]
+=== incrementLoaded(ManagedObject)
 
-Fires the appropriate event and lifecycle callback: _UPDATING_
+Not strictly part of the concern of entity tracking, but allows the default implementation to also implement the _org.apache.isis.applib.services.metrics.MetricsService_ .
diff --git a/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityPropertyChangePublisher.adoc b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityPropertyChangePublisher.adoc
index 2ee3db469f..44dbd8d155 100644
--- a/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityPropertyChangePublisher.adoc
+++ b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityPropertyChangePublisher.adoc
@@ -9,11 +9,11 @@ Notifies _org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSub
 .EntityPropertyChangePublisher.java
 ----
 interface EntityPropertyChangePublisher {
-  void publishChangedProperties(HasEnlistedEntityPropertyChanges hasEnlistedEntityPropertyChanges)     // <.>
+  void publishChangedProperties()     // <.>
 }
 ----
 
-<.> xref:#publishChangedProperties_HasEnlistedEntityPropertyChanges[publishChangedProperties(HasEnlistedEntityPropertyChanges)]
+<.> xref:#publishChangedProperties_[publishChangedProperties()]
 +
 --
 Notifies _org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber_ s that a property of an entity has changed using the _org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber#onChanging(EntityPropertyChange)_ callback.
@@ -21,7 +21,7 @@ Notifies _org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSub
 
 == Members
 
-[#publishChangedProperties_HasEnlistedEntityPropertyChanges]
-=== publishChangedProperties(HasEnlistedEntityPropertyChanges)
+[#publishChangedProperties_]
+=== publishChangedProperties()
 
 Notifies _org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber_ s that a property of an entity has changed using the _org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber#onChanging(EntityPropertyChange)_ callback.
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc b/antora/components/refguide-index/modules/core/pages/index/webapp/keyvaluestore/KeyValueStoreUsingHttpSession.adoc
similarity index 70%
copy from antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
copy to antora/components/refguide-index/modules/core/pages/index/webapp/keyvaluestore/KeyValueStoreUsingHttpSession.adoc
index 7b1bd19d3a..6b089ce725 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
+++ b/antora/components/refguide-index/modules/core/pages/index/webapp/keyvaluestore/KeyValueStoreUsingHttpSession.adoc
@@ -1,14 +1,18 @@
-= IsoZonedDateTimeConverter
+= KeyValueStoreUsingHttpSession
 :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 [...]
 
+Implementation that uses the _HttpSession_ to store key/value pairs.
+
 == API
 
 [source,java]
-.IsoZonedDateTimeConverter.java
+.KeyValueStoreUsingHttpSession.java
 ----
-class IsoZonedDateTimeConverter {
-  String toDatastoreType(ZonedDateTime offsetTime)
-  ZonedDateTime toMemberType(String datastoreValue)
+class KeyValueStoreUsingHttpSession {
+  boolean isSessionAvailable()
+  void put(String key, Serializable value)
+  Optional<T> lookupAs(String key, Class<T> requiredType)
+  void clear(String key)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/app/ExecutionLogMenu.adoc b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/app/ExecutionLogMenu.adoc
index 346de6816b..6152ee3606 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/app/ExecutionLogMenu.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/app/ExecutionLogMenu.adoc
@@ -8,6 +8,8 @@
 ----
 class ExecutionLogMenu {
   public static final String LOGICAL_TYPE_NAME;
+  List<? extends ExecutionLogEntry> findMostRecent()
+  List<? extends ExecutionLogEntry> findAll()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/contributions/HasInteractionId_executionLogEntries.adoc b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/contributions/HasInteractionId_executionLogEntries.adoc
index f2fdfca14f..6c5b358546 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/contributions/HasInteractionId_executionLogEntries.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/contributions/HasInteractionId_executionLogEntries.adoc
@@ -7,8 +7,8 @@
 .HasInteractionId_executionLogEntries.java
 ----
 class HasInteractionId_executionLogEntries {
-  List<ExecutionLogEntry> act()
-  boolean hideAct()
+  List<? extends ExecutionLogEntry> coll()
+  boolean hideColl()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/contributions/HasUsername_recentExecutionsByUser.adoc
similarity index 76%
copy from antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
copy to antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/contributions/HasUsername_recentExecutionsByUser.adoc
index 7b1bd19d3a..f383c35cb1 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/contributions/HasUsername_recentExecutionsByUser.adoc
@@ -1,14 +1,15 @@
-= IsoZonedDateTimeConverter
+= HasUsername_recentExecutionsByUser
 :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]
-.IsoZonedDateTimeConverter.java
+.HasUsername_recentExecutionsByUser.java
 ----
-class IsoZonedDateTimeConverter {
-  String toDatastoreType(ZonedDateTime offsetTime)
-  ZonedDateTime toMemberType(String datastoreValue)
+class HasUsername_recentExecutionsByUser {
+  HasUsername_recentExecutionsByUser(HasUsername hasUsername)
+  List<? extends ExecutionLogEntry> coll()
+  boolean hideColl()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/app/ExecutionLogMenu.adoc b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/app/ExecutionOutboxMenu.adoc
similarity index 82%
copy from antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/app/ExecutionLogMenu.adoc
copy to antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/app/ExecutionOutboxMenu.adoc
index 346de6816b..7ec7fc2438 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/app/ExecutionLogMenu.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/app/ExecutionOutboxMenu.adoc
@@ -1,13 +1,15 @@
-= ExecutionLogMenu
+= ExecutionOutboxMenu
 :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]
-.ExecutionLogMenu.java
+.ExecutionOutboxMenu.java
 ----
-class ExecutionLogMenu {
+class ExecutionOutboxMenu {
   public static final String LOGICAL_TYPE_NAME;
+  List<? extends ExecutionOutboxEntry> findOldest()
+  List<? extends ExecutionOutboxEntry> findAll()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/user/dom/ApplicationUser.adoc b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/user/dom/ApplicationUser.adoc
index fdc4f2de12..096defb299 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/user/dom/ApplicationUser.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/secman/applib/user/dom/ApplicationUser.adoc
@@ -17,6 +17,8 @@ class ApplicationUser {
   boolean isHasPassword()
   boolean hideHasPassword()
   ApplicationPermissionValueSet getPermissionSet()
+  boolean isForSelf()
+  boolean isRunAsAdministrator()
   boolean isForSelfOrRunAsAdministrator()
   boolean isLocalAccount()
   int compareTo(org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser other)
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.adoc
index 40f101466a..f9e3433e78 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.adoc
@@ -8,7 +8,7 @@
 ----
 class IsisModulePersistenceJdoDatanucleus {
   DnJdoDialect getDnJdoDialect(DataSource dataSource)     // <.>
-  LocalPersistenceManagerFactoryBean getLocalPersistenceManagerFactoryBean(IsisConfiguration isisConfiguration, DataSource dataSource, MetaModelContext metaModelContext, EventBusService eventBusService, Provider<EntityChangeTracker> entityChangeTrackerProvider, IsisBeanTypeRegistry beanTypeRegistry, DatanucleusSettings dnSettings)
+  LocalPersistenceManagerFactoryBean getLocalPersistenceManagerFactoryBean(IsisConfiguration isisConfiguration, DataSource dataSource, MetaModelContext metaModelContext, ObjectLifecyclePublisher objectLifecyclePublisher, IsisBeanTypeRegistry beanTypeRegistry, DatanucleusSettings dnSettings)
   TransactionAwarePersistenceManagerFactoryProxy getTransactionAwarePersistenceManagerFactoryProxy(MetaModelContext metaModelContext, LocalPersistenceManagerFactoryBean localPmfBean, IsisBeanTypeRegistry beanTypeRegistry, List<JdoEntityDiscoveryListener> jdoEntityDiscoveryListeners, DatanucleusSettings dnSettings)
   JdoTransactionManager getTransactionManager(JdoDialect jdoDialect, LocalPersistenceManagerFactoryBean localPmfBean)
   TransactionInterceptorFactory getTransactionInterceptorFactory()     // <.>
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/OffsetDateTimeConverterForJdo.adoc
similarity index 78%
copy from antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
copy to antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/OffsetDateTimeConverterForJdo.adoc
index 7b1bd19d3a..e44867db38 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/OffsetDateTimeConverterForJdo.adoc
@@ -1,14 +1,14 @@
-= IsoZonedDateTimeConverter
+= OffsetDateTimeConverterForJdo
 :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]
-.IsoZonedDateTimeConverter.java
+.OffsetDateTimeConverterForJdo.java
 ----
-class IsoZonedDateTimeConverter {
-  String toDatastoreType(ZonedDateTime offsetTime)
-  ZonedDateTime toMemberType(String datastoreValue)
+class OffsetDateTimeConverterForJdo {
+  String toDatastoreType(OffsetDateTime offsetDateTime)
+  OffsetDateTime toMemberType(String datastoreValue)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoOffsetTimeConverter.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/OffsetTimeConverterForJdo.adoc
similarity index 90%
rename from antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoOffsetTimeConverter.adoc
rename to antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/OffsetTimeConverterForJdo.adoc
index 48a7015dc9..486a15e8bf 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoOffsetTimeConverter.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/OffsetTimeConverterForJdo.adoc
@@ -1,12 +1,12 @@
-= IsoOffsetTimeConverter
+= OffsetTimeConverterForJdo
 :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]
-.IsoOffsetTimeConverter.java
+.OffsetTimeConverterForJdo.java
 ----
-class IsoOffsetTimeConverter {
+class OffsetTimeConverterForJdo {
   String toDatastoreType(OffsetTime offsetTime)
   OffsetTime toMemberType(String datastoreValue)
 }
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/ZonedDateTimeConverterForJdo.adoc
similarity index 84%
copy from antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
copy to antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/ZonedDateTimeConverterForJdo.adoc
index 7b1bd19d3a..9f55869a05 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/ZonedDateTimeConverterForJdo.adoc
@@ -1,13 +1,13 @@
-= IsoZonedDateTimeConverter
+= ZonedDateTimeConverterForJdo
 :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]
-.IsoZonedDateTimeConverter.java
+.ZonedDateTimeConverterForJdo.java
 ----
-class IsoZonedDateTimeConverter {
-  String toDatastoreType(ZonedDateTime offsetTime)
+class ZonedDateTimeConverterForJdo {
+  String toDatastoreType(ZonedDateTime zonedDateTime)
   ZonedDateTime toMemberType(String datastoreValue)
 }
 ----
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuemappings/applib/ByteArrayBlobRdbmsMapping.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.adoc
similarity index 100%
rename from antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuemappings/applib/ByteArrayBlobRdbmsMapping.adoc
rename to antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.adoc
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuetypes/applib/IsisBlobMapping.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuemappings/IsisBlobMapping.adoc
similarity index 100%
rename from antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuetypes/applib/IsisBlobMapping.adoc
rename to antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuemappings/IsisBlobMapping.adoc
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuetypes/applib/IsisClobMapping.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuemappings/IsisClobMapping.adoc
similarity index 100%
rename from antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuetypes/applib/IsisClobMapping.adoc
rename to antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/valuemappings/IsisClobMapping.adoc
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/integration/changetracking/EntityChangeTrackerJdo.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/integration/changetracking/EntityChangeTrackerJdo.adoc
deleted file mode 100644
index 48c47122d9..0000000000
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/integration/changetracking/EntityChangeTrackerJdo.adoc
+++ /dev/null
@@ -1,39 +0,0 @@
-= EntityChangeTrackerJdo
-: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]
-.EntityChangeTrackerJdo.java
-----
-class EntityChangeTrackerJdo {
-  EntityChangeTrackerJdo(EntityPropertyChangePublisher entityPropertyChangePublisher, EntityChangesPublisher entityChangesPublisher, EventBusService eventBusService, Provider<InteractionProvider> interactionProviderProvider)
-  Set<PropertyChangeRecord> snapshotPropertyChangeRecords()
-  void onTransactionCompleting(TransactionBeforeCompletionEvent event)     // <.>
-  Optional<EntityChanges> getEntityChanges(java.sql.Timestamp timestamp, String userName)
-  Can<EntityPropertyChange> getPropertyChanges(java.sql.Timestamp timestamp, String userName, TransactionId txId)
-  Interaction currentInteraction()
-  long countPotentialPropertyChangeRecords()
-  int numberEntitiesLoaded()
-  int numberEntitiesDirtied()
-  void enlistCreated(ManagedObject entity)
-  void enlistDeleting(ManagedObject entity)
-  void enlistUpdating(ManagedObject entity)
-  void recognizeLoaded(ManagedObject entity)
-  void recognizePersisting(ManagedObject entity)
-  void recognizeUpdating(ManagedObject entity)
-}
-----
-
-<.> xref:#onTransactionCompleting_TransactionBeforeCompletionEvent[onTransactionCompleting(TransactionBeforeCompletionEvent)]
-+
---
-TRANSACTION END BOUNDARY
---
-
-== Members
-
-[#onTransactionCompleting_TransactionBeforeCompletionEvent]
-=== onTransactionCompleting(TransactionBeforeCompletionEvent)
-
-TRANSACTION END BOUNDARY
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/IsisEntityListener.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/IsisEntityListener.adoc
index 3c896370d1..5af4d24034 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/IsisEntityListener.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jpa/applib/integration/IsisEntityListener.adoc
@@ -14,12 +14,12 @@ The particular persistence layer implementation in use needs to be configured, w
 ----
 class IsisEntityListener {
   void onPrePersist(Object entityPojo)
+  void onPostLoad(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
index 120d26dade..50fc0d6ee4 100644
--- 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
@@ -5,7 +5,29 @@ A utility class to enable the persisting of xref:refguide:applib:index/value/Blo
 
 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,
+EclipseLink _does_ provide its own extension,Transformation API, but there's a lot of boilerplate involved even so.
+
+This class provides support for an alternative approach, where the Isis xref:refguide:applib:index/value/Blob.adoc[Blob] is marshalled in and out of this class.
+
+Example usage:
+
+----
+
+    @Embedded
+    private BlobJpaEmbeddable pdf;
+
+    @Property()
+    @PropertyLayout()
+    public Blob getPdf() {
+        return BlobJpaEmbeddable.toBlob(pdf);
+    }
+    public void setPdf(final Blob pdf) {
+        this.pdf = BlobJpaEmbeddable.fromBlob(pdf);
+    }
+   
+----
+
+Lastly; note that _javax.persistence.AttributeOverrides_ and _javax.persistence.AttributeOverride_ provide a standardised way of fine-tuning the column definitions.
 
 == API
 
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
index b3a093a370..88780a41b6 100644
--- 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
@@ -5,7 +5,29 @@ A utility class to enable the persisting of xref:refguide:applib:index/value/Clo
 
 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,
+EclipseLink _does_ provide its own extension,Transformation API, but there's a lot of boilerplate involved even so.
+
+This class provides support for an alternative approach, where the Isis xref:refguide:applib:index/value/Clob.adoc[Clob] is marshalled in and out of this class.
+
+Example usage:
+
+----
+
+    @Embedded
+    private ClobJpaEmbeddable xml;
+
+    @Property()
+    @PropertyLayout()
+    public Clob getXml() {
+        return ClobJpaEmbeddable.toClob(xml);
+    }
+    public void setPdf(final Clob xml) {
+        this.xml = ClobJpaEmbeddable.fromClob(xml);
+    }
+   
+----
+
+Lastly; note that _javax.persistence.AttributeOverrides_ and _javax.persistence.AttributeOverride_ provide a standardised way of fine-tuning the column definitions.
 
 == API
 
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/changetracking/EntityChangeTrackerDefault.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/changetracking/EntityChangeTrackerDefault.adoc
new file mode 100644
index 0000000000..199bce0504
--- /dev/null
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/changetracking/EntityChangeTrackerDefault.adoc
@@ -0,0 +1,51 @@
+= EntityChangeTrackerDefault
+:Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
+
+This service keeps track of all of the changes within a transactoin, for entities for which entity property change publishing is enabled (typically using the _DomainObject#entityChangePublishing() @DomainObject(entityChangePublishing=)_ annotation attribute.
+
+The service is xref:refguide:applib:index/annotation/InteractionScope.adoc[InteractionScope] d. In theory this could happen multiple times per interaction, so the data structures are cleared on each commit for potential reuse within the same interaction. (Of course, because the service _is_ interaction-scoped, a new instance of the service is created for each interaction, and so the data held in this service is private to each user's interaction.
+
+== API
+
+[source,java]
+.EntityChangeTrackerDefault.java
+----
+class EntityChangeTrackerDefault {
+  void destroy()
+  Set<PropertyChangeRecord> snapshotPropertyChangeRecords()
+  void onTransactionCompleting(TransactionBeforeCompletionEvent event)     // <.>
+  Optional<EntityChanges> getEntityChanges(java.sql.Timestamp timestamp, String userName)
+  Can<EntityPropertyChange> getPropertyChanges(java.sql.Timestamp timestamp, String userName, TransactionId txId)
+  Interaction currentInteraction()
+  long countPotentialPropertyChangeRecords()
+  void enlistCreated(ManagedObject entity)
+  void enlistUpdating(ManagedObject entity, Can<PropertyChangeRecord> ormPropertyChangeRecords)
+  void enlistDeleting(ManagedObject entity)
+  void incrementLoaded(ManagedObject entity)     // <.>
+  int numberEntitiesLoaded()
+  int numberEntitiesDirtied()
+}
+----
+
+<.> xref:#onTransactionCompleting_TransactionBeforeCompletionEvent[onTransactionCompleting(TransactionBeforeCompletionEvent)]
++
+--
+As called by _TransactionSubscriber_ , so long as there is an xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] in xref:refguide:applib:index/annotation/InteractionScope.adoc[InteractionScope] .
+--
+<.> xref:#incrementLoaded_ManagedObject[incrementLoaded(ManagedObject)]
++
+--
+Used only for the implementation of xref:refguide:applib:index/services/metrics/MetricsService.adoc[MetricsService] .
+--
+
+== Members
+
+[#onTransactionCompleting_TransactionBeforeCompletionEvent]
+=== onTransactionCompleting(TransactionBeforeCompletionEvent)
+
+As called by _TransactionSubscriber_ , so long as there is an xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] in xref:refguide:applib:index/annotation/InteractionScope.adoc[InteractionScope] .
+
+[#incrementLoaded_ManagedObject]
+=== incrementLoaded(ManagedObject)
+
+Used only for the implementation of xref:refguide:applib:index/services/metrics/MetricsService.adoc[MetricsService] .
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/changetracking/PersistenceMetricsServiceJpa.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/changetracking/PersistenceMetricsServiceJpa.adoc
deleted file mode 100644
index 6c77823416..0000000000
--- a/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/changetracking/PersistenceMetricsServiceJpa.adoc
+++ /dev/null
@@ -1,14 +0,0 @@
-= PersistenceMetricsServiceJpa
-: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]
-.PersistenceMetricsServiceJpa.java
-----
-class PersistenceMetricsServiceJpa {
-  int numberEntitiesLoaded()
-  int numberEntitiesDirtied()
-}
-----
-
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/OffsetDateTimeConverterForJpa.adoc
similarity index 77%
rename from antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
rename to antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/OffsetDateTimeConverterForJpa.adoc
index 7b1bd19d3a..bf8f9bf437 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/typeconverters/time/IsoZonedDateTimeConverter.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/OffsetDateTimeConverterForJpa.adoc
@@ -1,14 +1,14 @@
-= IsoZonedDateTimeConverter
+= OffsetDateTimeConverterForJpa
 :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]
-.IsoZonedDateTimeConverter.java
+.OffsetDateTimeConverterForJpa.java
 ----
-class IsoZonedDateTimeConverter {
-  String toDatastoreType(ZonedDateTime offsetTime)
-  ZonedDateTime toMemberType(String datastoreValue)
+class OffsetDateTimeConverterForJpa {
+  String convertToDatabaseColumn(OffsetDateTime offsetDateTime)
+  OffsetDateTime convertToEntityAttribute(String datastoreValue)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/JavaTimeIsoOffsetTimeConverter.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/OffsetTimeConverterForJpa.adoc
similarity index 89%
rename from antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/JavaTimeIsoOffsetTimeConverter.adoc
rename to antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/OffsetTimeConverterForJpa.adoc
index 59ae147fa8..ddedbbef9d 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/JavaTimeIsoOffsetTimeConverter.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/OffsetTimeConverterForJpa.adoc
@@ -1,12 +1,12 @@
-= JavaTimeIsoOffsetTimeConverter
+= OffsetTimeConverterForJpa
 :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]
-.JavaTimeIsoOffsetTimeConverter.java
+.OffsetTimeConverterForJpa.java
 ----
-class JavaTimeIsoOffsetTimeConverter {
+class OffsetTimeConverterForJpa {
   String convertToDatabaseColumn(OffsetTime offsetTime)
   OffsetTime convertToEntityAttribute(String datastoreValue)
 }
diff --git a/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/JavaTimeIsoZonedDateTimeConverter.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/ZonedDateTimeConverterForJpa.adoc
similarity index 82%
rename from antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/JavaTimeIsoZonedDateTimeConverter.adoc
rename to antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/ZonedDateTimeConverterForJpa.adoc
index 133e919bf3..f37a17a183 100644
--- a/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/JavaTimeIsoZonedDateTimeConverter.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jpa/integration/typeconverters/java/time/ZonedDateTimeConverterForJpa.adoc
@@ -1,13 +1,13 @@
-= JavaTimeIsoZonedDateTimeConverter
+= ZonedDateTimeConverterForJpa
 :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]
-.JavaTimeIsoZonedDateTimeConverter.java
+.ZonedDateTimeConverterForJpa.java
 ----
-class JavaTimeIsoZonedDateTimeConverter {
-  String convertToDatabaseColumn(ZonedDateTime offsetTime)
+class ZonedDateTimeConverterForJpa {
+  String convertToDatabaseColumn(ZonedDateTime zonedDateTime)
   ZonedDateTime convertToEntityAttribute(String datastoreValue)
 }
 ----
diff --git a/antora/components/refguide-index/modules/security/pages/index/spring/authconverters/AuthenticationConverter.adoc b/antora/components/refguide-index/modules/security/pages/index/spring/authconverters/AuthenticationConverter.adoc
index 78c704a6f0..72623e556e 100644
--- a/antora/components/refguide-index/modules/security/pages/index/spring/authconverters/AuthenticationConverter.adoc
+++ b/antora/components/refguide-index/modules/security/pages/index/spring/authconverters/AuthenticationConverter.adoc
@@ -32,6 +32,6 @@ Attempt to convert a Spring _Authentication_ (which will have been _Authenticati
 
 Attempt to convert a Spring _Authentication_ (which will have been _Authentication#isAuthenticated() authenticated_ ) into a xref:refguide:applib:index/services/user/UserMemento.adoc[UserMemento] .
 
-There are many different implementations of _Authentication_ , so the implementation should be targetted at a specific implementation.
+There are many different implementations of _Authentication_ , so the implementation should be targeted at a specific implementation.
 
 The framework provides some default implementations for the most common use cases.
diff --git a/antora/components/refguide-index/modules/valuetypes/pages/index/markdown/applib/value/Converter.adoc b/antora/components/refguide-index/modules/valuetypes/pages/index/markdown/applib/value/Converter.adoc
index f5eb3876c0..7885df2c2b 100644
--- a/antora/components/refguide-index/modules/valuetypes/pages/index/markdown/applib/value/Converter.adoc
+++ b/antora/components/refguide-index/modules/valuetypes/pages/index/markdown/applib/value/Converter.adoc
@@ -14,7 +14,7 @@ class Converter {
 <.> xref:#mdToHtml_String[mdToHtml(String)]
 +
 --
-For syntax highlighting to work, the client/browser needs to load specific java-script and css.
+For syntax highlighting to work, the client/browser needs to load specific Javascript and CSS. The framework supports this out of the box with its various viewers, using _Prism_ web-jars.
 --
 
 == Members
@@ -22,25 +22,4 @@ For syntax highlighting to work, the client/browser needs to load specific java-
 [#mdToHtml_String]
 === mdToHtml(String)
 
-For syntax highlighting to work, the client/browser needs to load specific java-script and css.
-
-1) In your web-app's _scripts/application.js_ include the bundled _src/main/resources/prism1.14.js_ .
-
-----
-
-function includeJs(jsFilePath) {
-    var js = document.createElement("script");
-    js.type = "text/javascript";
-    js.src = jsFilePath;
-    document.body.appendChild(js);
-}
-
-includeJs("/scripts/prism1.14.js");
-----
-
-2) In your web-app's _css/application.css_ include the bundled _src/main/resources/prism.css_ .
-
-----
-
- _@import "prism.css"_ .
-----
+For syntax highlighting to work, the client/browser needs to load specific Javascript and CSS. The framework supports this out of the box with its various viewers, using _Prism_ web-jars.
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
index c585083f2f..a1a596a169 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
@@ -29,8 +29,8 @@ import lombok.val;
 
 /**
  * SPI to convert the identifier (primary key) of an entity, of a given type (eg Integer) into a string, and
- * to convert back again into the key object used to actually look up the target entity instance; supported by both JDO
- * and JPA persistence mechanisms.
+ * to convert back again into the key object used to actually look up the target entity instance;
+ * supported by both JDO and JPA persistence mechanisms.
  *
  * <p>
  *     This is ultimately used by {@link BookmarkService} where we hold a persistent reference to an entity.  The
@@ -44,6 +44,8 @@ import lombok.val;
  *     An example of such is the JPA implementation of the <code>commandlog</code> extension.
  * </p>
  *
+ * @see org.apache.isis.core.runtime.idstringifier.IdStringifierService
+ *
  * @since 2.0 {@index}
  */
 public interface IdStringifier<T> {
diff --git a/core/adoc/modules/_overview/pages/about.adoc b/core/adoc/modules/_overview/pages/about.adoc
index 8e3c3bfb23..2f7ef511b0 100644
--- a/core/adoc/modules/_overview/pages/about.adoc
+++ b/core/adoc/modules/_overview/pages/about.adoc
@@ -968,9 +968,15 @@ demoapp.dom.types.primitive.shorts.persistence.PrimitiveShortSeeding +
 .Dependencies
 ****
 com.h2database:h2:jar:<managed> +
+org.apache.isis.extensions:isis-extensions-audittrail-persistence-jdo:jar:<managed> +
+org.apache.isis.extensions:isis-extensions-audittrail-persistence-jpa:jar:<managed> +
 org.apache.isis.extensions:isis-extensions-commandlog-persistence-jdo:jar:<managed> +
 org.apache.isis.extensions:isis-extensions-commandlog-persistence-jpa:jar:<managed> +
 org.apache.isis.extensions:isis-extensions-exceldownload-wicket-ui:jar:<managed> +
+org.apache.isis.extensions:isis-extensions-executionlog-persistence-jdo:jar:<managed> +
+org.apache.isis.extensions:isis-extensions-executionlog-persistence-jpa:jar:<managed> +
+org.apache.isis.extensions:isis-extensions-executionoutbox-persistence-jdo:jar:<managed> +
+org.apache.isis.extensions:isis-extensions-executionoutbox-persistence-jpa:jar:<managed> +
 org.apache.isis.extensions:isis-extensions-fullcalendar-applib:jar:<managed> +
 org.apache.isis.extensions:isis-extensions-pdfjs-applib:jar:<managed> +
 org.apache.isis.extensions:isis-extensions-secman-encryption-spring:jar:<managed> +
@@ -1052,7 +1058,7 @@ demoapp.web._infra.utils.ThereCanBeOnlyOne +
 
 .Dependencies
 ****
-org.apache.isis.examples.apps:demo-domain:jar:${project.version} +
+org.apache.isis.examples.apps:demo-domain:jar:<managed> +
 org.apache.isis.extensions:isis-extensions-cors-impl:jar:<managed> +
 org.apache.isis.mavendeps:isis-mavendeps-webapp:pom:<managed> +
 org.springframework.boot:spring-boot-starter:jar:<managed> +
@@ -1097,12 +1103,7 @@ Directory: /examples/demo/wicket/jdo
 |.Dependencies
 ****
 org.apache.isis.examples.apps:demo-wicket-common:jar:${project.version} +
-org.apache.isis.extensions:isis-extensions-commandlog-persistence-jdo:jar:<managed> +
-org.apache.isis.extensions:isis-extensions-secman-persistence-jdo:jar:<managed> +
-org.apache.isis.extensions:isis-extensions-sessionlog-persistence-jdo:jar:<managed> +
 org.apache.isis.persistence:isis-persistence-jdo-datanucleus:jar:<managed> +
-org.apache.isis.valuetypes:isis-valuetypes-asciidoc-persistence-jdo:jar:<managed> +
-org.apache.isis.valuetypes:isis-valuetypes-markdown-persistence-jdo:jar:<managed> +
 ****
 
 |Demo - Wicket/JPA
@@ -1116,12 +1117,7 @@ Directory: /examples/demo/wicket/jpa
 |.Dependencies
 ****
 org.apache.isis.examples.apps:demo-wicket-common:jar:${project.version} +
-org.apache.isis.extensions:isis-extensions-commandlog-persistence-jpa:jar:<managed> +
-org.apache.isis.extensions:isis-extensions-secman-persistence-jpa:jar:<managed> +
-org.apache.isis.extensions:isis-extensions-sessionlog-persistence-jpa:jar:<managed> +
 org.apache.isis.persistence:isis-persistence-jpa-eclipselink:jar:<managed> +
-org.apache.isis.valuetypes:isis-valuetypes-asciidoc-persistence-jpa:jar:<managed> +
-org.apache.isis.valuetypes:isis-valuetypes-markdown-persistence-jpa:jar:<managed> +
 ****
 
 |Demo - Wicket/JPA (with GraphQL)
@@ -1462,16 +1458,6 @@ default (Java) programming model.
 o.a.i.applib.annotation.DomainObject +
 o.a.i.applib.annotation.DomainService +
 o.a.i.applib.annotation.Value +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForBigDecimal +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForBigInteger +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForByte +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForCharacter +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForInteger +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForLong +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForSerializable +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForShort +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForString +
-o.a.i.applib.services.bookmark.idstringifiers.IdStringifierForUuid +
 o.a.i.applib.services.clock.ClockService +
 o.a.i.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto +
 o.a.i.applib.services.commanddto.conmap.ContentMappingServiceForCommandsDto +
@@ -1498,7 +1484,7 @@ org.jmock:jmock:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:applib:index/Identifier.adoc[Identifier], xref:refguide:applib:index/IsisModuleApplib.adoc[IsisModuleApplib], xref:refguide:applib:index/IsisModuleApplibChangeAndExecutionLoggers.adoc[IsisModuleApplibChangeAndExecutionLoggers], xref:refguide:applib:index/IsisModuleApplibMixins.adoc[IsisModuleApplibMixins], xref:refguide:applib:index/ViewModel.adoc[ViewModel], xref:refguide:applib:index/annotation/Action.adoc[Action], xref:refguide:applib:index/annotation/ActionLayout.adoc[A [...]
+xref:refguide:applib:index/Identifier.adoc[Identifier], xref:refguide:applib:index/IsisModuleApplib.adoc[IsisModuleApplib], xref:refguide:applib:index/IsisModuleApplibChangeAndExecutionLoggers.adoc[IsisModuleApplibChangeAndExecutionLoggers], xref:refguide:applib:index/IsisModuleApplibMixins.adoc[IsisModuleApplibMixins], xref:refguide:applib:index/ViewModel.adoc[ViewModel], xref:refguide:applib:index/annotation/Action.adoc[Action], xref:refguide:applib:index/annotation/ActionLayout.adoc[A [...]
 ****
 
 |Apache Isis Core - Code Gen (ByteBuddy)
@@ -1669,6 +1655,7 @@ o.a.i.core.metamodel.valuesemantics.LongValueSemantics +
 o.a.i.core.metamodel.valuesemantics.MarkupValueSemantics +
 o.a.i.core.metamodel.valuesemantics.OidDtoValueSemantics +
 o.a.i.core.metamodel.valuesemantics.PasswordValueSemantics +
+o.a.i.core.metamodel.valuesemantics.SerializableValueSemantics +
 o.a.i.core.metamodel.valuesemantics.ShortValueSemantics +
 o.a.i.core.metamodel.valuesemantics.StringValueSemantics +
 o.a.i.core.metamodel.valuesemantics.TreeNodeValueSemantics +
@@ -1716,7 +1703,7 @@ Directory: /core/runtime
 ****
 o.a.i.core.runtime.events.MetamodelEventService +
 o.a.i.core.runtime.events.TransactionEventEmitter +
-o.a.i.core.runtime.idstringifier.IdStringifierLookupService +
+o.a.i.core.runtime.idstringifier.IdStringifierService +
 ****
 
 .Dependencies
@@ -1763,6 +1750,7 @@ o.a.i.core.runtimeservices.publish.CommandPublisherDefault +
 o.a.i.core.runtimeservices.publish.EntityChangesPublisherDefault +
 o.a.i.core.runtimeservices.publish.EntityPropertyChangePublisherDefault +
 o.a.i.core.runtimeservices.publish.ExecutionPublisherDefault +
+o.a.i.core.runtimeservices.publish.LifecycleCallbackNotifier +
 o.a.i.core.runtimeservices.publish.ObjectLifecyclePublisherDefault +
 o.a.i.core.runtimeservices.recognizer.ExceptionRecognizerServiceDefault +
 o.a.i.core.runtimeservices.recognizer.dae.ExceptionRecognizerForDataAccessException +
@@ -1778,6 +1766,7 @@ o.a.i.core.runtimeservices.transaction.TransactionServiceSpring +
 o.a.i.core.runtimeservices.urlencoding.UrlEncodingServiceWithCompression +
 o.a.i.core.runtimeservices.user.ImpersonateMenuAdvisorDefault +
 o.a.i.core.runtimeservices.user.ImpersonatedUserHolderDefault +
+o.a.i.core.runtimeservices.user.UserCurrentSessionTimeZoneHolderDefault +
 o.a.i.core.runtimeservices.userreg.EmailNotificationServiceDefault +
 o.a.i.core.runtimeservices.wrapper.WrapperFactoryDefault +
 o.a.i.core.runtimeservices.xml.XmlServiceDefault +
@@ -1794,7 +1783,7 @@ org.hsqldb:hsqldb:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:core:index/runtimeservices/publish/ObjectLifecyclePublisherDefault.adoc[ObjectLifecyclePublisherDefault], xref:refguide:core:index/runtimeservices/spring/BeanDescriptor.adoc[BeanDescriptor], xref:refguide:core:index/runtimeservices/spring/ContextBeans.adoc[ContextBeans], xref:refguide:core:index/runtimeservices/spring/SpringBeansService.adoc[SpringBeansService], xref:refguide:core:index/runtimeservices/transaction/TransactionServiceSpring.adoc[TransactionServiceSpring], xre [...]
+xref:refguide:core:index/runtimeservices/publish/LifecycleCallbackNotifier.adoc[LifecycleCallbackNotifier], xref:refguide:core:index/runtimeservices/publish/ObjectLifecyclePublisherDefault.adoc[ObjectLifecyclePublisherDefault], xref:refguide:core:index/runtimeservices/spring/BeanDescriptor.adoc[BeanDescriptor], xref:refguide:core:index/runtimeservices/spring/ContextBeans.adoc[ContextBeans], xref:refguide:core:index/runtimeservices/spring/SpringBeansService.adoc[SpringBeansService], xref: [...]
 ****
 
 |Apache Isis Core - Security
@@ -1869,7 +1858,7 @@ Introduced to keep the 'runtime' package concise.
 ****
 o.a.i.core.webapp.confmenu.ConfigurationViewServiceDefault +
 o.a.i.core.webapp.health.HealthIndicatorUsingHealthCheckService +
-o.a.i.core.webapp.impersonation.ImpersonatedUserHolderUsingHttpSession +
+o.a.i.core.webapp.keyvaluestore.KeyValueStoreUsingHttpSession +
 o.a.i.core.webapp.modules.logonlog.WebModuleLogOnExceptionLogger +
 o.a.i.core.webapp.modules.templresources.WebModuleTemplateResources +
 o.a.i.core.webapp.webappctx.IsisWebAppContextInitializer +
@@ -1889,7 +1878,7 @@ org.springframework.boot:spring-boot-starter-thymeleaf:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:core:index/webapp/impersonation/ImpersonatedUserHolderUsingHttpSession.adoc[ImpersonatedUserHolderUsingHttpSession]
+xref:refguide:core:index/webapp/keyvaluestore/KeyValueStoreUsingHttpSession.adoc[KeyValueStoreUsingHttpSession]
 ****
 
 |Apache Isis - JDK Supplemental
@@ -1942,6 +1931,66 @@ xref:refguide:schema:index/IsisModuleSchema.adoc[IsisModuleSchema]
 
 == Persistence
 
+[plantuml,Persistence,svg]
+----
+@startuml(id=Persistence)
+title Persistence - Containers
+caption Artifact Hierarchy (Maven)
+
+skinparam {
+  shadowing false
+  arrowFontSize 10
+  defaultTextAlignment center
+  wrapWidth 200
+  maxMessageSize 100
+}
+hide stereotype
+left to right direction
+skinparam rectangle<<2>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2E6295
+}
+package "Persistence\n[Software System]" {
+  rectangle "==Apache Isis Persistence - Commons\n<size:10>[Container: packaging: jar]</size>" <<2>> as 2
+}
+@enduml
+----
+.Projects/Modules (Persistence)
+[cols="3a,5a", options="header"]
+|===
+|Coordinates |Description 
+
+|Apache Isis Persistence - Commons
+[source,yaml]
+----
+Group: org.apache.isis.persistence
+Artifact: isis-persistence-commons
+Type: jar
+Directory: /persistence/commons
+----
+|Apache Isis Common utilities for persistence stacks
+
+.Components
+****
+o.a.i.persistence.jpa.integration.changetracking.EntityChangeTrackerDefault +
+o.a.i.persistence.jpa.integration.changetracking.EntityChangeTrackerDefault$TransactionSubscriber +
+****
+
+.Dependencies
+****
+org.apache.isis.commons:isis-commons:jar:<managed> +
+org.apache.isis.core:isis-applib:jar:<managed> +
+org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
+org.apache.isis.core:isis-core-runtime:jar:<managed> +
+****
+
+.Document Index Entries
+****
+xref:refguide:persistence:index/jpa/integration/changetracking/EntityChangeTrackerDefault.adoc[EntityChangeTrackerDefault]
+****
+|===
+
 === JDO
 
 [plantuml,JDO,svg]
@@ -2063,23 +2112,23 @@ Directory: /persistence/jdo/datanucleus
 ****
 o.a.i.persistence.jdo.datanucleus.entities.DnEntityStateProvider +
 o.a.i.persistence.jdo.datanucleus.jdosupport.JdoSupportServiceDefault +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForByteId +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForByteIdentity +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForCharId +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForCharIdentity +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreId +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreIdImpl +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreUniqueLongId +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForIntId +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForIntIdentity +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForLongId +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForLongIdentity +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForObjectId +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForObjectIdentity +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForShortId +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForShortIdentity +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForStringId +
-o.a.i.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForStringIdentity +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoByteIdValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoByteIdentityValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoCharIdValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoCharIdentityValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoDatastoreIdImplValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoDatastoreIdValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoDatastoreUniqueLongIdValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoIntIdValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoIntIdentityValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoLongIdValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoLongIdentityValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoObjectIdValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoObjectIdentityValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoShortIdValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoShortIdentityValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoStringIdValueSemantics +
+o.a.i.persistence.jdo.datanucleus.valuetypes.JdoStringIdentityValueSemantics +
 ****
 
 .Dependencies
@@ -2099,7 +2148,7 @@ org.springframework.boot:spring-boot-starter-jdbc:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:persistence:index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.adoc[IsisModulePersistenceJdoDatanucleus], xref:refguide:persistence:index/jdo/datanucleus/changetracking/JdoLifecycleListener.adoc[JdoLifecycleListener], xref:refguide:persistence:index/jdo/datanucleus/dialect/DnJdoDialect.adoc[DnJdoDialect], xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.adoc[Persistable_datanucleusVersionLong], xref:refguide:persistence:index/ [...]
+xref:refguide:persistence:index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.adoc[IsisModulePersistenceJdoDatanucleus], xref:refguide:persistence:index/jdo/datanucleus/changetracking/JdoLifecycleListener.adoc[JdoLifecycleListener], xref:refguide:persistence:index/jdo/datanucleus/dialect/DnJdoDialect.adoc[DnJdoDialect], xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.adoc[Persistable_datanucleusVersionLong], xref:refguide:persistence:index/ [...]
 ****
 
 |Apache Isis Persistence - JDO (integration)
@@ -2112,27 +2161,18 @@ Directory: /persistence/jdo/integration
 ----
 |JDO Integration (powered by DataNucleus)
 
-.Components
-****
-o.a.i.persistence.jdo.integration.changetracking.EntityChangeTrackerJdo +
-****
-
 .Dependencies
 ****
 org.apache.isis.commons:isis-commons:jar:<managed> +
 org.apache.isis.core:isis-applib:jar:<managed> +
 org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
 org.apache.isis.core:isis-core-runtime:jar:<managed> +
+org.apache.isis.persistence:isis-persistence-commons:jar:<managed> +
 org.apache.isis.persistence:isis-persistence-jdo-applib:jar:<managed> +
 org.apache.isis.persistence:isis-persistence-jdo-metamodel:jar:<managed> +
 org.apache.isis.persistence:isis-persistence-jdo-spring:jar:<managed> +
 ****
 
-.Document Index Entries
-****
-xref:refguide:persistence:index/jdo/integration/changetracking/EntityChangeTrackerJdo.adoc[EntityChangeTrackerJdo]
-****
-
 |Apache Isis Persistence - JDO (metamodel)
 [source,yaml]
 ----
@@ -2310,7 +2350,7 @@ Directory: /persistence/jpa/eclipselink
 ****
 org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
 org.apache.isis.persistence:isis-persistence-jpa-integration:jar:<managed> +
-org.eclipse.persistence:org.eclipse.persistence.jpa:jar:2.7.10 +
+org.eclipse.persistence:org.eclipse.persistence.jpa:jar:2.7.11 +
 org.springframework.boot:spring-boot-starter-data-jpa:jar:<managed> +
 ****
 
@@ -2331,7 +2371,6 @@ Directory: /persistence/jpa/integration
 
 .Components
 ****
-o.a.i.persistence.jpa.integration.changetracking.PersistenceMetricsServiceJpa +
 o.a.i.persistence.jpa.integration.entity.JpaEntityIntegration +
 ****
 
@@ -2339,13 +2378,14 @@ o.a.i.persistence.jpa.integration.entity.JpaEntityIntegration +
 ****
 org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
 org.apache.isis.core:isis-core-runtime:jar:<managed> +
+org.apache.isis.persistence:isis-persistence-commons:jar:<managed> +
 org.apache.isis.persistence:isis-persistence-jpa-metamodel:jar:<managed> +
 org.springframework.data:spring-data-jpa:jar:<managed> +
 ****
 
 .Document Index Entries
 ****
-xref:refguide:persistence:index/jpa/integration/changetracking/PersistenceMetricsServiceJpa.adoc[PersistenceMetricsServiceJpa], xref:refguide:persistence:index/jpa/integration/typeconverters/applib/IsisBookmarkConverter.adoc[IsisBookmarkConverter], xref:refguide:persistence:index/jpa/integration/typeconverters/applib/IsisLocalResourcePathConverter.adoc[IsisLocalResourcePathConverter], xref:refguide:persistence:index/jpa/integration/typeconverters/applib/IsisMarkupConverter.adoc[IsisMarku [...]
+xref:refguide:persistence:index/jpa/integration/typeconverters/applib/IsisBookmarkConverter.adoc[IsisBookmarkConverter], xref:refguide:persistence:index/jpa/integration/typeconverters/applib/IsisLocalResourcePathConverter.adoc[IsisLocalResourcePathConverter], xref:refguide:persistence:index/jpa/integration/typeconverters/applib/IsisMarkupConverter.adoc[IsisMarkupConverter], xref:refguide:persistence:index/jpa/integration/typeconverters/applib/IsisPasswordConverter.adoc[IsisPasswordConver [...]
 ****
 
 |Apache Isis Persistence - JPA (metamodel)
@@ -3151,7 +3191,6 @@ 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.TranslationsResolverWicket +
-o.a.i.viewer.wicket.viewer.services.WicketViewerSettingsDefault +
 o.a.i.viewer.wicket.viewer.webmodule.WebModuleWicket +
 ****
 
@@ -4288,7 +4327,7 @@ org.apache.isis.testing:isis-testing-unittestsupport-applib:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:extensions:index/executionlog/applib/app/ExecutionLogMenu.adoc[ExecutionLogMenu], xref:refguide:extensions:index/executionlog/applib/contributions/HasInteractionId_executionLogEntries.adoc[HasInteractionId_executionLogEntries], xref:refguide:extensions:index/executionlog/applib/contributions/Object_recentExecutions.adoc[Object_recentExecutions]
+xref:refguide:extensions:index/executionlog/applib/app/ExecutionLogMenu.adoc[ExecutionLogMenu], xref:refguide:extensions:index/executionlog/applib/contributions/HasInteractionId_executionLogEntries.adoc[HasInteractionId_executionLogEntries], xref:refguide:extensions:index/executionlog/applib/contributions/HasUsername_recentExecutionsByUser.adoc[HasUsername_recentExecutionsByUser], xref:refguide:extensions:index/executionlog/applib/contributions/Object_recentExecutions.adoc[Object_recentE [...]
 ****
 
 |Apache Isis Ext - Execution Log Implementation (JDO)
@@ -4301,7 +4340,7 @@ Directory: /extensions/core/executionlog/persistence-jdo
 ----
 |.Components
 ****
-o.a.i.extensions.executionlog.jdo.dom.ExecutionLogEntryPK$Stringifier +
+o.a.i.extensions.executionlog.jdo.dom.ExecutionLogEntryPK$Semantics +
 o.a.i.extensions.executionlog.jdo.dom.ExecutionLogEntryRepository +
 ****
 
@@ -4329,7 +4368,7 @@ Directory: /extensions/core/executionlog/persistence-jpa
 ----
 |.Components
 ****
-o.a.i.extensions.executionlog.jpa.dom.ExecutionLogEntryPK$Stringifier +
+o.a.i.extensions.executionlog.jpa.dom.ExecutionLogEntryPK$Semantics +
 o.a.i.extensions.executionlog.jpa.dom.ExecutionLogEntryRepository +
 ****
 
@@ -4382,6 +4421,11 @@ org.apache.isis.testing:isis-testing-integtestsupport-applib:jar:<managed> +
 org.apache.isis.testing:isis-testing-unittestsupport-applib:jar:<managed> +
 ****
 
+.Document Index Entries
+****
+xref:refguide:extensions:index/executionoutbox/applib/app/ExecutionOutboxMenu.adoc[ExecutionOutboxMenu]
+****
+
 |Apache Isis Ext - Execution Outbox Implementation (JDO)
 [source,yaml]
 ----
@@ -4392,7 +4436,7 @@ Directory: /extensions/core/executionoutbox/persistence-jdo
 ----
 |.Components
 ****
-o.a.i.extensions.executionoutbox.jdo.dom.ExecutionOutboxEntryPK$Stringifier +
+o.a.i.extensions.executionoutbox.jdo.dom.ExecutionOutboxEntryPK$Semantics +
 o.a.i.extensions.executionoutbox.jdo.dom.ExecutionOutboxEntryRepository +
 ****
 
@@ -4420,7 +4464,7 @@ Directory: /extensions/core/executionoutbox/persistence-jpa
 ----
 |.Components
 ****
-o.a.i.extensions.executionoutbox.jpa.dom.ExecutionOutboxEntryPK$Stringifier +
+o.a.i.extensions.executionoutbox.jpa.dom.ExecutionOutboxEntryPK$Semantics +
 o.a.i.extensions.executionoutbox.jpa.dom.ExecutionOutboxEntryRepository +
 ****
 
@@ -4993,7 +5037,7 @@ Directory: /extensions/security/sessionlog/persistence-jpa
 ----
 |.Components
 ****
-o.a.i.extensions.sessionlog.jpa.dom.SessionLogEntryPK$Stringifier +
+o.a.i.extensions.sessionlog.jpa.dom.SessionLogEntryPK$Semantics +
 o.a.i.extensions.sessionlog.jpa.dom.SessionLogEntryRepository +
 ****
 
@@ -5475,7 +5519,7 @@ Directory: /extensions/core/commandlog/persistence-jpa
 ----
 |.Components
 ****
-o.a.i.extensions.commandlog.jpa.dom.CommandLogEntryPK$Stringifier +
+o.a.i.extensions.commandlog.jpa.dom.CommandLogEntryPK$Semantics +
 o.a.i.extensions.commandlog.jpa.dom.CommandLogEntryRepository +
 ****
 
@@ -5674,7 +5718,7 @@ eg. code mining, automated documentation.
 
 .Dependencies
 ****
-org.checkerframework:checker-qual:jar:3.23.0 +
+org.checkerframework:checker-qual:jar:3.24.0 +
 org.junit.jupiter:junit-jupiter-api:jar:<managed> +
 org.junit.jupiter:junit-jupiter-engine:jar:<managed> +
 org.junit.vintage:junit-vintage-engine:jar:<managed> +
@@ -5835,22 +5879,22 @@ skinparam {
 }
 hide stereotype
 left to right direction
-skinparam rectangle<<22>> {
+skinparam rectangle<<11>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<11>> {
+skinparam rectangle<<22>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<23>> {
+skinparam rectangle<<12>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<12>> {
+skinparam rectangle<<23>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295