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

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

commit be1895598564b48a5181c1f4fb23c08fa06f54c7
Author: danhaywood <[email protected]>
AuthorDate: Sun Jan 28 14:13:48 2024 +0000

    CAUSEWAY-3676: moves TypeMapper and UserMementoProvider to graphql's applib 
module
---
 .run/causeway-tooling-cli (index).run.xml          |   2 +-
 .../modules/documentation/pages/tooling.adoc       |   2 +-
 .../index/services/bookmark/BookmarkService.adoc   |  11 +
 .../pages/index/services/iactn/Execution.adoc      |   1 +
 .../index/services/metamodel/MetaModelService.adoc |  26 ++
 .../services/metamodel/objgraph/ObjectGraph.adoc   |  50 ++-
 .../commons/pages/index/collections/Can.adoc       |   2 +-
 .../pages/index/functional/ThrowingRunnable.adoc   |  48 ++-
 .../modules/commons/pages/index/io/DataSource.adoc |  13 +
 .../contributions/Object_createdByCommand.adoc}    |  13 +-
 .../applib/dom/AuditTrailEntryRepository.adoc      |  27 +-
 ...adoc => AuditTrailEntryRepositoryAbstract.adoc} |  30 +-
 .../applib/dom/CommandLogEntryRepository.adoc      |  51 ++-
 ...adoc => CommandLogEntryRepositoryAbstract.adoc} |  50 +--
 .../applib/dom/ExecutionLogEntryRepository.adoc    |  35 +-
 ...oc => ExecutionLogEntryRepositoryAbstract.adoc} |  36 +-
 .../applib/dom/ExecutionOutboxEntryRepository.adoc |  11 +-
 ...=> ExecutionOutboxEntryRepositoryAbstract.adoc} |  12 +-
 .../applib/dom/SessionLogEntryRepository.adoc      |  22 +-
 ...adoc => SessionLogEntryRepositoryAbstract.adoc} |  26 +-
 .../changetracking/EntityChangeTrackerDefault.adoc |   1 +
 .../services/userprof/UserProfileUiService.adoc    |   4 +
 core/adoc/modules/_overview/pages/about.adoc       | 433 +++++++++++----------
 viewers/graphql/applib/pom.xml                     |  27 +-
 .../graphql/applib/src/main/java/module-info.java  |   5 +
 .../graphql/applib}/auth/UserMementoProvider.java  |  38 +-
 .../viewer/graphql/applib}/types/TypeMapper.java   |  33 +-
 .../viewer/graphql/model/context/Context.java      |   4 +-
 .../viewer/graphql/model/domain/GqlvAction.java    |   6 +-
 .../graphql/model/domain/GqlvActionInvoke.java     |   2 +-
 .../graphql/model/domain/GqlvActionParam.java      |   2 +-
 .../model/domain/GqlvActionParamAutoComplete.java  |   2 +-
 .../model/domain/GqlvActionParamChoices.java       |   2 +-
 .../model/domain/GqlvActionParamDefault.java       |   2 +-
 .../model/domain/GqlvActionParamDisabled.java      |   2 +-
 .../model/domain/GqlvActionParamHidden.java        |   2 +-
 .../model/domain/GqlvActionParamValidate.java      |   2 +-
 .../graphql/model/domain/GqlvActionParams.java     |   2 +-
 .../graphql/model/domain/GqlvActionValidity.java   |   2 +-
 .../graphql/model/domain/GqlvCollectionGet.java    |   1 -
 .../viewer/graphql/model/domain/GqlvProperty.java  |   2 +-
 .../model/domain/GqlvPropertyAutoComplete.java     |   1 -
 .../graphql/model/domain/GqlvPropertyChoices.java  |   2 +-
 .../graphql/model/domain/GqlvPropertyGet.java      |   1 -
 .../graphql/model/domain/GqlvPropertySet.java      |   3 +-
 .../graphql/model/domain/GqlvPropertyValidate.java |   5 +-
 .../graphql/model/types/TypeMapperDefault.java     |  16 +-
 .../graphql/viewer/src/main/java/module-info.java  |   1 +
 .../viewer/auth/UserMementoProviderDefault.java    |  22 +-
 ...xecutionStrategyResolvingWithinInteraction.java |  13 +-
 .../integration/GraphQlSourceForCauseway.java      |   2 +-
 51 files changed, 667 insertions(+), 441 deletions(-)

diff --git a/.run/causeway-tooling-cli (index).run.xml 
b/.run/causeway-tooling-cli (index).run.xml
index 9f5c4f0183..7845d8036a 100644
--- a/.run/causeway-tooling-cli (index).run.xml 
+++ b/.run/causeway-tooling-cli (index).run.xml 
@@ -1,6 +1,6 @@
 <component name="ProjectRunConfigurationManager">
   <configuration default="false" name="causeway-tooling-cli (index)" 
type="Application" factoryName="Application">
-    <option name="ALTERNATIVE_JRE_PATH" value="C:\Program 
Files\OpenJDK\openjdk-11.0.7_10" />
+    <option name="ALTERNATIVE_JRE_PATH" value="azul-21" />
     <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
     <option name="MAIN_CLASS_NAME" value="org.apache.causeway.tooling.cli.Cli" 
/>
     <module name="causeway-tooling-cli" />
diff --git 
a/antora/components/conguide/modules/documentation/pages/tooling.adoc 
b/antora/components/conguide/modules/documentation/pages/tooling.adoc
index 7e77c59384..cd94f3dd4e 100644
--- a/antora/components/conguide/modules/documentation/pages/tooling.adoc
+++ b/antora/components/conguide/modules/documentation/pages/tooling.adoc
@@ -31,7 +31,7 @@ This can be found at xref:core:_overview:about.adoc[].
 For more on the CLI, see xref:tooling:tooling-cli:about.adoc[tooling CLI] docs.
 You could also inspect the `preview.sh` script (and the various scripts it 
calls in turn) to see how we use the CLI in practice.
 
-* the `causeway-toolikng-metaprog` module (in tooling/metaprog`) contains a 
set of test classes that are used to generate classes and files for the various 
datatypes showcased in the 
link:https://github.com/apache/causeway-app-referenceapp[reference app].
+* the `causeway-tooling-metaprog` module (in tooling/metaprog`) contains a set 
of test classes that are used to generate classes and files for the various 
datatypes showcased in the 
link:https://github.com/apache/causeway-app-referenceapp[reference app].
 +
 To use, locate the `ValueTypeGenTemplateTest` class.
 
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/BookmarkService.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/BookmarkService.adoc
index 2431d1698a..a5361b71d2 100644
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/BookmarkService.adoc
+++ 
b/antora/components/refguide-index/modules/applib/pages/index/services/bookmark/BookmarkService.adoc
@@ -10,6 +10,7 @@ This service provides a serializable 'bookmark' for any 
entity, and conversely t
 ----
 interface BookmarkService {
   Optional<Bookmark> bookmarkFor(Object domainObject)     // <.>
+  List<Bookmark> bookmarksFor(Object domainObject)     // <.>
   Optional<Bookmark> bookmarkFor(Class<?> type, String identifier)     // <.>
   Optional<Object> lookup(BookmarkHolder bookmarkHolder)     // <.>
   Optional<Object> lookup(Bookmark bookmark)     // <.>
@@ -23,6 +24,11 @@ interface BookmarkService {
 --
 Optionally returns the 
xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] for the 
given domain object, based on whether can create a bookmark for it.
 --
+<.> xref:#bookmarksFor_Object[bookmarksFor(Object)]
++
+--
+Returns all possible 
xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] s for the 
provided domain object, taking into account any aliases defined as per 
_DomainObject#aliased()_ or _DomainService#aliased()_ .
+--
 <.> xref:#bookmarkFor_Class_String[bookmarkFor(Class, String)]
 +
 --
@@ -54,6 +60,11 @@ Optionally returns the 
xref:refguide:applib:index/services/bookmark/Bookmark.ado
 
  *Note* : Not every domain object is bookmark-able: only entities, view models 
and services (NOT values or collections)
 
+[#bookmarksFor_Object]
+=== bookmarksFor(Object)
+
+Returns all possible 
xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] s for the 
provided domain object, taking into account any aliases defined as per 
_DomainObject#aliased()_ or _DomainService#aliased()_ .
+
 [#bookmarkFor_Class_String]
 === bookmarkFor(Class, String)
 
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/iactn/Execution.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/Execution.adoc
index b9c8d2e2a9..6603bd5c8e 100644
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/iactn/Execution.adoc
+++ 
b/antora/components/refguide-index/modules/applib/pages/index/services/iactn/Execution.adoc
@@ -13,6 +13,7 @@ The 
xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction] has
 class Execution<T, E> {
   void setParent(Execution<?, ?> parent)     // <.>
   List<Execution<?, ?>> getChildren()     // <.>
+  E getEvent()
   void setEvent(E event)     // <.>
   Timestamp start(ClockService clockService, MetricsService metricsService)
   void setCompletedAt(Timestamp completedAt, MetricsService metricsService)    
 // <.>
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/MetaModelService.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/MetaModelService.adoc
index af5448942e..ebb239ff6c 100644
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/MetaModelService.adoc
+++ 
b/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/MetaModelService.adoc
@@ -10,6 +10,8 @@ This service provides a formal API into the framework's 
metamodel.
 ----
 interface MetaModelService {
   Optional<LogicalType> lookupLogicalTypeByName(String logicalTypeName)     // 
<.>
+  Can<LogicalType> logicalTypeAndAliasesFor(LogicalType logicalType)     // <.>
+  Can<LogicalType> logicalTypeAndAliasesFor(String logicalTypeName)     // <.>
   Optional<LogicalType> lookupLogicalTypeByClass(Class<?> domainType)     // 
<.>
   void rebuild(Class<?> domainType)     // <.>
   DomainModel getDomainModel()     // <.>
@@ -26,6 +28,16 @@ interface MetaModelService {
 --
 Provides a lookup by logicalTypeName of a domain class' object type, 
corresponding to _Named#value()_ or _DomainService#aliased()_ or 
_DomainObject#aliased()_ . Will return an empty result if there is no such 
non-abstract class registered. (interfaces and abstract types are never added 
to the lookup table).
 --
+<.> 
xref:#logicalTypeAndAliasesFor_LogicalType[logicalTypeAndAliasesFor(LogicalType)]
++
+--
+Assuming that the xref:refguide:applib:index/id/LogicalType.adoc[LogicalType] 
passed in actually represents a domain type, then returns it along with any 
aliases defined as per _DomainService#aliased()_ or _DomainObject#aliased()_ .
+--
+<.> xref:#logicalTypeAndAliasesFor_String[logicalTypeAndAliasesFor(String)]
++
+--
+Returns the xref:refguide:applib:index/id/LogicalType.adoc[LogicalType] of a 
domain class' object type, corresponding to _Named#value()_ , along with any 
aliases defined as per _DomainService#aliased()_ or _DomainObject#aliased()_ .
+--
 <.> xref:#lookupLogicalTypeByClass_Class[lookupLogicalTypeByClass(Class)]
 +
 --
@@ -74,6 +86,20 @@ Can be used to create object relation diagrams (e.g. 
Plantuml).
 
 Provides a lookup by logicalTypeName of a domain class' object type, 
corresponding to _Named#value()_ or _DomainService#aliased()_ or 
_DomainObject#aliased()_ . Will return an empty result if there is no such 
non-abstract class registered. (interfaces and abstract types are never added 
to the lookup table).
 
+[#logicalTypeAndAliasesFor_LogicalType]
+=== logicalTypeAndAliasesFor(LogicalType)
+
+Assuming that the xref:refguide:applib:index/id/LogicalType.adoc[LogicalType] 
passed in actually represents a domain type, then returns it along with any 
aliases defined as per _DomainService#aliased()_ or _DomainObject#aliased()_ .
+
+If there is no such domain type, then an empty 
xref:refguide:commons:index/collections/Can.adoc[Can] will be returned.
+
+[#logicalTypeAndAliasesFor_String]
+=== logicalTypeAndAliasesFor(String)
+
+Returns the xref:refguide:applib:index/id/LogicalType.adoc[LogicalType] of a 
domain class' object type, corresponding to _Named#value()_ , along with any 
aliases defined as per _DomainService#aliased()_ or _DomainObject#aliased()_ .
+
+If there is no such domain type, then an empty 
xref:refguide:commons:index/collections/Can.adoc[Can] will be returned.
+
 [#lookupLogicalTypeByClass_Class]
 === lookupLogicalTypeByClass(Class)
 
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/objgraph/ObjectGraph.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/objgraph/ObjectGraph.adoc
index a66298e45a..8622846dc0 100644
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/objgraph/ObjectGraph.adoc
+++ 
b/antora/components/refguide-index/modules/applib/pages/index/services/metamodel/objgraph/ObjectGraph.adoc
@@ -10,13 +10,34 @@ Can be used to create diagrams (e.g. Plantuml)
 ----
 class ObjectGraph {
   ObjectGraph create(ObjectGraph.Factory factory)
-  ObjectGraph transform(ObjectGraph.Transformer transfomer)
+  ObjectGraph transform(ObjectGraph.Transformer transfomer)     // <.>
   String render(ObjectGraph.Renderer renderer)
+  DataSource asDiagramDslSource(ObjectGraph.Renderer renderer)
+  void writeDiagramDsl(ObjectGraph.Renderer renderer, DataSink sink)
+  void writeDiagramDsl(ObjectGraph.Renderer renderer, File destinationDslFile)
+  ObjectGraph copy()     // <.>
+  GraphKernel kernel(ImmutableEnumSet<GraphCharacteristic> characteristics)    
 // <.>
   Map<String, List<ObjectGraph.Object>> objectsGroupedByPackage()     // <.>
   Map<String, ObjectGraph.Object> objectById()     // <.>
+  ObjectGraph subGraph(int[] objectIndexes)     // <.>
 }
 ----
 
+<.> xref:#transform_ObjectGraph_Transformer[transform(ObjectGraph_Transformer)]
++
+--
+Passes a (deep clone) copy of this 
xref:refguide:applib:index/services/metamodel/objgraph/ObjectGraph.adoc[ObjectGraph]
 to given _Transformer_ and returns a transformed 
xref:refguide:applib:index/services/metamodel/objgraph/ObjectGraph.adoc[ObjectGraph]
 .
+--
+<.> xref:#copy_[copy()]
++
+--
+Returns a (deep clone) copy of this 
xref:refguide:applib:index/services/metamodel/objgraph/ObjectGraph.adoc[ObjectGraph]
 .
+--
+<.> xref:#kernel_ImmutableEnumSet[kernel(ImmutableEnumSet)]
++
+--
+Returns a _GraphKernel_ of given characteristics.
+--
 <.> xref:#objectsGroupedByPackage_[objectsGroupedByPackage()]
 +
 --
@@ -27,9 +48,31 @@ Returns objects grouped by package (as list-multimap).
 --
 Returns a _Map_ from object.id to _Object ObjectGraph.Object_
 --
+<.> xref:#subGraph_int[subGraph(int)]
++
+--
+Returns a sub-graph comprised only of object nodes as picked per zero based 
indexes _int[]_ .
+--
 
 == Members
 
+[#transform_ObjectGraph_Transformer]
+=== transform(ObjectGraph_Transformer)
+
+Passes a (deep clone) copy of this 
xref:refguide:applib:index/services/metamodel/objgraph/ObjectGraph.adoc[ObjectGraph]
 to given _Transformer_ and returns a transformed 
xref:refguide:applib:index/services/metamodel/objgraph/ObjectGraph.adoc[ObjectGraph]
 .
+
+Hence transformers are not required to create defensive copies.
+
+[#copy_]
+=== copy()
+
+Returns a (deep clone) copy of this 
xref:refguide:applib:index/services/metamodel/objgraph/ObjectGraph.adoc[ObjectGraph]
 .
+
+[#kernel_ImmutableEnumSet]
+=== kernel(ImmutableEnumSet)
+
+Returns a _GraphKernel_ of given characteristics.
+
 [#objectsGroupedByPackage_]
 === objectsGroupedByPackage()
 
@@ -39,3 +82,8 @@ Returns objects grouped by package (as list-multimap).
 === objectById()
 
 Returns a _Map_ from object.id to _Object ObjectGraph.Object_
+
+[#subGraph_int]
+=== subGraph(int)
+
+Returns a sub-graph comprised only of object nodes as picked per zero based 
indexes _int[]_ .
diff --git 
a/antora/components/refguide-index/modules/commons/pages/index/collections/Can.adoc
 
b/antora/components/refguide-index/modules/commons/pages/index/collections/Can.adoc
index d8c062312a..67ff847b22 100644
--- 
a/antora/components/refguide-index/modules/commons/pages/index/collections/Can.adoc
+++ 
b/antora/components/refguide-index/modules/commons/pages/index/collections/Can.adoc
@@ -7,7 +7,7 @@ Java's _Optional_ , can be seen as a holder of element(s), that 
is restricted to
 
 Same idiomatic convention applies: References to 
xref:refguide:commons:index/collections/Can.adoc[Can] should never be 
initialized to _null_ .
 
- *IMPORTANT:* A xref:refguide:commons:index/collections/Can.adoc[Can] must not 
contain _null_ elements. If you need to use store null, then use a different 
data structure, for example a regular _java.util.List java.util.List_ .
+ *IMPORTANT:* A xref:refguide:commons:index/collections/Can.adoc[Can] must not 
contain _null_ elements. If you need to store _null_ , then use a different 
data structure, for example a regular _java.util.List java.util.List_ .
 
 == API
 
diff --git 
a/antora/components/refguide-index/modules/commons/pages/index/functional/ThrowingRunnable.adoc
 
b/antora/components/refguide-index/modules/commons/pages/index/functional/ThrowingRunnable.adoc
index 169c5ff24c..19c1b38001 100644
--- 
a/antora/components/refguide-index/modules/commons/pages/index/functional/ThrowingRunnable.adoc
+++ 
b/antora/components/refguide-index/modules/commons/pages/index/functional/ThrowingRunnable.adoc
@@ -10,8 +10,52 @@ Similar to a _Runnable_ , except that it can also throw a 
checked _Exception_ .
 ----
 interface ThrowingRunnable {
   void run()
-  Callable<Void> toCallable(ThrowingRunnable runnable)
-  Try<Void> resultOf(ThrowingRunnable runnable)
+  void runUncatched()     // <.>
+  Void callUncatched()     // <.>
+  Runnable toRunnable()     // <.>
+  Callable<Void> toCallable()     // <.>
 }
 ----
 
+<.> xref:#runUncatched_[runUncatched()]
++
+--
+Does *not* silently swallow, wrap into RuntimeException, or otherwise modify 
any exceptions of the wrapped _#run()_ method.
+--
+<.> xref:#callUncatched_[callUncatched()]
++
+--
+Does *not* silently swallow, wrap into RuntimeException, or otherwise modify 
any exceptions of the wrapped _#run()_ method.
+--
+<.> xref:#toRunnable_[toRunnable()]
++
+--
+The resulting _Runnable_ does *not* silently swallow, wrap into 
RuntimeException, or otherwise modify any exceptions of the wrapped _#run()_ 
method.
+--
+<.> xref:#toCallable_[toCallable()]
++
+--
+The resulting _Callable_ does *not* silently swallow, wrap into 
RuntimeException, or otherwise modify any exceptions of the wrapped _#run()_ 
method.
+--
+
+== Members
+
+[#runUncatched_]
+=== runUncatched()
+
+Does *not* silently swallow, wrap into RuntimeException, or otherwise modify 
any exceptions of the wrapped _#run()_ method.
+
+[#callUncatched_]
+=== callUncatched()
+
+Does *not* silently swallow, wrap into RuntimeException, or otherwise modify 
any exceptions of the wrapped _#run()_ method.
+
+[#toRunnable_]
+=== toRunnable()
+
+The resulting _Runnable_ does *not* silently swallow, wrap into 
RuntimeException, or otherwise modify any exceptions of the wrapped _#run()_ 
method.
+
+[#toCallable_]
+=== toCallable()
+
+The resulting _Callable_ does *not* silently swallow, wrap into 
RuntimeException, or otherwise modify any exceptions of the wrapped _#run()_ 
method.
diff --git 
a/antora/components/refguide-index/modules/commons/pages/index/io/DataSource.adoc
 
b/antora/components/refguide-index/modules/commons/pages/index/io/DataSource.adoc
index d403b4da3b..74e71fe78c 100644
--- 
a/antora/components/refguide-index/modules/commons/pages/index/io/DataSource.adoc
+++ 
b/antora/components/refguide-index/modules/commons/pages/index/io/DataSource.adoc
@@ -25,6 +25,7 @@ interface DataSource {
   DataSource map(ThrowingFunction<InputStream, InputStream> inputStreamMapper) 
    // <.>
   Try<Void> tryReadAndWrite(DataSink dataSink, int bufferSize)     // <.>
   void pipe(DataSink dataSink, int bufferSize)     // <.>
+  void pipe(DataSink dataSink)     // <.>
   DataSource empty()     // <.>
   DataSource ofInputStreamSupplier(ThrowingSupplier<InputStream> 
inputStreamSupplier)     // <.>
   DataSource ofInputStreamEagerly(InputStream inputStream)     // <.>
@@ -92,6 +93,11 @@ Acts as a pipe, reading from this 
xref:refguide:commons:index/io/DataSource.adoc
 --
 Acts as a pipe, reading from this 
xref:refguide:commons:index/io/DataSource.adoc[DataSource] and writing to given 
xref:refguide:commons:index/io/DataSink.adoc[DataSink] , using given bufferSize 
for the underlying byte data junks.
 --
+<.> xref:#pipe_DataSink[pipe(DataSink)]
++
+--
+Acts as a pipe, reading from this 
xref:refguide:commons:index/io/DataSource.adoc[DataSource] and writing to given 
xref:refguide:commons:index/io/DataSink.adoc[DataSink] , using default 
bufferSize of 16k for the underlying byte data junks.
+--
 <.> xref:#empty_[empty()]
 +
 --
@@ -207,6 +213,13 @@ Acts as a pipe, reading from this 
xref:refguide:commons:index/io/DataSource.adoc
 
 Throws if the write failed.
 
+[#pipe_DataSink]
+=== pipe(DataSink)
+
+Acts as a pipe, reading from this 
xref:refguide:commons:index/io/DataSource.adoc[DataSource] and writing to given 
xref:refguide:commons:index/io/DataSink.adoc[DataSink] , using default 
bufferSize of 16k for the underlying byte data junks.
+
+Throws if the write failed.
+
 [#empty_]
 === empty()
 
diff --git 
a/antora/components/refguide-index/modules/commons/pages/index/functional/ThrowingRunnable.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/contributions/Object_createdByCommand.adoc
similarity index 74%
copy from 
antora/components/refguide-index/modules/commons/pages/index/functional/ThrowingRunnable.adoc
copy to 
antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/contributions/Object_createdByCommand.adoc
index 169c5ff24c..bcae3445e8 100644
--- 
a/antora/components/refguide-index/modules/commons/pages/index/functional/ThrowingRunnable.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/contributions/Object_createdByCommand.adoc
@@ -1,17 +1,14 @@
-= ThrowingRunnable
+= Object_createdByCommand
 :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 [...]
 
-Similar to a _Runnable_ , except that it can also throw a checked _Exception_ .
-
 == API
 
 [source,java]
-.ThrowingRunnable.java
+.Object_createdByCommand.java
 ----
-interface ThrowingRunnable {
-  void run()
-  Callable<Void> toCallable(ThrowingRunnable runnable)
-  Try<Void> resultOf(ThrowingRunnable runnable)
+class Object_createdByCommand {
+  Object act()
+  boolean hideAct()
 }
 ----
 
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepository.adoc
index 9e2c3765ba..06033e679b 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepository.adoc
@@ -8,21 +8,20 @@ Provides supporting functionality for querying 
xref:refguide:extensions:index/au
 [source,java]
 .AuditTrailEntryRepository.java
 ----
-class AuditTrailEntryRepository<E> {
-  Class<E> getEntityClass()
+interface AuditTrailEntryRepository {
   AuditTrailEntry createFor(EntityPropertyChange change)
-  Optional<E> findFirstByTarget(Bookmark target)
-  List<E> findRecentByTarget(Bookmark target)
-  List<E> findRecentByTargetAndPropertyId(Bookmark target, String propertyId)
-  List<E> findByInteractionId(UUID interactionId)
-  List<E> findByTargetAndFromAndTo(Bookmark target, LocalDate from, LocalDate 
to)
-  List<E> findByFromAndTo(LocalDate from, LocalDate to)
-  List<E> findMostRecent()
-  List<E> findMostRecent(int limit)
-  List<E> findByUsernameAndFromAndTo(String username, LocalDate from, 
LocalDate to)
-  List<E> findByUsernameAndTargetAndFromAndTo(String username, Bookmark 
target, LocalDate from, LocalDate to)
-  List<E> findRecentByUsername(String username)
-  List<? extends AuditTrailEntry> findAll()     // <.>
+  Optional<AuditTrailEntry> findFirstByTarget(Bookmark target)
+  List<AuditTrailEntry> findRecentByTarget(Bookmark target)
+  List<AuditTrailEntry> findRecentByTargetAndPropertyId(Bookmark target, 
String propertyId)
+  List<AuditTrailEntry> findByInteractionId(UUID interactionId)
+  List<AuditTrailEntry> findByTargetAndFromAndTo(Bookmark target, LocalDate 
from, LocalDate to)
+  List<AuditTrailEntry> findByFromAndTo(LocalDate from, LocalDate to)
+  List<AuditTrailEntry> findMostRecent()
+  List<AuditTrailEntry> findMostRecent(int limit)
+  List<AuditTrailEntry> findByUsernameAndFromAndTo(String username, LocalDate 
from, LocalDate to)
+  List<AuditTrailEntry> findByUsernameAndTargetAndFromAndTo(String username, 
Bookmark target, LocalDate from, LocalDate to)
+  List<AuditTrailEntry> findRecentByUsername(String username)
+  List<AuditTrailEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepositoryAbstract.adoc
similarity index 57%
copy from 
antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepository.adoc
copy to 
antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepositoryAbstract.adoc
index 9e2c3765ba..e71c5e8d49 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/audittrail/applib/dom/AuditTrailEntryRepositoryAbstract.adoc
@@ -1,4 +1,4 @@
-= AuditTrailEntryRepository
+= AuditTrailEntryRepositoryAbstract
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements. See the NOTICE file distributed with this work 
for additional information regarding copyright ownership. The ASF licenses this 
file to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy of 
the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by 
applicable law or ag [...]
 
 Provides supporting functionality for querying 
xref:refguide:extensions:index/audittrail/applib/dom/AuditTrailEntry.adoc[AuditTrailEntry]
 entities.
@@ -6,23 +6,23 @@ Provides supporting functionality for querying 
xref:refguide:extensions:index/au
 == API
 
 [source,java]
-.AuditTrailEntryRepository.java
+.AuditTrailEntryRepositoryAbstract.java
 ----
-class AuditTrailEntryRepository<E> {
+class AuditTrailEntryRepositoryAbstract<E> {
   Class<E> getEntityClass()
   AuditTrailEntry createFor(EntityPropertyChange change)
-  Optional<E> findFirstByTarget(Bookmark target)
-  List<E> findRecentByTarget(Bookmark target)
-  List<E> findRecentByTargetAndPropertyId(Bookmark target, String propertyId)
-  List<E> findByInteractionId(UUID interactionId)
-  List<E> findByTargetAndFromAndTo(Bookmark target, LocalDate from, LocalDate 
to)
-  List<E> findByFromAndTo(LocalDate from, LocalDate to)
-  List<E> findMostRecent()
-  List<E> findMostRecent(int limit)
-  List<E> findByUsernameAndFromAndTo(String username, LocalDate from, 
LocalDate to)
-  List<E> findByUsernameAndTargetAndFromAndTo(String username, Bookmark 
target, LocalDate from, LocalDate to)
-  List<E> findRecentByUsername(String username)
-  List<? extends AuditTrailEntry> findAll()     // <.>
+  Optional<AuditTrailEntry> findFirstByTarget(Bookmark target)
+  List<AuditTrailEntry> findRecentByTarget(Bookmark target)
+  List<AuditTrailEntry> findRecentByTargetAndPropertyId(Bookmark target, 
String propertyId)
+  List<AuditTrailEntry> findByInteractionId(UUID interactionId)
+  List<AuditTrailEntry> findByTargetAndFromAndTo(Bookmark target, LocalDate 
from, LocalDate to)
+  List<AuditTrailEntry> findByFromAndTo(LocalDate from, LocalDate to)
+  List<AuditTrailEntry> findMostRecent()
+  List<AuditTrailEntry> findMostRecent(int limit)
+  List<AuditTrailEntry> findByUsernameAndFromAndTo(String username, LocalDate 
from, LocalDate to)
+  List<AuditTrailEntry> findByUsernameAndTargetAndFromAndTo(String username, 
Bookmark target, LocalDate from, LocalDate to)
+  List<AuditTrailEntry> findRecentByUsername(String username)
+  List<AuditTrailEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepository.adoc
index b79847e2ff..368e3e9cc1 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepository.adoc
@@ -8,33 +8,32 @@ Provides supporting functionality for querying 
xref:refguide:extensions:index/co
 [source,java]
 .CommandLogEntryRepository.java
 ----
-class CommandLogEntryRepository<C> {
-  Class<C> getEntityClass()
-  C createEntryAndPersist(Command command, UUID parentInteractionIdIfAny, 
ExecuteIn executeIn)
-  Optional<C> findByInteractionId(UUID interactionId)
-  List<C> findByParent(CommandLogEntry parent)
-  List<C> findByParentInteractionId(UUID parentInteractionId)
-  List<C> findByFromAndTo(LocalDate from, LocalDate to)
-  List<C> findCurrent()
-  List<C> findCompleted()
-  List<C> findByTargetAndFromAndTo(Bookmark target, LocalDate from, LocalDate 
to)
-  List<C> findMostRecent()
-  List<C> findMostRecent(int limit)
-  List<C> findRecentByUsername(String username)
-  List<C> findRecentByTarget(Bookmark target)
-  List<C> findRecentByTargetOrResult(Bookmark targetOrResult)
-  List<C> findSince(UUID interactionId, Integer batchSize)     // <.>
-  List<C> findBackgroundAndNotYetStarted()     // <.>
-  List<C> findRecentBackgroundByTarget(Bookmark target)
-  Optional<C> findMostRecentReplayed()     // <.>
-  Optional<C> findMostRecentCompleted()     // <.>
-  List<C> findNotYetReplayed()
-  C saveForReplay(CommandDto dto)
-  List<C> saveForReplay(CommandsDto commandsDto)
-  void persist(C commandLogEntry)
+interface CommandLogEntryRepository {
+  CommandLogEntry createEntryAndPersist(Command command, UUID 
parentInteractionIdIfAny, ExecuteIn executeIn)
+  Optional<CommandLogEntry> findByInteractionId(UUID interactionId)
+  List<CommandLogEntry> findByParent(CommandLogEntry parent)
+  List<CommandLogEntry> findByParentInteractionId(UUID parentInteractionId)
+  List<CommandLogEntry> findByFromAndTo(LocalDate from, LocalDate to)
+  List<CommandLogEntry> findCurrent()
+  List<CommandLogEntry> findCompleted()
+  List<CommandLogEntry> findByTargetAndFromAndTo(Bookmark target, LocalDate 
from, LocalDate to)
+  List<CommandLogEntry> findMostRecent()
+  List<CommandLogEntry> findMostRecent(int limit)
+  List<CommandLogEntry> findRecentByUsername(String username)
+  List<CommandLogEntry> findRecentByTarget(Bookmark target)
+  List<CommandLogEntry> findRecentByTargetOrResult(Bookmark targetOrResult)
+  List<CommandLogEntry> findSince(UUID interactionId, Integer batchSize)     
// <.>
+  List<CommandLogEntry> findBackgroundAndNotYetStarted()     // <.>
+  List<CommandLogEntry> findRecentBackgroundByTarget(Bookmark target)
+  Optional<CommandLogEntry> findMostRecentReplayed()     // <.>
+  Optional<CommandLogEntry> findMostRecentCompleted()     // <.>
+  List<CommandLogEntry> findNotYetReplayed()
+  CommandLogEntry saveForReplay(CommandDto dto)
+  List<CommandLogEntry> saveForReplay(CommandsDto commandsDto)
+  void persist(CommandLogEntry commandLogEntry)
   void truncateLog()
-  List<C> findCommandsOnPrimaryElseFail(UUID interactionId, Integer batchSize)
-  List<C> findAll()     // <.>
+  List<CommandLogEntry> findCommandsOnPrimaryElseFail(UUID interactionId, 
Integer batchSize)
+  List<CommandLogEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepositoryAbstract.adoc
similarity index 80%
copy from 
antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepository.adoc
copy to 
antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepositoryAbstract.adoc
index b79847e2ff..19c32d237f 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/CommandLogEntryRepositoryAbstract.adoc
@@ -1,4 +1,4 @@
-= CommandLogEntryRepository
+= CommandLogEntryRepositoryAbstract
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements. See the NOTICE file distributed with this work 
for additional information regarding copyright ownership. The ASF licenses this 
file to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy of 
the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by 
applicable law or ag [...]
 
 Provides supporting functionality for querying 
xref:refguide:extensions:index/commandlog/applib/dom/CommandLogEntry.adoc[CommandLogEntry]
 entities.
@@ -6,35 +6,35 @@ Provides supporting functionality for querying 
xref:refguide:extensions:index/co
 == API
 
 [source,java]
-.CommandLogEntryRepository.java
+.CommandLogEntryRepositoryAbstract.java
 ----
-class CommandLogEntryRepository<C> {
+class CommandLogEntryRepositoryAbstract<C> {
   Class<C> getEntityClass()
   C createEntryAndPersist(Command command, UUID parentInteractionIdIfAny, 
ExecuteIn executeIn)
-  Optional<C> findByInteractionId(UUID interactionId)
-  List<C> findByParent(CommandLogEntry parent)
-  List<C> findByParentInteractionId(UUID parentInteractionId)
-  List<C> findByFromAndTo(LocalDate from, LocalDate to)
-  List<C> findCurrent()
-  List<C> findCompleted()
-  List<C> findByTargetAndFromAndTo(Bookmark target, LocalDate from, LocalDate 
to)
-  List<C> findMostRecent()
-  List<C> findMostRecent(int limit)
-  List<C> findRecentByUsername(String username)
-  List<C> findRecentByTarget(Bookmark target)
-  List<C> findRecentByTargetOrResult(Bookmark targetOrResult)
-  List<C> findSince(UUID interactionId, Integer batchSize)     // <.>
-  List<C> findBackgroundAndNotYetStarted()     // <.>
-  List<C> findRecentBackgroundByTarget(Bookmark target)
-  Optional<C> findMostRecentReplayed()     // <.>
-  Optional<C> findMostRecentCompleted()     // <.>
-  List<C> findNotYetReplayed()
+  Optional<CommandLogEntry> findByInteractionId(UUID interactionId)
+  List<CommandLogEntry> findByParent(CommandLogEntry parent)
+  List<CommandLogEntry> findByParentInteractionId(UUID parentInteractionId)
+  List<CommandLogEntry> findByFromAndTo(LocalDate from, LocalDate to)
+  List<CommandLogEntry> findCurrent()
+  List<CommandLogEntry> findCompleted()
+  List<CommandLogEntry> findByTargetAndFromAndTo(Bookmark target, LocalDate 
from, LocalDate to)
+  List<CommandLogEntry> findMostRecent()
+  List<CommandLogEntry> findMostRecent(int limit)
+  List<CommandLogEntry> findRecentByUsername(String username)
+  List<CommandLogEntry> findRecentByTarget(Bookmark target)
+  List<CommandLogEntry> findRecentByTargetOrResult(Bookmark targetOrResult)
+  List<CommandLogEntry> findSince(UUID interactionId, Integer batchSize)     
// <.>
+  List<CommandLogEntry> findBackgroundAndNotYetStarted()     // <.>
+  List<CommandLogEntry> findRecentBackgroundByTarget(Bookmark target)
+  Optional<CommandLogEntry> findMostRecentReplayed()     // <.>
+  Optional<CommandLogEntry> findMostRecentCompleted()     // <.>
+  List<CommandLogEntry> findNotYetReplayed()
   C saveForReplay(CommandDto dto)
-  List<C> saveForReplay(CommandsDto commandsDto)
-  void persist(C commandLogEntry)
+  List<CommandLogEntry> saveForReplay(CommandsDto commandsDto)
+  void persist(CommandLogEntry commandLogEntry)
   void truncateLog()
-  List<C> findCommandsOnPrimaryElseFail(UUID interactionId, Integer batchSize)
-  List<C> findAll()     // <.>
+  List<CommandLogEntry> findCommandsOnPrimaryElseFail(UUID interactionId, 
Integer batchSize)
+  List<CommandLogEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepository.adoc
index dba37db6ce..6561df78fa 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepository.adoc
@@ -8,24 +8,23 @@ Provides supporting functionality for querying and persisting 
xref:refguide:exte
 [source,java]
 .ExecutionLogEntryRepository.java
 ----
-class ExecutionLogEntryRepository<E> {
-  Class<E> getEntityClass()
-  E createEntryAndPersist(Execution execution)
-  List<E> findByInteractionId(UUID interactionId)
-  Optional<E> findByInteractionIdAndSequence(UUID interactionId, int sequence)
-  List<E> findByFromAndTo(LocalDate from, LocalDate to)
-  List<E> findMostRecent()
-  List<E> findMostRecent(int limit)
-  List<E> findByTarget(Bookmark target)
-  List<E> findByTargetAndTimestampAfter(Bookmark target, Timestamp timestamp)
-  List<E> findByTargetAndTimestampBefore(Bookmark target, Timestamp timestamp)
-  List<E> findByTargetAndTimestampBetween(Bookmark target, Timestamp 
timestampFrom, Timestamp timestampTo)
-  List<E> findByTimestampAfter(Timestamp timestamp)
-  List<E> findByTimestampBefore(Timestamp timestamp)
-  List<E> findByTimestampBetween(Timestamp timestampFrom, Timestamp 
timestampTo)
-  List<E> findRecentByUsername(String username)
-  List<E> findRecentByTarget(Bookmark target)
-  List<E> findAll()     // <.>
+interface ExecutionLogEntryRepository {
+  ExecutionLogEntry createEntryAndPersist(Execution execution)
+  List<ExecutionLogEntry> findByInteractionId(UUID interactionId)
+  Optional<ExecutionLogEntry> findByInteractionIdAndSequence(UUID 
interactionId, int sequence)
+  List<ExecutionLogEntry> findByFromAndTo(LocalDate from, LocalDate to)
+  List<ExecutionLogEntry> findMostRecent()
+  List<ExecutionLogEntry> findMostRecent(int limit)
+  List<ExecutionLogEntry> findByTarget(Bookmark target)
+  List<ExecutionLogEntry> findByTargetAndTimestampAfter(Bookmark target, 
Timestamp timestamp)
+  List<ExecutionLogEntry> findByTargetAndTimestampBefore(Bookmark target, 
Timestamp timestamp)
+  List<ExecutionLogEntry> findByTargetAndTimestampBetween(Bookmark target, 
Timestamp timestampFrom, Timestamp timestampTo)
+  List<ExecutionLogEntry> findByTimestampAfter(Timestamp timestamp)
+  List<ExecutionLogEntry> findByTimestampBefore(Timestamp timestamp)
+  List<ExecutionLogEntry> findByTimestampBetween(Timestamp timestampFrom, 
Timestamp timestampTo)
+  List<ExecutionLogEntry> findRecentByUsername(String username)
+  List<ExecutionLogEntry> findRecentByTarget(Bookmark target)
+  List<ExecutionLogEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepositoryAbstract.adoc
similarity index 52%
copy from 
antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepository.adoc
copy to 
antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepositoryAbstract.adoc
index dba37db6ce..0fe514fb36 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/executionlog/applib/dom/ExecutionLogEntryRepositoryAbstract.adoc
@@ -1,4 +1,4 @@
-= ExecutionLogEntryRepository
+= ExecutionLogEntryRepositoryAbstract
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements. See the NOTICE file distributed with this work 
for additional information regarding copyright ownership. The ASF licenses this 
file to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy of 
the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by 
applicable law or ag [...]
 
 Provides supporting functionality for querying and persisting 
xref:refguide:extensions:index/executionlog/applib/dom/ExecutionLogEntry.adoc[ExecutionLogEntry]
 entities.
@@ -6,26 +6,26 @@ Provides supporting functionality for querying and persisting 
xref:refguide:exte
 == API
 
 [source,java]
-.ExecutionLogEntryRepository.java
+.ExecutionLogEntryRepositoryAbstract.java
 ----
-class ExecutionLogEntryRepository<E> {
+class ExecutionLogEntryRepositoryAbstract<E> {
   Class<E> getEntityClass()
   E createEntryAndPersist(Execution execution)
-  List<E> findByInteractionId(UUID interactionId)
-  Optional<E> findByInteractionIdAndSequence(UUID interactionId, int sequence)
-  List<E> findByFromAndTo(LocalDate from, LocalDate to)
-  List<E> findMostRecent()
-  List<E> findMostRecent(int limit)
-  List<E> findByTarget(Bookmark target)
-  List<E> findByTargetAndTimestampAfter(Bookmark target, Timestamp timestamp)
-  List<E> findByTargetAndTimestampBefore(Bookmark target, Timestamp timestamp)
-  List<E> findByTargetAndTimestampBetween(Bookmark target, Timestamp 
timestampFrom, Timestamp timestampTo)
-  List<E> findByTimestampAfter(Timestamp timestamp)
-  List<E> findByTimestampBefore(Timestamp timestamp)
-  List<E> findByTimestampBetween(Timestamp timestampFrom, Timestamp 
timestampTo)
-  List<E> findRecentByUsername(String username)
-  List<E> findRecentByTarget(Bookmark target)
-  List<E> findAll()     // <.>
+  List<ExecutionLogEntry> findByInteractionId(UUID interactionId)
+  Optional<ExecutionLogEntry> findByInteractionIdAndSequence(UUID 
interactionId, int sequence)
+  List<ExecutionLogEntry> findByFromAndTo(LocalDate from, LocalDate to)
+  List<ExecutionLogEntry> findMostRecent()
+  List<ExecutionLogEntry> findMostRecent(int limit)
+  List<ExecutionLogEntry> findByTarget(Bookmark target)
+  List<ExecutionLogEntry> findByTargetAndTimestampAfter(Bookmark target, 
Timestamp timestamp)
+  List<ExecutionLogEntry> findByTargetAndTimestampBefore(Bookmark target, 
Timestamp timestamp)
+  List<ExecutionLogEntry> findByTargetAndTimestampBetween(Bookmark target, 
Timestamp timestampFrom, Timestamp timestampTo)
+  List<ExecutionLogEntry> findByTimestampAfter(Timestamp timestamp)
+  List<ExecutionLogEntry> findByTimestampBefore(Timestamp timestamp)
+  List<ExecutionLogEntry> findByTimestampBetween(Timestamp timestampFrom, 
Timestamp timestampTo)
+  List<ExecutionLogEntry> findRecentByUsername(String username)
+  List<ExecutionLogEntry> findRecentByTarget(Bookmark target)
+  List<ExecutionLogEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepository.adoc
index 0cf15f7702..265b07046d 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepository.adoc
@@ -8,16 +8,15 @@ Provides supporting functionality for querying and persisting 
xref:refguide:exte
 [source,java]
 .ExecutionOutboxEntryRepository.java
 ----
-class ExecutionOutboxEntryRepository<E> {
+interface ExecutionOutboxEntryRepository {
   public final static String LOGICAL_TYPE_NAME;
-  Class<E> getEntityClass()
-  E createEntryAndPersist(Execution execution)
-  Optional<E> findByInteractionIdAndSequence(UUID interactionId, int sequence)
-  List<E> findOldest()
+  ExecutionOutboxEntry createEntryAndPersist(Execution execution)
+  Optional<ExecutionOutboxEntry> findByInteractionIdAndSequence(UUID 
interactionId, int sequence)
+  List<ExecutionOutboxEntry> findOldest()
   ExecutionOutboxEntry upsert(UUID interactionId, int sequence, 
ExecutionOutboxEntryType executionType, Timestamp startedAt, String username, 
Bookmark target, String logicalMemberIdentifier, String xml)
   ExecutionOutboxEntry upsert(UUID interactionId, int sequence, 
ExecutionOutboxEntryType executionType, Timestamp startedAt, String username, 
Bookmark target, String logicalMemberIdentifier, InteractionDto interactionDto)
   boolean deleteByInteractionIdAndSequence(UUID interactionId, int sequence)
-  List<E> findAll()     // <.>
+  List<ExecutionOutboxEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepositoryAbstract.adoc
similarity index 85%
copy from 
antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepository.adoc
copy to 
antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepositoryAbstract.adoc
index 0cf15f7702..e6c49fd9f7 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/applib/dom/ExecutionOutboxEntryRepositoryAbstract.adoc
@@ -1,4 +1,4 @@
-= ExecutionOutboxEntryRepository
+= ExecutionOutboxEntryRepositoryAbstract
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements. See the NOTICE file distributed with this work 
for additional information regarding copyright ownership. The ASF licenses this 
file to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy of 
the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by 
applicable law or ag [...]
 
 Provides supporting functionality for querying and persisting 
xref:refguide:extensions:index/executionoutbox/applib/dom/ExecutionOutboxEntry.adoc[ExecutionOutboxEntry]
 entities.
@@ -6,18 +6,18 @@ Provides supporting functionality for querying and persisting 
xref:refguide:exte
 == API
 
 [source,java]
-.ExecutionOutboxEntryRepository.java
+.ExecutionOutboxEntryRepositoryAbstract.java
 ----
-class ExecutionOutboxEntryRepository<E> {
+class ExecutionOutboxEntryRepositoryAbstract<E> {
   public final static String LOGICAL_TYPE_NAME;
   Class<E> getEntityClass()
   E createEntryAndPersist(Execution execution)
-  Optional<E> findByInteractionIdAndSequence(UUID interactionId, int sequence)
-  List<E> findOldest()
+  Optional<ExecutionOutboxEntry> findByInteractionIdAndSequence(UUID 
interactionId, int sequence)
+  List<ExecutionOutboxEntry> findOldest()
   ExecutionOutboxEntry upsert(UUID interactionId, int sequence, 
ExecutionOutboxEntryType executionType, Timestamp startedAt, String username, 
Bookmark target, String logicalMemberIdentifier, String xml)
   ExecutionOutboxEntry upsert(UUID interactionId, int sequence, 
ExecutionOutboxEntryType executionType, Timestamp startedAt, String username, 
Bookmark target, String logicalMemberIdentifier, InteractionDto interactionDto)
   boolean deleteByInteractionIdAndSequence(UUID interactionId, int sequence)
-  List<E> findAll()     // <.>
+  List<ExecutionOutboxEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepository.adoc
index 83e88b9a94..3cf1f291ac 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepository.adoc
@@ -8,19 +8,19 @@ Provides supporting functionality for querying 
xref:refguide:extensions:index/se
 [source,java]
 .SessionLogEntryRepository.java
 ----
-class SessionLogEntryRepository<E> {
+interface SessionLogEntryRepository {
   void logoutAllSessions(Timestamp logoutTimestamp)
   SessionLogEntry create(String username, UUID sessionGuid, String 
httpSessionId, SessionSubscriber.CausedBy causedBy, Timestamp timestamp)
-  Optional<E> findBySessionGuid(UUID sessionGuid)
-  Optional<E> findByHttpSessionId(String httpSessionId)
-  List<E> findByUsername(String username)
-  List<E> findByUsernameAndFromAndTo(String username, LocalDate from, 
LocalDate to)
-  List<E> findByFromAndTo(LocalDate from, LocalDate to)
-  List<E> findByUsernameAndStrictlyBefore(String username, Timestamp from)
-  List<E> findByUsernameAndStrictlyAfter(String username, Timestamp from)
-  List<E> findActiveSessions()
-  List<E> findRecentByUsername(String username)
-  List<E> findAll()     // <.>
+  Optional<SessionLogEntry> findBySessionGuid(UUID sessionGuid)
+  Optional<SessionLogEntry> findByHttpSessionId(String httpSessionId)
+  List<SessionLogEntry> findByUsername(String username)
+  List<SessionLogEntry> findByUsernameAndFromAndTo(String username, LocalDate 
from, LocalDate to)
+  List<SessionLogEntry> findByFromAndTo(LocalDate from, LocalDate to)
+  List<SessionLogEntry> findByUsernameAndStrictlyBefore(String username, 
Timestamp from)
+  List<SessionLogEntry> findByUsernameAndStrictlyAfter(String username, 
Timestamp from)
+  List<SessionLogEntry> findActiveSessions()
+  List<SessionLogEntry> findRecentByUsername(String username)
+  List<SessionLogEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepository.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepositoryAbstract.adoc
similarity index 63%
copy from 
antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepository.adoc
copy to 
antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepositoryAbstract.adoc
index 83e88b9a94..f8578d5917 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepository.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/sessionlog/applib/dom/SessionLogEntryRepositoryAbstract.adoc
@@ -1,4 +1,4 @@
-= SessionLogEntryRepository
+= SessionLogEntryRepositoryAbstract
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements. See the NOTICE file distributed with this work 
for additional information regarding copyright ownership. The ASF licenses this 
file to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy of 
the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by 
applicable law or ag [...]
 
 Provides supporting functionality for querying 
xref:refguide:extensions:index/sessionlog/applib/dom/SessionLogEntry.adoc[SessionLogEntry]
 entities.
@@ -6,21 +6,21 @@ Provides supporting functionality for querying 
xref:refguide:extensions:index/se
 == API
 
 [source,java]
-.SessionLogEntryRepository.java
+.SessionLogEntryRepositoryAbstract.java
 ----
-class SessionLogEntryRepository<E> {
+class SessionLogEntryRepositoryAbstract<E> {
   void logoutAllSessions(Timestamp logoutTimestamp)
   SessionLogEntry create(String username, UUID sessionGuid, String 
httpSessionId, SessionSubscriber.CausedBy causedBy, Timestamp timestamp)
-  Optional<E> findBySessionGuid(UUID sessionGuid)
-  Optional<E> findByHttpSessionId(String httpSessionId)
-  List<E> findByUsername(String username)
-  List<E> findByUsernameAndFromAndTo(String username, LocalDate from, 
LocalDate to)
-  List<E> findByFromAndTo(LocalDate from, LocalDate to)
-  List<E> findByUsernameAndStrictlyBefore(String username, Timestamp from)
-  List<E> findByUsernameAndStrictlyAfter(String username, Timestamp from)
-  List<E> findActiveSessions()
-  List<E> findRecentByUsername(String username)
-  List<E> findAll()     // <.>
+  Optional<SessionLogEntry> findBySessionGuid(UUID sessionGuid)
+  Optional<SessionLogEntry> findByHttpSessionId(String httpSessionId)
+  List<SessionLogEntry> findByUsername(String username)
+  List<SessionLogEntry> findByUsernameAndFromAndTo(String username, LocalDate 
from, LocalDate to)
+  List<SessionLogEntry> findByFromAndTo(LocalDate from, LocalDate to)
+  List<SessionLogEntry> findByUsernameAndStrictlyBefore(String username, 
Timestamp from)
+  List<SessionLogEntry> findByUsernameAndStrictlyAfter(String username, 
Timestamp from)
+  List<SessionLogEntry> findActiveSessions()
+  List<SessionLogEntry> findRecentByUsername(String username)
+  List<SessionLogEntry> findAll()     // <.>
   void removeAll()     // <.>
 }
 ----
diff --git 
a/antora/components/refguide-index/modules/persistence/pages/index/commons/integration/changetracking/EntityChangeTrackerDefault.adoc
 
b/antora/components/refguide-index/modules/persistence/pages/index/commons/integration/changetracking/EntityChangeTrackerDefault.adoc
index 6edd7e5b47..74b64c6053 100644
--- 
a/antora/components/refguide-index/modules/persistence/pages/index/commons/integration/changetracking/EntityChangeTrackerDefault.adoc
+++ 
b/antora/components/refguide-index/modules/persistence/pages/index/commons/integration/changetracking/EntityChangeTrackerDefault.adoc
@@ -12,6 +12,7 @@ The service is 
xref:refguide:applib:index/annotation/TransactionScope.adoc[Trans
 ----
 class EntityChangeTrackerDefault {
   int getOrder()
+  void init()
   void destroy()
   Set<PropertyChangeRecord> snapshotPropertyChangeRecords()
   void beforeCompletion()
diff --git 
a/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiService.adoc
 
b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiService.adoc
index f5b796b6f6..23985f5ab6 100644
--- 
a/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiService.adoc
+++ 
b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiService.adoc
@@ -27,3 +27,7 @@ A UI model to represent the currently logged in user.
 === userProfile()
 
 A UI model to represent the currently logged in user.
+
+include::hooks/UserProfileUiService_010-implementation.adoc[]
+
+include::hooks/UserProfileUiService_020-examples-and-usage.adoc[]
diff --git a/core/adoc/modules/_overview/pages/about.adoc 
b/core/adoc/modules/_overview/pages/about.adoc
index 5eaf115d88..1b8ee5c3d5 100644
--- a/core/adoc/modules/_overview/pages/about.adoc
+++ b/core/adoc/modules/_overview/pages/about.adoc
@@ -407,7 +407,6 @@ com.github.javafaker:javafaker:jar:<managed> +
 org.apache.causeway.commons:causeway-commons:jar:<managed> +
 org.apache.causeway.core:causeway-applib:jar:<managed> +
 
org.apache.causeway.testing:causeway-testing-unittestsupport-applib:jar:<managed>
 +
-org.projectlombok:lombok:jar:<managed> +
 ****
 
 .Document Index Entries
@@ -1331,7 +1330,6 @@ 
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
 +
-o.a.i.core.runtimeservices.repository.RepositoryServiceDefault +
 o.a.i.core.runtimeservices.routing.RoutingServiceDefault +
 o.a.i.core.runtimeservices.scratchpad.ScratchpadDefault +
 o.a.i.core.runtimeservices.serializing.SerializingAdapterDefault +
@@ -1351,11 +1349,13 @@ 
o.a.i.core.runtimeservices.xmlsnapshot.XmlSnapshotServiceDefault +
 
 .Dependencies
 ****
+com.sun.mail:jakarta.mail:jar:<managed> +
 jakarta.mail:jakarta.mail-api:jar:<managed> +
 org.apache.causeway.core:causeway-core-codegen-bytebuddy:jar:<managed> +
 org.apache.causeway.core:causeway-core-internaltestsupport:jar:<managed> +
 org.apache.causeway.core:causeway-core-runtime:jar:<managed> +
 org.hsqldb:hsqldb:jar:<managed> +
+org.springframework:spring-context-support:jar:<managed> +
 ****
 
 .Document Index Entries
@@ -1536,6 +1536,7 @@ Directory: /persistence/commons
 ****
 
o.a.i.persistence.commons.integration.changetracking.EntityChangeTrackerDefault 
+
 
o.a.i.persistence.commons.integration.changetracking.PreAndPostValueEvaluatorServiceDefault
 +
+o.a.i.persistence.commons.integration.repository.RepositoryServiceDefault +
 ****
 
 .Dependencies
@@ -2472,6 +2473,165 @@ 
org.apache.causeway.viewer:causeway-viewer-commons-model:jar:<managed> +
 ****
 |===
 
+=== GraphQL
+
+[plantuml,GraphQL,svg]
+----
+@startuml
+set separator none
+title GraphQL - Containers
+
+left to right direction
+
+skinparam {
+  arrowFontSize 10
+  defaultTextAlignment center
+  wrapWidth 200
+  maxMessageSize 100
+}
+
+hide stereotype
+
+skinparam rectangle<<GraphQL.ApacheCausewayViewerGraphQL>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2e6295
+  shadowing false
+}
+skinparam rectangle<<GraphQL.ApacheCausewayViewerGraphQLApplib>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2e6295
+  shadowing false
+}
+skinparam rectangle<<GraphQL.ApacheCausewayViewerGraphQLModel>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2e6295
+  shadowing false
+}
+skinparam rectangle<<GraphQL.ApacheCausewayViewerGraphQLTest>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2e6295
+  shadowing false
+}
+skinparam rectangle<<GraphQL.ApacheCausewayViewerGraphQLViewer>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2e6295
+  shadowing false
+}
+skinparam rectangle<<GraphQL>> {
+  BorderColor #9a9a9a
+  FontColor #9a9a9a
+  shadowing false
+}
+
+rectangle "GraphQL\n<size:10>[Software System]</size>" <<GraphQL>> {
+  rectangle "==Apache Causeway Viewer - GraphQL\n<size:10>[Container: 
packaging: pom]</size>" <<GraphQL.ApacheCausewayViewerGraphQL>> as 
GraphQL.ApacheCausewayViewerGraphQL
+  rectangle "==Apache Causeway Viewer - GraphQL (Applib)\n<size:10>[Container: 
packaging: jar]</size>" <<GraphQL.ApacheCausewayViewerGraphQLApplib>> as 
GraphQL.ApacheCausewayViewerGraphQLApplib
+  rectangle "==Apache Causeway Viewer - GraphQL (Model)\n<size:10>[Container: 
packaging: jar]</size>" <<GraphQL.ApacheCausewayViewerGraphQLModel>> as 
GraphQL.ApacheCausewayViewerGraphQLModel
+  rectangle "==Apache Causeway Viewer - GraphQL (Test)\n<size:10>[Container: 
packaging: jar]</size>" <<GraphQL.ApacheCausewayViewerGraphQLTest>> as 
GraphQL.ApacheCausewayViewerGraphQLTest
+  rectangle "==Apache Causeway Viewer - GraphQL (Viewer)\n<size:10>[Container: 
packaging: jar]</size>" <<GraphQL.ApacheCausewayViewerGraphQLViewer>> as 
GraphQL.ApacheCausewayViewerGraphQLViewer
+}
+
+GraphQL.ApacheCausewayViewerGraphQL .[#707070,thickness=2].> 
GraphQL.ApacheCausewayViewerGraphQLViewer : "<color:#707070>"
+GraphQL.ApacheCausewayViewerGraphQL .[#707070,thickness=2].> 
GraphQL.ApacheCausewayViewerGraphQLApplib : "<color:#707070>"
+GraphQL.ApacheCausewayViewerGraphQL .[#707070,thickness=2].> 
GraphQL.ApacheCausewayViewerGraphQLModel : "<color:#707070>"
+GraphQL.ApacheCausewayViewerGraphQL .[#707070,thickness=2].> 
GraphQL.ApacheCausewayViewerGraphQLTest : "<color:#707070>"
+@enduml
+----
+
+.Projects/Modules (GraphQL)
+[cols="3a,5a", options="header"]
+|===
+|Coordinates |Description 
+
+|Apache Causeway Viewer - GraphQL
+[source,yaml]
+----
+Group: org.apache.causeway.viewer
+Artifact: causeway-viewer-graphql
+Type: pom
+Directory: /viewers/graphql
+----
+|
+
+|Apache Causeway Viewer - GraphQL (Applib)
+[source,yaml]
+----
+Group: org.apache.causeway.viewer
+Artifact: causeway-viewer-graphql-applib
+Type: jar
+Directory: /viewers/graphql/applib
+----
+|.Dependencies
+****
+org.apache.causeway.core:causeway-applib:jar:<managed> +
+org.apache.causeway.core:causeway-core-internaltestsupport:jar:<managed> +
+****
+
+|Apache Causeway Viewer - GraphQL (Model)
+[source,yaml]
+----
+Group: org.apache.causeway.viewer
+Artifact: causeway-viewer-graphql-model
+Type: jar
+Directory: /viewers/graphql/model
+----
+|.Dependencies
+****
+com.graphql-java:graphql-java:jar:<managed> +
+org.apache.causeway.core:causeway-core-internaltestsupport:jar:<managed> +
+org.apache.causeway.viewer:causeway-viewer-commons-model:jar:<managed> +
+org.apache.causeway.viewer:causeway-viewer-graphql-applib:jar:<managed> +
+org.springframework.boot:spring-boot-autoconfigure:jar:<managed> +
+org.springframework.graphql:spring-graphql:jar:<managed> +
+****
+
+|Apache Causeway Viewer - GraphQL (Test)
+[source,yaml]
+----
+Group: org.apache.causeway.viewer
+Artifact: causeway-viewer-graphql-test
+Type: jar
+Directory: /viewers/graphql/test
+----
+|.Dependencies
+****
+com.approvaltests:approvaltests:jar:<managed> +
+com.h2database:h2:jar:<managed> +
+org.apache.causeway.core:causeway-core-internaltestsupport:jar:<managed> +
+org.apache.causeway.core:causeway-core-runtimeservices:jar:<managed> +
+org.apache.causeway.persistence:causeway-persistence-jpa-eclipselink:jar:<managed>
 +
+org.apache.causeway.security:causeway-security-bypass:jar:<managed> +
+org.apache.causeway.testing:causeway-testing-fixtures-applib:jar:<managed> +
+org.apache.causeway.testing:causeway-testing-integtestsupport-applib:jar:<managed>
 +
+org.apache.causeway.viewer:causeway-viewer-graphql-viewer:jar:<managed> +
+org.springframework:spring-context-support:jar:<managed> +
+org.springframework.boot:spring-boot-test-autoconfigure:jar:<managed> +
+org.springframework.graphql:spring-graphql-test:jar:1.2.4 +
+****
+
+|Apache Causeway Viewer - GraphQL (Viewer)
+[source,yaml]
+----
+Group: org.apache.causeway.viewer
+Artifact: causeway-viewer-graphql-viewer
+Type: jar
+Directory: /viewers/graphql/viewer
+----
+|.Dependencies
+****
+org.apache.causeway.core:causeway-core-webapp:jar:<managed> +
+org.apache.causeway.viewer:causeway-viewer-graphql-model:jar:<managed> +
+org.assertj:assertj-core:jar:<managed> +
+org.junit.jupiter:junit-jupiter-api:jar:<managed> +
+org.springframework.boot:spring-boot-starter-websocket:jar:<managed> +
+****
+|===
+
 === Restful Objects
 
 [plantuml,Restful Objects,svg]
@@ -2880,14 +3040,7 @@ Artifact: causeway-viewer-wicket-ui
 Type: jar
 Directory: /viewers/wicket/ui
 ----
-|.Components
-****
-o.a.i.viewer.wicket.ui.app.logout.LogoutHandlerWkt +
-o.a.i.viewer.wicket.ui.components.collectioncontents.export.CollectionContentsAsExportFactory
 +
-o.a.i.viewer.wicket.ui.components.widgets.themepicker.CausewayWicketThemeSupportDefault
 +
-****
-
-.Dependencies
+|.Dependencies
 ****
 com.google.guava:guava:jar:<managed> +
 de.agilecoders.wicket:wicket-bootstrap-core:jar:<managed> +
@@ -2944,22 +3097,7 @@ Artifact: causeway-viewer-wicket-viewer
 Type: jar
 Directory: /viewers/wicket/viewer
 ----
-|.Components
-****
-o.a.i.viewer.wicket.viewer.registries.components.ComponentFactoryRegistrarDefault
 +
-o.a.i.viewer.wicket.viewer.registries.components.ComponentFactoryRegistryDefault
 +
-o.a.i.viewer.wicket.viewer.registries.pages.PageClassListDefault +
-o.a.i.viewer.wicket.viewer.registries.pages.PageClassRegistryDefault +
-o.a.i.viewer.wicket.viewer.registries.pages.PageNavigationServiceDefault +
-o.a.i.viewer.wicket.viewer.services.BookmarkUiServiceWicket +
-o.a.i.viewer.wicket.viewer.services.DeepLinkServiceWicket +
-o.a.i.viewer.wicket.viewer.services.HintStoreUsingWicketSession +
-o.a.i.viewer.wicket.viewer.services.ImageResourceCacheClassPath +
-o.a.i.viewer.wicket.viewer.webmodule.WebModuleWicket +
-o.a.i.viewer.wicket.viewer.wicketapp.CausewayWicketApplication$ServiceInjectorHolder
 +
-****
-
-.Dependencies
+|.Dependencies
 ****
 commons-io:commons-io:jar:<managed> +
 de.agilecoders.wicket:wicket-bootstrap-core:jar:<managed> +
@@ -4212,12 +4350,13 @@ 
o.a.i.extensions.audittrail.applib.spiimpl.EntityPropertyChangeSubscriberForAudi
 .Dependencies
 ****
 org.apache.causeway.core:causeway-core-runtime:jar:<managed> +
+org.apache.causeway.extensions:causeway-extensions-commandlog-applib:jar:<managed>
 +
 
org.apache.causeway.testing:causeway-testing-integtestsupport-applib:jar:<managed>
 +
 ****
 
 .Document Index Entries
 ****
-xref:refguide:extensions:index/audittrail/applib/app/AuditTrailMenu.adoc[AuditTrailMenu],
 
xref:refguide:extensions:index/audittrail/applib/contributions/HasInteractionId_auditTrailEntries.adoc[HasInteractionId_auditTrailEntries],
 
xref:refguide:extensions:index/audittrail/applib/contributions/Object_recentAuditTrailEntries.adoc[Object_recentAuditTrailEntries],
 
xref:refguide:extensions:index/audittrail/applib/dom/AuditTrailEntry.adoc[AuditTrailEntry],
 xref:refguide:extensions:index/audittr [...]
+xref:refguide:extensions:index/audittrail/applib/app/AuditTrailMenu.adoc[AuditTrailMenu],
 
xref:refguide:extensions:index/audittrail/applib/contributions/HasInteractionId_auditTrailEntries.adoc[HasInteractionId_auditTrailEntries],
 
xref:refguide:extensions:index/audittrail/applib/contributions/Object_createdByCommand.adoc[Object_createdByCommand],
 
xref:refguide:extensions:index/audittrail/applib/contributions/Object_recentAuditTrailEntries.adoc[Object_recentAuditTrailEntries],
 xref:refguid [...]
 ****
 
 |Apache Causeway Ext - Audit Trail Persistence (using JDO)
@@ -4487,6 +4626,7 @@ 
o.a.i.extensions.pdfjs.metamodel.facet.PdfJsViewerFacetFromAnnotationFactory$Reg
 ****
 org.apache.causeway.core:causeway-core-metamodel:jar:<managed> +
 org.apache.causeway.extensions:causeway-extensions-pdfjs-applib:jar:<managed> +
+org.apache.causeway.persistence:causeway-persistence-commons:jar:<managed> +
 
org.apache.causeway.testing:causeway-testing-integtestsupport-applib:jar:<managed>
 +
 ****
 
@@ -4814,7 +4954,7 @@ 
org.apache.causeway.testing:causeway-testing-integtestsupport-applib:jar:<manage
 
 .Document Index Entries
 ****
-xref:refguide:extensions:index/sessionlog/applib/app/SessionLogMenu.adoc[SessionLogMenu],
 
xref:refguide:extensions:index/sessionlog/applib/contributions/HasUsername_recentSessionsForUser.adoc[HasUsername_recentSessionsForUser],
 
xref:refguide:extensions:index/sessionlog/applib/dom/SessionLogEntry.adoc[SessionLogEntry],
 
xref:refguide:extensions:index/sessionlog/applib/dom/SessionLogEntryRepository.adoc[SessionLogEntryRepository],
 xref:refguide:extensions:index/sessionlog/applib/spiimpl/Ses [...]
+xref:refguide:extensions:index/sessionlog/applib/app/SessionLogMenu.adoc[SessionLogMenu],
 
xref:refguide:extensions:index/sessionlog/applib/contributions/HasUsername_recentSessionsForUser.adoc[HasUsername_recentSessionsForUser],
 
xref:refguide:extensions:index/sessionlog/applib/dom/SessionLogEntry.adoc[SessionLogEntry],
 
xref:refguide:extensions:index/sessionlog/applib/dom/SessionLogEntryRepository.adoc[SessionLogEntryRepository],
 xref:refguide:extensions:index/sessionlog/applib/dom/Session [...]
 ****
 
 |Apache Causeway Ext - Session Log Persistence (using JDO)
@@ -5251,7 +5391,7 @@ org.quartz-scheduler:quartz:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:extensions:index/commandlog/applib/app/CommandLogMenu.adoc[CommandLogMenu],
 
xref:refguide:extensions:index/commandlog/applib/contributions/HasInteractionId_commandLogEntry.adoc[HasInteractionId_commandLogEntry],
 
xref:refguide:extensions:index/commandlog/applib/contributions/HasUsername_recentCommandsByUser.adoc[HasUsername_recentCommandsByUser],
 
xref:refguide:extensions:index/commandlog/applib/contributions/Object_recentCommands.adoc[Object_recentCommands],
 xref:refguide:ex [...]
+xref:refguide:extensions:index/commandlog/applib/app/CommandLogMenu.adoc[CommandLogMenu],
 
xref:refguide:extensions:index/commandlog/applib/contributions/HasInteractionId_commandLogEntry.adoc[HasInteractionId_commandLogEntry],
 
xref:refguide:extensions:index/commandlog/applib/contributions/HasUsername_recentCommandsByUser.adoc[HasUsername_recentCommandsByUser],
 
xref:refguide:extensions:index/commandlog/applib/contributions/Object_recentCommands.adoc[Object_recentCommands],
 xref:refguide:ex [...]
 ****
 
 |Apache Causeway Ext - Command Log Implementation (JDO)
@@ -5507,7 +5647,7 @@ 
org.apache.causeway.testing:causeway-testing-unittestsupport-applib:jar:<managed
 
 .Document Index Entries
 ****
-xref:refguide:extensions:index/executionlog/applib/CausewayModuleExtExecutionLogApplib.adoc[CausewayModuleExtExecutionLogApplib],
 
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_rec
 [...]
+xref:refguide:extensions:index/executionlog/applib/CausewayModuleExtExecutionLogApplib.adoc[CausewayModuleExtExecutionLogApplib],
 
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_rec
 [...]
 ****
 
 |Apache Causeway Ext - Execution Log Implementation (JDO)
@@ -5679,7 +5819,7 @@ 
org.apache.causeway.testing:causeway-testing-unittestsupport-applib:jar:<managed
 
 .Document Index Entries
 ****
-xref:refguide:extensions:index/executionoutbox/applib/CausewayModuleExtExecutionOutboxApplib.adoc[CausewayModuleExtExecutionOutboxApplib],
 
xref:refguide:extensions:index/executionoutbox/applib/app/ExecutionOutboxMenu.adoc[ExecutionOutboxMenu],
 
xref:refguide:extensions:index/executionoutbox/applib/dom/ExecutionOutboxEntry.adoc[ExecutionOutboxEntry],
 
xref:refguide:extensions:index/executionoutbox/applib/dom/ExecutionOutboxEntryRepository.adoc[ExecutionOutboxEntryRepository],
 xref:refguide: [...]
+xref:refguide:extensions:index/executionoutbox/applib/CausewayModuleExtExecutionOutboxApplib.adoc[CausewayModuleExtExecutionOutboxApplib],
 
xref:refguide:extensions:index/executionoutbox/applib/app/ExecutionOutboxMenu.adoc[ExecutionOutboxMenu],
 
xref:refguide:extensions:index/executionoutbox/applib/dom/ExecutionOutboxEntry.adoc[ExecutionOutboxEntry],
 
xref:refguide:extensions:index/executionoutbox/applib/dom/ExecutionOutboxEntryRepository.adoc[ExecutionOutboxEntryRepository],
 xref:refguide: [...]
 ****
 
 |Apache Causeway Ext - Execution Outbox Implementation (JDO)
@@ -6524,7 +6664,31 @@ Artifact: causeway-regressiontests-stable
 Type: jar
 Directory: /regressiontests/stable
 ----
-|.Dependencies
+|.Components
+****
+o.a.i.testdomain.jdo.JdoInventoryDao +
+o.a.i.testdomain.jdo.JdoTestFixtures +
+o.a.i.testdomain.jpa.JpaInventoryDao +
+o.a.i.testdomain.jpa.JpaTestFixtures +
+o.a.i.testdomain.jpa.springdata.EmployeeRepository +
+o.a.i.testdomain.model.valuetypes.ValueTypeExampleService +
+o.a.i.testdomain.publishing.PublishingTestFactoryAbstract$CommitListener +
+o.a.i.testdomain.publishing.PublishingTestFactoryJdo +
+o.a.i.testdomain.publishing.PublishingTestFactoryJpa +
+o.a.i.testdomain.publishing.subscriber.CommandSubscriberForTesting +
+o.a.i.testdomain.publishing.subscriber.EntityChangesSubscriberForTesting +
+o.a.i.testdomain.publishing.subscriber.EntityPropertyChangeSubscriberForTesting
 +
+o.a.i.testdomain.publishing.subscriber.ExecutionSubscriberForTesting +
+o.a.i.testdomain.util.event.LifecycleEventSubscriberJdoForTesting +
+o.a.i.testdomain.util.event.LifecycleEventSubscriberJpaForTesting +
+o.a.i.testdomain.util.interaction.DomainObjectTesterFactory +
+o.a.i.testdomain.util.interaction.InteractionBoundaryProbe +
+o.a.i.testdomain.util.kv.KVStoreForTesting +
+o.a.i.testdomain.util.rest.RestEndpointService +
+o.a.i.testdomain.wrapperfactory.CounterRepository +
+****
+
+.Dependencies
 ****
 
org.apache.causeway.extensions:causeway-extensions-fullcalendar-applib:jar:<managed>
 +
 
org.apache.causeway.extensions:causeway-extensions-secman-encryption-jbcrypt:jar:<managed>
 +
@@ -6532,6 +6696,7 @@ 
org.apache.causeway.extensions:causeway-extensions-secman-integration:jar:<manag
 
org.apache.causeway.extensions:causeway-extensions-secman-persistence-jdo:jar:<managed>
 +
 org.apache.causeway.extensions:causeway-extensions-sse-metamodel:jar:<managed> 
+
 org.apache.causeway.mavendeps:causeway-mavendeps-webapp:pom:<managed> +
+org.apache.causeway.persistence:causeway-persistence-commons:jar:<managed> +
 
org.apache.causeway.persistence:causeway-persistence-jdo-datanucleus:jar:<managed>
 +
 
org.apache.causeway.persistence:causeway-persistence-jpa-eclipselink:jar:<managed>
 +
 org.apache.causeway.security:causeway-security-shiro:jar:<managed> +
@@ -6638,6 +6803,8 @@ Directory: /regressiontests/stable-config
 ----
 |.Dependencies
 ****
+com.icegreen:greenmail-junit5:jar:1.6.15 +
+org.apache.causeway.core:causeway-core-runtimeservices:jar:<managed> +
 
org.apache.causeway.regressiontests:causeway-regressiontests-stable:jar:<managed>
 +
 ****
 
@@ -6925,165 +7092,13 @@ Directory: /incubator
 
 === Kroviz Client
 
-=== GraphQL Viewer
-
-[plantuml,GraphQL Viewer,svg]
-----
-@startuml
-set separator none
-title GraphQL Viewer - Containers
-
-left to right direction
-
-skinparam {
-  arrowFontSize 10
-  defaultTextAlignment center
-  wrapWidth 200
-  maxMessageSize 100
-}
-
-hide stereotype
-
-skinparam rectangle<<GraphQLViewer.ApacheCausewayIncViewerGraphQL>> {
-  BackgroundColor #438dd5
-  FontColor #fffffe
-  BorderColor #2e6295
-  shadowing false
-}
-skinparam rectangle<<GraphQLViewer.ApacheCausewayIncViewerGraphQLApplib>> {
-  BackgroundColor #438dd5
-  FontColor #fffffe
-  BorderColor #2e6295
-  shadowing false
-}
-skinparam rectangle<<GraphQLViewer.ApacheCausewayIncViewerGraphQLModel>> {
-  BackgroundColor #438dd5
-  FontColor #fffffe
-  BorderColor #2e6295
-  shadowing false
-}
-skinparam rectangle<<GraphQLViewer.ApacheCausewayIncViewerGraphQLTest>> {
-  BackgroundColor #438dd5
-  FontColor #fffffe
-  BorderColor #2e6295
-  shadowing false
-}
-skinparam rectangle<<GraphQLViewer.ApacheCausewayIncViewerGraphQLViewer>> {
-  BackgroundColor #438dd5
-  FontColor #fffffe
-  BorderColor #2e6295
-  shadowing false
-}
-skinparam rectangle<<GraphQLViewer>> {
-  BorderColor #9a9a9a
-  FontColor #9a9a9a
-  shadowing false
-}
-
-rectangle "GraphQL Viewer\n<size:10>[Software System]</size>" 
<<GraphQLViewer>> {
-  rectangle "==Apache Causeway Inc - Viewer GraphQL\n<size:10>[Container: 
packaging: pom]</size>" <<GraphQLViewer.ApacheCausewayIncViewerGraphQL>> as 
GraphQLViewer.ApacheCausewayIncViewerGraphQL
-  rectangle "==Apache Causeway Inc - Viewer GraphQL 
(Applib)\n<size:10>[Container: packaging: jar]</size>" 
<<GraphQLViewer.ApacheCausewayIncViewerGraphQLApplib>> as 
GraphQLViewer.ApacheCausewayIncViewerGraphQLApplib
-  rectangle "==Apache Causeway Inc - Viewer GraphQL 
(Model)\n<size:10>[Container: packaging: jar]</size>" 
<<GraphQLViewer.ApacheCausewayIncViewerGraphQLModel>> as 
GraphQLViewer.ApacheCausewayIncViewerGraphQLModel
-  rectangle "==Apache Causeway Inc - Viewer GraphQL 
(Test)\n<size:10>[Container: packaging: jar]</size>" 
<<GraphQLViewer.ApacheCausewayIncViewerGraphQLTest>> as 
GraphQLViewer.ApacheCausewayIncViewerGraphQLTest
-  rectangle "==Apache Causeway Inc - Viewer GraphQL 
(Viewer)\n<size:10>[Container: packaging: jar]</size>" 
<<GraphQLViewer.ApacheCausewayIncViewerGraphQLViewer>> as 
GraphQLViewer.ApacheCausewayIncViewerGraphQLViewer
-}
-
-GraphQLViewer.ApacheCausewayIncViewerGraphQL .[#707070,thickness=2].> 
GraphQLViewer.ApacheCausewayIncViewerGraphQLViewer : "<color:#707070>"
-GraphQLViewer.ApacheCausewayIncViewerGraphQL .[#707070,thickness=2].> 
GraphQLViewer.ApacheCausewayIncViewerGraphQLApplib : "<color:#707070>"
-GraphQLViewer.ApacheCausewayIncViewerGraphQL .[#707070,thickness=2].> 
GraphQLViewer.ApacheCausewayIncViewerGraphQLModel : "<color:#707070>"
-GraphQLViewer.ApacheCausewayIncViewerGraphQL .[#707070,thickness=2].> 
GraphQLViewer.ApacheCausewayIncViewerGraphQLTest : "<color:#707070>"
-@enduml
-----
-
-.Projects/Modules (GraphQL Viewer)
-[cols="3a,5a", options="header"]
-|===
-|Coordinates |Description 
-
-|Apache Causeway Inc - Viewer GraphQL
-[source,yaml]
-----
-Group: org.apache.causeway.incubator.viewer
-Artifact: causeway-viewer-graphql
-Type: pom
-Directory: /incubator/viewers/graphql
-----
-|
-
-|Apache Causeway Inc - Viewer GraphQL (Applib)
-[source,yaml]
-----
-Group: org.apache.causeway.incubator.viewer
-Artifact: causeway-viewer-graphql-applib
-Type: jar
-Directory: /incubator/viewers/graphql/applib
-----
-|.Dependencies
-****
-org.apache.causeway.core:causeway-applib:jar:<managed> +
-org.apache.causeway.core:causeway-core-internaltestsupport:jar:<managed> +
-****
+=== Command Replay
 
-|Apache Causeway Inc - Viewer GraphQL (Model)
-[source,yaml]
-----
-Group: org.apache.causeway.incubator.viewer
-Artifact: causeway-viewer-graphql-model
-Type: jar
-Directory: /incubator/viewers/graphql/model
-----
-|.Dependencies
-****
-com.graphql-java:graphql-java:jar:<managed> +
-org.apache.causeway.core:causeway-core-internaltestsupport:jar:<managed> +
-org.apache.causeway.incubator.viewer:causeway-viewer-graphql-applib:jar:<managed>
 +
-org.apache.causeway.viewer:causeway-viewer-commons-model:jar:<managed> +
-org.springframework.graphql:spring-graphql:jar:<managed> +
-****
-
-|Apache Causeway Inc - Viewer GraphQL (Test)
-[source,yaml]
-----
-Group: org.apache.causeway.incubator.viewer
-Artifact: causeway-viewer-graphql-test
-Type: jar
-Directory: /incubator/viewers/graphql/test
-----
-|.Dependencies
-****
-com.approvaltests:approvaltests:jar:<managed> +
-com.h2database:h2:jar:<managed> +
-org.apache.causeway.core:causeway-core-internaltestsupport:jar:<managed> +
-org.apache.causeway.core:causeway-core-runtimeservices:jar:<managed> +
-org.apache.causeway.incubator.viewer:causeway-viewer-graphql-viewer:jar:<managed>
 +
-org.apache.causeway.persistence:causeway-persistence-jpa-eclipselink:jar:<managed>
 +
-org.apache.causeway.security:causeway-security-bypass:jar:<managed> +
-org.apache.causeway.testing:causeway-testing-fixtures-applib:jar:<managed> +
-****
-
-|Apache Causeway Inc - Viewer GraphQL (Viewer)
-[source,yaml]
-----
-Group: org.apache.causeway.incubator.viewer
-Artifact: causeway-viewer-graphql-viewer
-Type: jar
-Directory: /incubator/viewers/graphql/viewer
-----
-|.Dependencies
-****
-org.apache.causeway.core:causeway-core-webapp:jar:<managed> +
-org.apache.causeway.incubator.viewer:causeway-viewer-graphql-model:jar:<managed>
 +
-org.springframework.boot:spring-boot-starter-websocket:jar:<managed> +
-****
-|===
-
-== Other
-
-[plantuml,Other,svg]
+[plantuml,Command Replay,svg]
 ----
 @startuml
 set separator none
-title Other - Containers
+title Command Replay - Containers
 
 left to right direction
 
@@ -7096,47 +7111,47 @@ skinparam {
 
 hide stereotype
 
-skinparam rectangle<<Other.ApacheCausewayExtCommandReplay>> {
+skinparam rectangle<<CommandReplay.ApacheCausewayIncCoreCommandReplay>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2e6295
   shadowing false
 }
-skinparam rectangle<<Other.ApacheCausewayExtCommandReplayforPrimary>> {
+skinparam 
rectangle<<CommandReplay.ApacheCausewayIncCoreCommandReplayforPrimary>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2e6295
   shadowing false
 }
-skinparam rectangle<<Other.ApacheCausewayExtCommandReplayforSecondary>> {
+skinparam 
rectangle<<CommandReplay.ApacheCausewayIncCoreCommandReplayforSecondary>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2e6295
   shadowing false
 }
-skinparam rectangle<<Other>> {
+skinparam rectangle<<CommandReplay>> {
   BorderColor #9a9a9a
   FontColor #9a9a9a
   shadowing false
 }
 
-rectangle "Other\n<size:10>[Software System]</size>" <<Other>> {
-  rectangle "==Apache Causeway Ext - Command Replay\n<size:10>[Container: 
packaging: pom]</size>" <<Other.ApacheCausewayExtCommandReplay>> as 
Other.ApacheCausewayExtCommandReplay
-  rectangle "==Apache Causeway Ext - Command Replay for 
Primary\n<size:10>[Container: packaging: jar]</size>" 
<<Other.ApacheCausewayExtCommandReplayforPrimary>> as 
Other.ApacheCausewayExtCommandReplayforPrimary
-  rectangle "==Apache Causeway Ext - Command Replay for 
Secondary\n<size:10>[Container: packaging: jar]</size>" 
<<Other.ApacheCausewayExtCommandReplayforSecondary>> as 
Other.ApacheCausewayExtCommandReplayforSecondary
+rectangle "Command Replay\n<size:10>[Software System]</size>" 
<<CommandReplay>> {
+  rectangle "==Apache Causeway Inc - Core Command Replay\n<size:10>[Container: 
packaging: pom]</size>" <<CommandReplay.ApacheCausewayIncCoreCommandReplay>> as 
CommandReplay.ApacheCausewayIncCoreCommandReplay
+  rectangle "==Apache Causeway Inc - Core Command Replay for 
Primary\n<size:10>[Container: packaging: jar]</size>" 
<<CommandReplay.ApacheCausewayIncCoreCommandReplayforPrimary>> as 
CommandReplay.ApacheCausewayIncCoreCommandReplayforPrimary
+  rectangle "==Apache Causeway Inc - Core Command Replay for 
Secondary\n<size:10>[Container: packaging: jar]</size>" 
<<CommandReplay.ApacheCausewayIncCoreCommandReplayforSecondary>> as 
CommandReplay.ApacheCausewayIncCoreCommandReplayforSecondary
 }
 
-Other.ApacheCausewayExtCommandReplay .[#707070,thickness=2].> 
Other.ApacheCausewayExtCommandReplayforPrimary : "<color:#707070>"
-Other.ApacheCausewayExtCommandReplay .[#707070,thickness=2].> 
Other.ApacheCausewayExtCommandReplayforSecondary : "<color:#707070>"
+CommandReplay.ApacheCausewayIncCoreCommandReplay .[#707070,thickness=2].> 
CommandReplay.ApacheCausewayIncCoreCommandReplayforPrimary : "<color:#707070>"
+CommandReplay.ApacheCausewayIncCoreCommandReplay .[#707070,thickness=2].> 
CommandReplay.ApacheCausewayIncCoreCommandReplayforSecondary : "<color:#707070>"
 @enduml
 ----
 
-.Projects/Modules (Other)
+.Projects/Modules (Command Replay)
 [cols="3a,5a", options="header"]
 |===
 |Coordinates |Description 
 
-|Apache Causeway Ext - Command Replay
+|Apache Causeway Inc - Core Command Replay
 [source,yaml]
 ----
 Group: org.apache.causeway.incubator.extensions
@@ -7146,7 +7161,7 @@ Directory: /incubator/extensions/core/commandreplay
 ----
 |Replays commands to secondary system
 
-|Apache Causeway Ext - Command Replay for Primary
+|Apache Causeway Inc - Core Command Replay for Primary
 [source,yaml]
 ----
 Group: org.apache.causeway.incubator.extensions
@@ -7156,6 +7171,12 @@ Directory: 
/incubator/extensions/core/commandreplay/primary
 ----
 |A module for obtaining commands from a primary
 
+.Components
+****
+o.a.i.extensions.commandreplay.primary.config.PrimaryConfig +
+o.a.i.extensions.commandreplay.primary.spiimpl.CaptureResultOfCommand +
+****
+
 .Dependencies
 ****
 org.apache.causeway.core:causeway-core-config:jar:<managed> +
@@ -7170,7 +7191,7 @@ 
org.apache.causeway.testing:causeway-testing-fixtures-applib:jar:<managed> +
 
xref:refguide:extensions:index/commandreplay/primary/CausewayModuleExtCommandReplayPrimary.adoc[CausewayModuleExtCommandReplayPrimary],
 
xref:refguide:extensions:index/commandreplay/primary/config/PrimaryConfig.adoc[PrimaryConfig],
 
xref:refguide:extensions:index/commandreplay/primary/mixins/Object_openOnSecondary.adoc[Object_openOnSecondary],
 
xref:refguide:extensions:index/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.adoc[CommandRetrievalOnPrimaryService],
 xref:refguide: [...]
 ****
 
-|Apache Causeway Ext - Command Replay for Secondary
+|Apache Causeway Inc - Core Command Replay for Secondary
 [source,yaml]
 ----
 Group: org.apache.causeway.incubator.extensions
@@ -7181,6 +7202,16 @@ Directory: 
/incubator/extensions/core/commandreplay/secondary
 |A module providing a Quartz Job to run on a secondary system,
 for obtaining commands from a primary and saving them so that they are 
replayed.
 
+.Components
+****
+o.a.i.extensions.commandreplay.secondary.analyser.CommandReplayAnalyserException
 +
+o.a.i.extensions.commandreplay.secondary.analyser.CommandReplayAnalyserResult +
+o.a.i.extensions.commandreplay.secondary.analysis.CommandReplayAnalysisService 
+
+o.a.i.extensions.commandreplay.secondary.config.SecondaryConfig +
+o.a.i.extensions.commandreplay.secondary.fetch.CommandFetcher +
+o.a.i.extensions.commandreplay.secondary.job.ReplicateAndReplayJob +
+****
+
 .Dependencies
 ****
 org.apache.causeway.core:causeway-core-config:jar:<managed> +
diff --git a/viewers/graphql/applib/pom.xml b/viewers/graphql/applib/pom.xml
index 5fa363dffd..86edc7a0ea 100644
--- a/viewers/graphql/applib/pom.xml
+++ b/viewers/graphql/applib/pom.xml
@@ -41,11 +41,34 @@
 
                <dependency>
                        <groupId>org.apache.causeway.core</groupId>
-                       <artifactId>causeway-applib</artifactId>
+                       <artifactId>causeway-core-metamodel</artifactId>
                </dependency>
 
+        <dependency>
+            <groupId>org.springframework.graphql</groupId>
+            <artifactId>spring-graphql</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.graphql-java</groupId>
+                    <artifactId>graphql-java</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
 
-               <!-- TEST DEPENDENCIES -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+        </dependency>
+
+        <dependency>
+            <!-- override spring, for security and bug-fixes -->
+            <groupId>com.graphql-java</groupId>
+            <artifactId>graphql-java</artifactId>
+        </dependency>
+
+
+
+        <!-- TEST DEPENDENCIES -->
 
                <dependency>
                        <groupId>org.apache.causeway.core</groupId>
diff --git a/viewers/graphql/applib/src/main/java/module-info.java 
b/viewers/graphql/applib/src/main/java/module-info.java
index 47981d2a9e..d6dc1a4fed 100644
--- a/viewers/graphql/applib/src/main/java/module-info.java
+++ b/viewers/graphql/applib/src/main/java/module-info.java
@@ -1,5 +1,10 @@
 module org.apache.causeway.incubator.viewer.graphql.applib {
     exports org.apache.causeway.viewer.graphql.applib;
+    exports org.apache.causeway.viewer.graphql.applib.types;
+    exports org.apache.causeway.viewer.graphql.applib.auth;
 
     requires spring.context;
+    requires com.graphqljava;
+    requires org.apache.causeway.core.config;
+    requires org.apache.causeway.core.metamodel;
 }
\ No newline at end of file
diff --git 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/auth/UserMementoProvider.java
 
b/viewers/graphql/applib/src/main/java/org/apache/causeway/viewer/graphql/applib/auth/UserMementoProvider.java
similarity index 56%
rename from 
viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/auth/UserMementoProvider.java
rename to 
viewers/graphql/applib/src/main/java/org/apache/causeway/viewer/graphql/applib/auth/UserMementoProvider.java
index e54ff131f0..71c916555b 100644
--- 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/auth/UserMementoProvider.java
+++ 
b/viewers/graphql/applib/src/main/java/org/apache/causeway/viewer/graphql/applib/auth/UserMementoProvider.java
@@ -16,27 +16,35 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.viewer.auth;
+package org.apache.causeway.viewer.graphql.applib.auth;
+
+import graphql.ExperimentalApi;
+import graphql.execution.ExecutionContext;
+import graphql.execution.ExecutionStrategyParameters;
 
 import org.apache.causeway.applib.services.user.UserMemento;
 import org.apache.causeway.core.config.CausewayConfiguration;
 
-import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
+/**
+ * SPI to obtain the {@link UserMemento} (in other words the identity of the 
executing user) from
+ * the provided GraphQL {@link ExecutionContext} and {@link 
ExecutionStrategyParameters}.
+ *
+ * <p>
+ *     The framework provides a default implementation (as a fallback) that 
returns a statically configured user
+ * </p>
+ *
+ * <p>
+ *     <b>NOTE</b>: this API is considered experimental/beta and may change in 
the future.
+ * </p>
+ *
+ * @since 2.0 {@index}
+ *
+ * @beta
+ */
+@ExperimentalApi
 public interface UserMementoProvider {
 
-    UserMemento userMemento();
-
-    @Configuration
-    class AutoConfiguration {
+    UserMemento userMemento(ExecutionContext executionContext, 
ExecutionStrategyParameters parameters);
 
-        @Bean
-        @ConditionalOnMissingBean(UserMementoProvider.class)
-        public UserMementoProvider defaultIdentityProvider(final 
CausewayConfiguration causewayConfiguration) {
-            return new UserMementoProviderDefault(causewayConfiguration);
-        }
-    }
 
 }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
 
b/viewers/graphql/applib/src/main/java/org/apache/causeway/viewer/graphql/applib/types/TypeMapper.java
similarity index 77%
rename from 
viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
rename to 
viewers/graphql/applib/src/main/java/org/apache/causeway/viewer/graphql/applib/types/TypeMapper.java
index cd702bfc46..afa53462f7 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
+++ 
b/viewers/graphql/applib/src/main/java/org/apache/causeway/viewer/graphql/applib/types/TypeMapper.java
@@ -16,33 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.types;
+package org.apache.causeway.viewer.graphql.applib.types;
 
+import graphql.ExperimentalApi;
 import graphql.schema.*;
 
-import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import 
org.apache.causeway.core.metamodel.spec.feature.OneToManyActionParameter;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneFeature;
 
-import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
 
+/**
+ * SPI to map framework's own datatypes to GraphQL's types.
+ *
+ * <p>
+ *     The framework provides a default implementation (as a fallback) that 
supports most of the common data types.
+ * </p>
+ *
+ * <p>
+ *     <b>NOTE</b>: this API is considered experimental/beta and may change in 
the future.
+ * </p>
+ *
+ * @since 2.0 {@index}
+ */
+@ExperimentalApi
 public interface TypeMapper {
 
-    @Configuration
-    class TypeMapperConfiguration {
-
-        @Bean
-        @ConditionalOnMissingBean(TypeMapper.class)
-        public TypeMapper defaultTypeMapper(final CausewayConfiguration 
causewayConfiguration) {
-            return new TypeMapperDefault(causewayConfiguration);
-        }
-    }
-
     GraphQLScalarType scalarTypeFor(final Class<?> c);
 
     GraphQLOutputType outputTypeFor(final OneToOneFeature oneToOneFeature);
@@ -76,7 +77,7 @@ public interface TypeMapper {
         INVOKE,
         SET,
         ;
-        boolean isOptionalAlwaysAllowed() {
+        public boolean isOptionalAlwaysAllowed() {
             return !(this == INVOKE || this == SET);
         }
     }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
index 733b32a0ca..61b8935186 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
@@ -22,15 +22,13 @@ import graphql.schema.GraphQLCodeRegistry;
 
 import lombok.RequiredArgsConstructor;
 
-import java.util.EnumSet;
-
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.commons.collections.ImmutableEnumSet;
 import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.config.environment.CausewaySystemEnvironment;
 import org.apache.causeway.core.metamodel.spec.ActionScope;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
index 3cf5a7612e..7822e6e5d8 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
@@ -29,17 +29,13 @@ import 
org.apache.causeway.core.metamodel.spec.feature.OneToManyActionParameter;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneActionParameter;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import graphql.schema.*;
 
 import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
index e1356732a0..3872f8f477 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
@@ -36,7 +36,7 @@ import 
org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
index c05f8b891a..6e742c58d2 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
@@ -28,7 +28,7 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import graphql.schema.DataFetchingEnvironment;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
index 1279b1bf90..65c2718d63 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
@@ -35,7 +35,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
- import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+ import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
  import static graphql.schema.GraphQLNonNull.nonNull;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
index 2fec45c1ee..7c4ca73b45 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
@@ -31,7 +31,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import graphql.schema.GraphQLList;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
index 8a7405bc1d..62899607c5 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
@@ -32,7 +32,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
- import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+ import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
  import lombok.val;
  import lombok.extern.log4j.Log4j2;
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
index 9c5bdfe88a..781fc89ea6 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
@@ -28,7 +28,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
index 345f7a4a13..f2409cb62f 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
@@ -28,7 +28,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
index 5798572484..1c0baad74f 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
@@ -28,7 +28,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
index a96f6ace58..0b24823000 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
@@ -28,7 +28,7 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import graphql.schema.DataFetchingEnvironment;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
index 64b58dc73e..056f215409 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
@@ -31,7 +31,7 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
index d342ede8eb..8185ba0bc0 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
@@ -20,7 +20,6 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
index f1e79a8983..0960db17f7 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
@@ -22,7 +22,7 @@ import 
org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import graphql.schema.*;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
index 79e48b6621..3588494c31 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
@@ -27,7 +27,6 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import static graphql.schema.GraphQLNonNull.nonNull;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
index 49320cf76c..31a99f7636 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
@@ -28,7 +28,7 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import lombok.val;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
index 820df38fcf..e2475e5704 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
@@ -20,7 +20,6 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
index ef7854e6d9..5053d3737a 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
@@ -19,7 +19,6 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.applib.annotation.Where;
-import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
@@ -30,7 +29,7 @@ import 
org.apache.causeway.viewer.graphql.model.exceptions.InvalidException;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import lombok.val;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
index a75ceccde3..e216c57cda 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
@@ -18,9 +18,6 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import java.util.Map;
-
-import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
@@ -28,7 +25,7 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 
 import lombok.val;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapperDefault.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapperDefault.java
index f521f2ff88..678dcb2473 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapperDefault.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapperDefault.java
@@ -25,20 +25,20 @@ import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Map;
 
-import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.ws.rs.NotSupportedException;
 
 import org.apache.causeway.core.config.CausewayConfiguration;
 
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
+
 import org.joda.time.DateTime;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
-import org.springframework.stereotype.Component;
 
-import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.commons.internal.collections._Maps;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import 
org.apache.causeway.core.metamodel.spec.feature.OneToManyActionParameter;
@@ -62,6 +62,16 @@ import static graphql.schema.GraphQLTypeReference.typeRef;
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class TypeMapperDefault implements TypeMapper {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(TypeMapper.class)
+        public TypeMapper defaultTypeMapper(final CausewayConfiguration 
causewayConfiguration) {
+            return new TypeMapperDefault(causewayConfiguration);
+        }
+    }
+
     @SuppressWarnings("CdiInjectInspection")
     @Inject private final CausewayConfiguration causewayConfiguration;
 
diff --git a/viewers/graphql/viewer/src/main/java/module-info.java 
b/viewers/graphql/viewer/src/main/java/module-info.java
index c53d6f0e29..72afbea3c4 100644
--- a/viewers/graphql/viewer/src/main/java/module-info.java
+++ b/viewers/graphql/viewer/src/main/java/module-info.java
@@ -25,4 +25,5 @@ module org.apache.causeway.incubator.viewer.graphql.viewer {
     requires spring.core;
     requires spring.graphql;
     requires spring.tx;
+    requires org.apache.causeway.incubator.viewer.graphql.applib;
 }
\ No newline at end of file
diff --git 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/auth/UserMementoProviderDefault.java
 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/auth/UserMementoProviderDefault.java
index fb1000a94b..13e6aefbb1 100644
--- 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/auth/UserMementoProviderDefault.java
+++ 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/auth/UserMementoProviderDefault.java
@@ -24,6 +24,14 @@ import org.apache.causeway.applib.services.user.RoleMemento;
 import org.apache.causeway.applib.services.user.UserMemento;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.core.config.CausewayConfiguration;
+import org.apache.causeway.viewer.graphql.applib.auth.UserMementoProvider;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import graphql.execution.ExecutionContext;
+import graphql.execution.ExecutionStrategyParameters;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -31,12 +39,24 @@ import lombok.val;
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class UserMementoProviderDefault implements UserMementoProvider {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(UserMementoProvider.class)
+        public UserMementoProvider defaultIdentityProvider(final 
CausewayConfiguration causewayConfiguration) {
+            return new UserMementoProviderDefault(causewayConfiguration);
+        }
+    }
+
     @SuppressWarnings("CdiInjectInspection")
     @Inject private final CausewayConfiguration causewayConfiguration;
 
 
     @Override
-    public UserMemento userMemento() {
+    public UserMemento userMemento(
+            final ExecutionContext executionContext,
+            final ExecutionStrategyParameters parameters) {
 
         val fallbackUsername = 
causewayConfiguration.getViewer().getGqlv().getAuthentication().getFallback().getUsername();
         if (fallbackUsername == null) {
diff --git 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/AsyncExecutionStrategyResolvingWithinInteraction.java
 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/AsyncExecutionStrategyResolvingWithinInteraction.java
index 882fd1b610..401771f7c6 100644
--- 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/AsyncExecutionStrategyResolvingWithinInteraction.java
+++ 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/AsyncExecutionStrategyResolvingWithinInteraction.java
@@ -21,12 +21,9 @@ package 
org.apache.causeway.viewer.graphql.viewer.integration;
 import java.util.concurrent.CompletableFuture;
 
 import org.apache.causeway.applib.services.iactnlayer.InteractionContext;
-import org.apache.causeway.applib.services.user.RoleMemento;
 import org.apache.causeway.applib.services.user.UserMemento;
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.core.config.CausewayConfiguration;
 
-import org.apache.causeway.viewer.graphql.viewer.auth.UserMementoProvider;
+import org.apache.causeway.viewer.graphql.applib.auth.UserMementoProvider;
 
 import org.springframework.stereotype.Service;
 
@@ -44,14 +41,14 @@ public class 
AsyncExecutionStrategyResolvingWithinInteraction extends AsyncExecu
 
     private final InteractionService interactionService;
 
-    private final UserMemento userMemento;
+    private final UserMementoProvider userMementoProvider;
 
     public AsyncExecutionStrategyResolvingWithinInteraction(
             final InteractionService interactionService,
             final UserMementoProvider userMementoProvider) {
-        this.interactionService = interactionService;
 
-        this.userMemento = userMementoProvider.userMemento();
+        this.interactionService = interactionService;
+        this.userMementoProvider = userMementoProvider;
     }
 
 
@@ -60,6 +57,8 @@ public class AsyncExecutionStrategyResolvingWithinInteraction 
extends AsyncExecu
             final ExecutionContext executionContext,
             final ExecutionStrategyParameters parameters) {
 
+        val userMemento = userMementoProvider.userMemento(executionContext, 
parameters);
+
         if (userMemento != null) {
             return interactionService.call(
                     InteractionContext.builder().user(userMemento).build(),
diff --git 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
index 2ff2c42cde..542a24e42e 100644
--- 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
+++ 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
@@ -38,7 +38,7 @@ import 
org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainObject;
 import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainService;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+import org.apache.causeway.viewer.graphql.applib.types.TypeMapper;
 import org.apache.causeway.viewer.graphql.viewer.toplevel.GqlvTopLevelQuery;
 import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry;
 

Reply via email to