You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/02/13 07:54:00 UTC

[isis] branch ISIS-2444 updated (0887daa -> 360b43d)

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

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


    from 0887daa  ISIS-2444: more docs for domain services.
     add b025d04  ISIS-2520: JDO Spring Integration README update
     add 18e4347  ISIS-2502: workaround for  Eclipselink low level exception translation issue
     add 5d7448d  ISIS-2502: fixes JDO integration translating a unique constraint violation exception as too generic
     add 60f7b46  ISIS-2502: removes ex. translation logic from TransactionService
     add 0ff982a  ISIS-2445: add *.stackdump to .gitignore
     add 9a243c2  ISIS-2502: reinstate TransactionService as ex. translator
     add 68ba1c2  ISIS-2502: Patch for Spring AOP: allows to plugin a custom TransactionInterceptor
     add 4aa3cf9  ISIS-2502: fixes EclipseLinkJpaDialect
     add c2b909b  ISIS-2502: fixes DnJdoDialect and reuse logic in custom TransactionInterceptor
     add c93f6f9  ISIS-2502: polishing the AopPatch
     add d14adde  Merge pull request #373 from apache/ISIS-2502-ex.recog
     add db67933  ISIS-2502: potential NPE in AopPatch
     add ecd4234  ISIS-2502: Eclipselink JPA Dialect: be smarter when translating generic ex.
     add 33bf384  ISIS-2502: Eclipselink JPA Dialect: be smarter when translating generic ex. (2)
     add 2a46072  Bump woodstox-core from 6.2.3 to 6.2.4
     add 2c468cd  Merge pull request #375 from apache/dependabot/maven/com.fasterxml.woodstox-woodstox-core-6.2.4
     add e1b9e2e  ISIS-2502: housekeeping
     add 101f9c4  ISIS-2502: Add a new Category RETRYABLE
     add e20de3c  ISIS-2502: Implement the actual Exception Recognizer for DAE
     add ff93bd8  ISIS-2502: provide a more friendly message to the UI
     add f57dfd5  ISIS-2502: fixing test
     add 1ced05b  ISIS-2502: on failed interaction only log the root cause
     add 5a5afc7  Merge pull request #376 from apache/ISIS-2502-ex.recog
     new 413fbac  ISIS-2444: docs for more services
     new 360b43d  ISIS-2444: moves Execution out of Interaction so no longer a nested class.

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


Summary of changes:
 .gitignore                                         |   1 +
 .../pages/ExceptionRecognizerService.adoc          |   2 +-
 .../pages/Execution/hooks/examples_and_usage.adoc  |  27 ++
 .../hooks/implementation.adoc                      |  26 ++
 .../applib-svc/pages/ExecutionSubscriber.adoc      |   2 +-
 .../modules/applib-svc/pages/FactoryService.adoc   |   2 +-
 .../applib-svc/pages/GridLoaderService.adoc        |   8 +-
 .../hooks/examples_and_usage.adoc                  |   6 +
 .../applib-svc/pages/GridSystemService.adoc        |  70 +---
 .../hooks/examples_and_usage.adoc                  |  12 +-
 .../GridSystemService/hooks/implementation.adoc    |   4 +
 .../applib-svc/pages/HealthCheckService.adoc       |  64 +---
 .../hooks/examples_and_usage.adoc                  |   4 +
 .../HealthCheckService/hooks/implementation.adoc   |  28 ++
 .../implementation.adoc => HintIdProvider.adoc}    |   7 +-
 .../hooks/examples_and_usage.adoc}                 |  31 +-
 .../pages/HintIdProvider/hooks/implementation.adoc |   0
 .../adoc/modules/applib-svc/pages/HintStore.adoc   |  98 +----
 .../pages/HintStore/hooks/examples_and_usage.adoc  |  17 +-
 .../pages/HintStore/hooks/implementation.adoc      |   2 +
 .../applib-svc/pages/HomePageResolverService.adoc  |  30 +-
 .../hooks/examples_and_usage.adoc                  |   3 +
 .../hooks/implementation.adoc                      |   2 +
 .../Interaction/hooks/examples_and_usage.adoc      |  20 +
 .../hooks/implementation.adoc                      |   2 +
 .../applib-svc/pages/InteractionContext.adoc       | 168 +--------
 .../hooks/examples_and_usage.adoc                  |  17 +
 .../InteractionContext/hooks/implementation.adoc   |   3 +
 .../partials/_presentation-layer-spi.adoc          |   4 +
 .../org/apache/isis/applib/annotation/Action.java  |   2 +-
 .../apache/isis/applib/annotation/Property.java    |   3 +-
 .../apache/isis/applib/annotation/Publishing.java  |  11 +-
 .../isis/applib/services/command/Command.java      |  11 +-
 .../isis/applib/services/exceprecog/Category.java  |   8 +
 .../exceprecog/ExceptionRecognizerService.java     |   3 +-
 .../applib/services/exceprecog/Recognition.java    |   4 +-
 .../applib/services/grid/GridSystemService.java    | 102 ++++-
 .../applib/services/health/HealthCheckService.java |  16 +
 .../isis/applib/services/hint/HintIdProvider.java  |  27 ++
 .../isis/applib/services/hint/HintStore.java       |  65 +++-
 .../services/homepage/HomePageResolverService.java |   3 +-
 .../applib/services/iactn/ActionInvocation.java    |  30 ++
 .../isis/applib/services/iactn/Execution.java      | 342 +++++++++++++++++
 .../applib/services/iactn/ExecutionContext.java    |  54 +--
 .../isis/applib/services/iactn/Interaction.java    | 417 ++-------------------
 .../applib/services/iactn/InteractionContext.java  |  18 +-
 .../isis/applib/services/iactn/PropertyEdit.java   |  29 ++
 .../isis/applib/services/iactn/Sequence.java       |  36 ++
 .../services/publishing/log/ExecutionLogger.java   |   8 +-
 .../publishing/spi/ExecutionSubscriber.java        |  10 +-
 .../applib/util/schema/InteractionDtoUtils.java    |  29 +-
 .../apache/isis/core/config/IsisConfiguration.java |  42 +--
 .../IsisBeanFactoryPostProcessorForSpring.java     |   5 +
 .../isis/core/config/beans/aoppatch/AopPatch.java  | 103 +++++
 .../aoppatch/TransactionInterceptorFactory.java    |  16 +-
 .../core/interaction/session/IsisInteraction.java  |   8 +-
 core/jdk-supplemental/pom.xml                      |   2 +-
 .../metamodel/execution/InternalInteraction.java   |  13 +-
 .../metamodel/execution/MemberExecutorService.java |  32 +-
 ...ctionInvocationFacetForDomainEventAbstract.java |  48 +--
 .../execution/ExecutionPublishingFacet.java        |  17 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java |  16 +-
 .../services/publishing/ExecutionPublisher.java    |   6 +-
 .../IsisModuleCoreRuntimeServices.java             |  12 +-
 .../command/CommandExecutorServiceDefault.java     |  12 +-
 .../executor/MemberExecutorServiceDefault.java     |  14 +-
 .../InteractionDtoServiceInternalDefault.java      |  11 +-
 .../publish/ExecutionPublisherDefault.java         |  24 +-
 .../ExceptionRecognizerForDataAccessException.java | 113 ++++--
 .../ExceptionRecognizerForDataAlreadyExists.java   |  57 ---
 .../impl/ExceptionRecognizerForObjectNotFound.java |  52 ---
 ...ceptionRecognizerForOtherDataAccessProblem.java |  82 ----
 .../ExceptionRecognizerForRelatedDataExists.java   |  52 ---
 .../ExceptionRecognizerForUnableToSaveData.java    |  52 ---
 .../transaction/TransactionServiceSpring.java      |  66 ++--
 ...eptionRecognizerForDataAccessExceptionTest.java |  90 ++---
 .../changetracking/ChangingEntitiesFactory.java    |  37 +-
 mappings/jaxrsclient/impl/pom.xml                  |   2 +-
 .../jdo/datanucleus/IsisModuleJdoDatanucleus.java  |  47 ++-
 .../jdo/datanucleus/dialect/DnJdoDialect.java      |  50 ++-
 .../metamodel/facets/entity/JdoEntityFacet.java    |   1 -
 persistence/jdo/spring/README.adoc                 |   2 +-
 .../jpa/eclipselink/IsisModuleJpaEclipselink.java  | 129 ++++++-
 .../isis/testdomain/jdo/JdoInventoryDao.java       |  55 +++
 .../isis/testdomain/jpa/JpaInventoryDao.java       |  55 +++
 .../jdo/JdoExceptionTranslationTest.java           |  12 +-
 ...xceptionTranslationTest_usingTransactional.java |  86 ++---
 .../persistence/jdo/_JdoExceptionTranslator.java   |  69 ++++
 .../testdomain/persistence/jdo/_TestFixtures.java  |   2 +-
 .../jpa/JpaExceptionTranslationTest.java           |  12 +-
 ...xceptionTranslationTest_usingTransactional.java |  70 ++--
 .../persistence/jpa/_JpaExceptionTranslator.java   |  51 +++
 .../testdomain/persistence/jpa/_TestFixtures.java  |   2 +-
 stty.exe.stackdump                                 |  11 -
 .../viewer/services/mementos/ObjectMementoWkt.java |  48 +--
 95 files changed, 1939 insertions(+), 1635 deletions(-)
 create mode 100644 api/applib/src/main/adoc/modules/applib-svc/pages/Execution/hooks/examples_and_usage.adoc
 copy api/applib/src/main/adoc/modules/applib-svc/pages/{HealthCheckService => Execution}/hooks/implementation.adoc (53%)
 copy api/applib/src/main/adoc/modules/applib-svc/pages/{HealthCheckService/hooks/implementation.adoc => HintIdProvider.adoc} (77%)
 copy api/applib/src/main/adoc/modules/applib-svc/pages/{GridLoaderService.adoc => HintIdProvider/hooks/examples_and_usage.adoc} (54%)
 copy core/config/src/main/adoc/modules/config/pages/section-hooks/resteasy~post.adoc => api/applib/src/main/adoc/modules/applib-svc/pages/HintIdProvider/hooks/implementation.adoc (100%)
 create mode 100644 api/applib/src/main/adoc/modules/applib-svc/pages/Interaction/hooks/examples_and_usage.adoc
 copy api/applib/src/main/adoc/modules/applib-svc/pages/{HealthCheckService => Interaction}/hooks/implementation.adoc (96%)
 create mode 100644 api/applib/src/main/java/org/apache/isis/applib/services/hint/HintIdProvider.java
 create mode 100644 api/applib/src/main/java/org/apache/isis/applib/services/iactn/ActionInvocation.java
 create mode 100644 api/applib/src/main/java/org/apache/isis/applib/services/iactn/Execution.java
 create mode 100644 api/applib/src/main/java/org/apache/isis/applib/services/iactn/PropertyEdit.java
 create mode 100644 api/applib/src/main/java/org/apache/isis/applib/services/iactn/Sequence.java
 create mode 100644 core/config/src/main/java/org/apache/isis/core/config/beans/aoppatch/AopPatch.java
 copy api/applib/src/main/java/org/apache/isis/applib/services/health/HealthCheckService.java => core/config/src/main/java/org/apache/isis/core/config/beans/aoppatch/TransactionInterceptorFactory.java (76%)
 delete mode 100644 core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/recognizer/dae/impl/ExceptionRecognizerForDataAlreadyExists.java
 delete mode 100644 core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/recognizer/dae/impl/ExceptionRecognizerForObjectNotFound.java
 delete mode 100644 core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/recognizer/dae/impl/ExceptionRecognizerForOtherDataAccessProblem.java
 delete mode 100644 core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/recognizer/dae/impl/ExceptionRecognizerForRelatedDataExists.java
 delete mode 100644 core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/recognizer/dae/impl/ExceptionRecognizerForUnableToSaveData.java
 create mode 100644 regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryDao.java
 create mode 100644 regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryDao.java
 create mode 100644 regressiontests/stable/src/test/java/org/apache/isis/testdomain/persistence/jdo/_JdoExceptionTranslator.java
 create mode 100644 regressiontests/stable/src/test/java/org/apache/isis/testdomain/persistence/jpa/_JpaExceptionTranslator.java
 delete mode 100644 stty.exe.stackdump


[isis] 01/02: ISIS-2444: docs for more services

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

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

commit 413fbacac6d3631e9bcc025f43a4c8cf6a19f367
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Feb 13 06:49:28 2021 +0000

    ISIS-2444: docs for more services
---
 .../pages/ExceptionRecognizerService.adoc          |   2 +-
 .../applib-svc/pages/ExecutionSubscriber.adoc      |   2 +-
 .../modules/applib-svc/pages/FactoryService.adoc   |   2 +-
 .../applib-svc/pages/GridLoaderService.adoc        |   8 +-
 .../hooks/examples_and_usage.adoc                  |   6 ++
 .../applib-svc/pages/GridSystemService.adoc        |  70 +-------------
 .../hooks/examples_and_usage.adoc                  |  12 ++-
 .../GridSystemService/hooks/implementation.adoc    |   4 +
 .../applib-svc/pages/HealthCheckService.adoc       |  64 +------------
 .../hooks/examples_and_usage.adoc                  |   4 +
 .../HealthCheckService/hooks/implementation.adoc   |  28 ++++++
 .../implementation.adoc => HintIdProvider.adoc}    |   7 +-
 .../hooks/examples_and_usage.adoc}                 |  27 ++++--
 .../hooks/implementation.adoc}                     |   0
 .../adoc/modules/applib-svc/pages/HintStore.adoc   |  98 +-------------------
 .../pages/HintStore/hooks/examples_and_usage.adoc  |  17 +++-
 .../pages/HintStore/hooks/implementation.adoc      |   2 +
 .../applib-svc/pages/HomePageResolverService.adoc  |  30 +-----
 .../hooks/examples_and_usage.adoc                  |   3 +
 .../hooks/implementation.adoc                      |   2 +
 .../partials/_presentation-layer-spi.adoc          |   4 +
 .../exceprecog/ExceptionRecognizerService.java     |   3 +-
 .../applib/services/grid/GridSystemService.java    | 102 ++++++++++++++++++++-
 .../applib/services/health/HealthCheckService.java |  16 ++++
 .../isis/applib/services/hint/HintIdProvider.java  |  27 ++++++
 .../isis/applib/services/hint/HintStore.java       |  65 ++++++++++++-
 .../services/homepage/HomePageResolverService.java |   3 +-
 .../viewer/services/mementos/ObjectMementoWkt.java |  48 +++++-----
 28 files changed, 353 insertions(+), 303 deletions(-)

diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/ExceptionRecognizerService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/ExceptionRecognizerService.adoc
index b7bb04d..7b6c2d1 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/ExceptionRecognizerService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/ExceptionRecognizerService.adoc
@@ -5,7 +5,7 @@
 
 
 
-include::system:generated:page$index/applib/services/exceprecog/ExceptionRecognizerService.adoc[leveloffset=+2]
+include::system:generated:page$index/applib/services/exceprecog/ExceptionRecognizerService.adoc[]
 
 include::ExceptionRecognizerService/hooks/implementation.adoc[]
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/ExecutionSubscriber.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/ExecutionSubscriber.adoc
index 42d5526..4e295c0 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/ExecutionSubscriber.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/ExecutionSubscriber.adoc
@@ -5,7 +5,7 @@
 
 
 
-include::system:generated:page$index/applib/services/publishing/spi/ExecutionSubscriber.adoc[leveloffset=+2]
+include::system:generated:page$index/applib/services/publishing/spi/ExecutionSubscriber.adoc[]
 
 include::ExecutionSubscriber/hooks/implementation.adoc[]
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/FactoryService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/FactoryService.adoc
index 5a18b9d..fd7e162 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/FactoryService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/FactoryService.adoc
@@ -5,7 +5,7 @@
 
 
 
-include::system:generated:page$index/applib/services/factory/FactoryService.adoc[leveloffset=+2]
+include::system:generated:page$index/applib/services/factory/FactoryService.adoc[]
 
 include::FactoryService/hooks/implementation.adoc[]
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/GridLoaderService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/GridLoaderService.adoc
index b71e46a..e76f84a 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/GridLoaderService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/GridLoaderService.adoc
@@ -4,15 +4,9 @@
 :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 [...]
 
 
-include::system:generated:page$index/applib/services/grid/GridLoaderService.adoc[leveloffset=+2]
+include::system:generated:page$index/applib/services/grid/GridLoaderService.adoc[]
 
 include::GridLoaderService/hooks/implementation.adoc[]
 
 include::GridLoaderService/hooks/examples_and_usage.adoc[]
 
-== Related Services
-
-See also:
-
-* xref:system:generated:index/applib/services/grid/GridService.adoc[GridService]
-* xref:system:generated:index/applib/services/grid/GridLoaderService.adoc[GridLoaderService]
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/GridLoaderService/hooks/examples_and_usage.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/GridLoaderService/hooks/examples_and_usage.adoc
index 21f4ba4..46ed3c2 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/GridLoaderService/hooks/examples_and_usage.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/GridLoaderService/hooks/examples_and_usage.adoc
@@ -2,3 +2,9 @@
 :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 [...]
 
 
+== See also
+
+Related services:
+
+* xref:system:generated:index/applib/services/grid/GridService.adoc[GridService]
+* xref:system:generated:index/applib/services/grid/GridLoaderService.adoc[GridLoaderService]
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService.adoc
index 91ceccf..631904e 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService.adoc
@@ -4,74 +4,10 @@
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 
 
-WARNING: TODO: this content has not yet been reviewed/updated for v2.0
+include::system:generated:page$index/applib/services/grid/GridSystemService.adoc[]
 
+include::GridSystemService/hooks/implementation.adoc[]
 
-The `GridSystemService` encapsulates a single layout grid system which can be used to customize the layout
-of domain objects.  In particular this means being able to return a "normalized" form (validating and associating
-domain object members into the various regions of the grid) and in providing a default grid if there is no other
-metadata available.
+include::GridSystemService/hooks/examples_and_usage.adoc[]
 
-The framework provides a single such grid implementation, namely for Bootstrap3.
 
-[NOTE]
-====
-Unlike most other domain services, the framework will check _all_ available implementations of `GridSystemService` to obtain available grid systems, rather than merely the first implementation found; in other words it uses the chain-of-responsibility pattern.
-Services are called in the order defined by the Spring link:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/Order.html[`@Order`] annotation).
-
-Note though that each concrete implementation must also provide corresponding Wicket viewer components capable of interpreting the grid layout.
-====
-
-
-== API
-
-include::system:generated:page$index/applib/services/grid/GridSystemService.adoc[leveloffset=+2]
-
-TODO example migration
-
-.Deprecated Docs
-[WARNING]
-================================
-
-== SPI
-
-The SPI defined by this service is:
-
-[source,java]
-----
-include::refguide:applib-svc:example$services/grid/GridSystemService.java[tags="refguide"]
-----
-<.> The concrete subclass of `Grid` supported by this implementation.
-As noted in the introduction, there can be multiple implementations of this service,  but there can only be one implementation per concrete subclass.
-As is normal practice, these are ordered as per the Spring link:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/Order.html[`@Order`] or equivalent annotation.
-
-<.> the target namespace for this grid system.  This is used when generating the XML.  The Bootstrap3 grid system provided by the framework returns the value `http://isis.apache.org/applib/layout/grid/bootstrap3`.
-
-<.> the schema location for the XSD.  The Bootstrap3 grid system provided by the framework returns the value `http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd`.
-
-<.> a default grid, eg two columns in ratio 4:8.  Used when no existing grid layout exists for a domain class.
-
-<.> Validates and normalizes a grid, modifying the grid so that all of the domain object's members (properties, collections, actions) are bound to regions of the grid.  This is done using existing metadata, most notably that of the xref:refguide:applib-ant:MemberOrder.adoc[`@MemberOrder`] annotation.
-Such a grid, if persisted as the layout XML file for the domain class, allows the
- `@MemberOrder` annotation to be removed from the source code of the domain class (but other annotations must be retained).
-
-<.> Takes a normalized grid and enriches it with additional metadata (taken from Apache Isis' internal metadata) that can be represented in the layout XML.
-Such a grid, if persisted as the layout XML file for the domain class, allows all layout annotations (xref:refguide:applib-ant:ActionLayout.adoc[`@ActionLayout`], xref:refguide:applib-ant:PropertyLayout.adoc[`@PropertyLayout`] and xref:refguide:applib-ant:CollectionLayout.adoc[`@CollectionLayout`]) to be removed from the source code of the domain class.
-
-<.> Takes a normalized grid and strips out removes all members, leaving only the grid structure.
-Such a grid, if persisted as the layout XML file for the domain class, requires that the xref:refguide:applib-ant:MemberOrder.adoc[`@MemberOrder`] annotation is retained in the source code of said class in order to bind members to the regions of the grid.
-
-
-
-================================
-
-== Implementation
-
-The framework provides `GridSystemServiceBS3`, an implementation that encodes the bootstrap3 grid system.
-(The framework also provides xref:vw:ROOT:about.adoc[Wicket viewer] components that are capable of interpreting and rendering this metadata).
-
-
-
-== Related Services
-
-This service is used by xref:refguide:applib-svc:GridService.adoc[`GridService`].
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService/hooks/examples_and_usage.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService/hooks/examples_and_usage.adoc
index 21f4ba4..efc6deb 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService/hooks/examples_and_usage.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService/hooks/examples_and_usage.adoc
@@ -1,4 +1,14 @@
-
 :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 [...]
 
 
+== Usage Notes
+
+The framework will check _all_ available implementations of `GridSystemService` to obtain available grid systems, rather than merely the first implementation found, to determine if a grid is available for the domain object to be rendered; in other words it uses the link:https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern[chain-of-responsibility] pattern.
+Services are called in the order defined by the Spring link:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/Order.html[`@Order`] annotation).
+
+Note though that each concrete implementation must also provide corresponding Wicket viewer components capable of interpreting the grid layout.
+This is therefore a highly specialized and very deep customisation of the framework.
+
+== See also
+
+This service is used by xref:refguide:applib-svc:GridService.adoc[`GridService`].
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService/hooks/implementation.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService/hooks/implementation.adoc
index 697f559..c5ac13b 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService/hooks/implementation.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/GridSystemService/hooks/implementation.adoc
@@ -4,3 +4,7 @@
 
 
 == Implementation
+
+The framework provides a single grid implementation, `o.a.i.core.metamodel.services.grid.bootstrap3.GridSystemServiceBS3`, which supports Bootstrap3.
+
+(The framework also provides xref:vw:ROOT:about.adoc[Wicket viewer] components that are capable of interpreting and rendering this metadata.
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService.adoc
index ff7489e..21832bf 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService.adoc
@@ -5,69 +5,11 @@
 
 
 
-This SPI service integrates with Spring Boot's link:https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/actuate/health/HealthIndicator.html[HealthIndicator] SPI, surfaced through the link:https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html[Spring Boot Actuator].
+include::system:generated:page$index/applib/services/health/HealthCheckService.adoc[]
 
-This is accessible from the `/actuator/health` endpoint.
+include::HealthCheckService/hooks/implementation.adoc[]
 
-The service, when called, will be within the context of a special internal user `__health` with the internal role `__health-role`.
+include::HealthCheckService/hooks/examples_and_usage.adoc[]
 
-This service was introduced to allow deployment infrastructure to monitor the app and (potentially) restart it if required.
-For example, if deploying to Docker then both Docker Swarm and Kubernetes are orchestrators that can perform this task.
 
 
-== API
-
-include::system:generated:page$index/applib/services/health/HealthCheckService.adoc[leveloffset=+2]
-
-TODO example migration
-
-.Deprecated Docs
-[WARNING]
-================================
-
-== SPI
-
-The SPI defined by `HealthCheckService` is:
-
-[source,java]
-----
-include::refguide:applib-svc:example$services/health/HealthCheckService.java[tags="refguide"]
-----
-
-
-================================
-
-== Implementation
-
-The framework provides no default implementation, but the xref:docs:starters:simpleapp.adoc[simpleapp] starter app provides a sample implementation:
-
-[source,java]
-----
-@Service
-@Named("domainapp.HealthCheckServiceImpl")
-@Log4j2
-public class HealthCheckServiceImpl implements HealthCheckService {
-
-    private final SimpleObjects simpleObjects;
-
-    @Inject
-    public HealthCheckServiceImpl(SimpleObjects simpleObjects) {
-        this.simpleObjects = simpleObjects;
-    }
-
-    @Override
-    public Health check() {
-        try {
-            simpleObjects.ping();
-            return Health.ok();
-        } catch (Exception ex) {
-            return Health.error(ex);
-        }
-    }
-}
-----
-
-== Related Services
-
-The internal domain service `o.a.i.core.webapp.health.HealthIndicatorUsingHealthCheckService` acts as the bridge between Spring and the `HealthCheckService' SPI.
-
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/examples_and_usage.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/examples_and_usage.adoc
index 21f4ba4..a1eaee9 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/examples_and_usage.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/examples_and_usage.adoc
@@ -2,3 +2,7 @@
 :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 [...]
 
 
+== Related Services
+
+The internal domain service `o.a.i.core.webapp.health.HealthIndicatorUsingHealthCheckService` acts as the bridge between Spring and the `HealthCheckService' SPI.
+
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/implementation.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/implementation.adoc
index 697f559..22c3e54 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/implementation.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/implementation.adoc
@@ -4,3 +4,31 @@
 
 
 == Implementation
+
+The framework provides no default implementation, but the xref:docs:starters:simpleapp.adoc[simpleapp] starter app provides a link:https://github.com/apache/isis-app-simpleapp/blob/master/webapp/src/main/java/domainapp/webapp/application/services/health/HealthCheckServiceImpl.java[sample implementation]:
+
+[source,java]
+----
+@Service
+@Named("domainapp.HealthCheckServiceImpl")
+@Log4j2
+public class HealthCheckServiceImpl implements HealthCheckService {
+
+    private final SimpleObjects simpleObjects;
+
+    @Inject
+    public HealthCheckServiceImpl(SimpleObjects simpleObjects) {
+        this.simpleObjects = simpleObjects;
+    }
+
+    @Override
+    public Health check() {
+        try {
+            simpleObjects.ping();
+            return Health.ok();
+        } catch (Exception ex) {
+            return Health.error(ex);
+        }
+    }
+}
+----
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/implementation.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HintIdProvider.adoc
similarity index 77%
copy from api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/implementation.adoc
copy to api/applib/src/main/adoc/modules/applib-svc/pages/HintIdProvider.adoc
index 697f559..a4288d3 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HealthCheckService/hooks/implementation.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HintIdProvider.adoc
@@ -1,6 +1,11 @@
+[#HintIdProvider]
+= HintIdProvider
 
 :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 [...]
 
+include::system:generated:page$index/applib/services/hint/HintIdProvider.adoc[]
 
+include::HintIdProvider/hooks/implementation.adoc[]
+
+include::HintIdProvider/hooks/examples_and_usage.adoc[]
 
-== Implementation
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/ExecutionSubscriber.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HintIdProvider/hooks/examples_and_usage.adoc
similarity index 54%
copy from api/applib/src/main/adoc/modules/applib-svc/pages/ExecutionSubscriber.adoc
copy to api/applib/src/main/adoc/modules/applib-svc/pages/HintIdProvider/hooks/examples_and_usage.adoc
index 42d5526..975aaa8 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/ExecutionSubscriber.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HintIdProvider/hooks/examples_and_usage.adoc
@@ -1,14 +1,29 @@
-[#ExecutionSubscriber]
-= ExecutionSubscriber
-
 :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 [...]
 
+== Usage Example
+
+For example, suppose that there's a view model that wraps a `Customer` and its ``Order``s.
+For this view model the `Customer` represents the logical identity.
+This view model might therefore be implemented as follows:
 
+[source,java]
+----
+@XmlRootElement("customerAndOrders")
+@XmlAccessType(FIELD)
+public class CustomerAndOrders implements HintStore.HintIdProvider {
 
-include::system:generated:page$index/applib/services/publishing/spi/ExecutionSubscriber.adoc[leveloffset=+2]
+    @Getter @Setter
+    private Customer customer;
 
-include::ExecutionSubscriber/hooks/implementation.adoc[]
+    // ...
 
-include::ExecutionSubscriber/hooks/examples_and_usage.adoc[]
+    @Programmatic
+    public String hintId() {
+        bookmarkService.bookmarkFor(getCustomer()).toString();
+    }
 
+    @XmlTransient
+    @Inject BookmarkService bookmarkService;
+}
+----
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/examples_and_usage.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HintIdProvider/hooks/implementation.adoc
similarity index 100%
copy from api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/examples_and_usage.adoc
copy to api/applib/src/main/adoc/modules/applib-svc/pages/HintIdProvider/hooks/implementation.adoc
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore.adoc
index 2045329..3e25f42 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore.adoc
@@ -3,101 +3,9 @@
 
 :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 [...]
 
+include::system:generated:page$index/applib/services/hint/HintStore.adoc[]
 
-WARNING: TODO: this content has not yet been reviewed/updated for v2.0
+include::HintStore/hooks/implementation.adoc[]
 
-The `HintStore` service defines an SPI for the xref:vw:ROOT:about.adoc[Wicket viewer] to store UI hints on a per-object basis.
-For example, the viewer remembers which tabs are selected, and for collections which view is selected (eg table or hidden), which page of a table to render, or whether "show all" (rows) is toggled.
+include::HintStore/hooks/examples_and_usage.adoc[]
 
-The default implementation of this service uses the HTTP session.
-The service is an SPI because the amount of data stored could potentially be quite large (for large numbers of users who use the app all day).
-An SPI makes it easy to plug in an alternative implementation that is more sophisticated than the default (eg implementing MRU/LRU queue, or using a NoSQL database, or simply to disabling the functionality altogether).
-
-== API
-
-include::system:generated:page$index/applib/services/hint/HintStore.adoc[leveloffset=+2]
-
-TODO example migration
-
-.Deprecated Docs
-[WARNING]
-================================
-
-== SPI
-
-The SPI of `HintStore` is:
-
-[source,java]
-----
-include::refguide:applib-svc:example$services/hint/HintStore.java[tags="refguide"]
-----
-
-<.> obtain a hint (eg which tab to open) for a particular object.
-Object identity is represented by `Bookmark`, as per the xref:refguide:applib-svc:BookmarkService.adoc[`BookmarkService`], so that alternative implementations can easily serialize this state to a string.
-<.> set the state of a hint.
-(The value of) all hints are represented as strings.
-<.> remove a single hint for an object; <.> remove all hints <.> obtain all known hints for an object
-
-
-================================
-
-== Implementation
-
-The core framework provides a default implementation of this service (`org.apache.isis.viewer.wicket.viewer.services.HintStoreUsingWicketSession`).
-
-== API
-
-include::system:generated:page$index/applib/services/hint/HintStore.adoc[leveloffset=+2]
-
-TODO example migration
-
-.Deprecated Docs
-[WARNING]
-================================
-
-== View models
-
-Hints are stored against the `Bookmark` of a domain object, essentially the identifier of the domain object.
-For a domain entity this identifier is fixed and unchanging but for a view models the identifier changes each time the view model's state changes (the identifier is basically a digest of the object's state).
-This means that any hints stored against the view model's bookmark are in effect lost as soon as the view model is modified.
-
-To address this issue the `HintStore` provides an optional interface that the view model can implement, the intent of which is to expose the "logical" identity of the view model.
-This interface is:
-
-[source,java]
-----
-include::refguide:applib-svc:example$services/hint/HintStore.java[tags="refguide-1",indent=0]
-----
-
-For example, suppose that there's a view model that wraps a `Customer` and its ``Order``s.
-For this the `Customer` represents the logical identity.
-This view model might therefore be implemented as follows:
-
-[source,java]
-----
-@XmlRootElement("customerAndOrders")
-@XmlAccessType(FIELD)
-public class CustomerAndOrders implements HintStore.HintIdProvider {
-
-    @Getter @Setter
-    private Customer customer;
-
-    ...
-
-    @Programmatic
-    public String hintId() {
-        bookmarkService.bookmarkFor(getCustomer()).toString();
-    }
-
-    @XmlTransient
-    @Inject BookmarkService bookmarkService;
-}
-----
-
-
-================================
-
-== Related Services
-
-The xref:vw:ROOT:about.adoc[Wicket viewer] exposes the xref:applib-classes:about.adoc#clearHints["clear hints"]
-mixin action that is for use by end-users of the application to clear any UI hints that have accumulated for a domain object.
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore/hooks/examples_and_usage.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore/hooks/examples_and_usage.adoc
index 21f4ba4..b139286 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore/hooks/examples_and_usage.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore/hooks/examples_and_usage.adoc
@@ -1,4 +1,19 @@
-
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 
+[WARNING]
+====
+The default implementation of this service uses the HTTP session.
+As the amount of data stored could potentially be quite large (for large numbers of users who use the app all day), it does in effect constitute a memory leak.
+
+An alternative implementation might be more sophisticated (eg implementing an MRU/LRU queue, or using a NoSQL database to store the hints, or simply to disable the functionality altogether).
+====
+
+
+== See Also
+
+* The xref:vw:ROOT:about.adoc[Wicket viewer] exposes theclear hints"mixin action
+(`o.a.i.viewer.wicket.viewer.mixins.Object_clearHints`)
+that is for use by end-users of the application to clear any UI hints that have accumulated for a domain object.
+
+* Mutable view models should implement the xref:HintIdProvider.adoc[] interface in order for hints to work.
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore/hooks/implementation.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore/hooks/implementation.adoc
index 697f559..742adb5 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore/hooks/implementation.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HintStore/hooks/implementation.adoc
@@ -4,3 +4,5 @@
 
 
 == Implementation
+
+The core framework provides a default implementation of this service (`o.a.i.viewer.wicket.viewer.services.HintStoreUsingWicketSession`).
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService.adoc
index a563b20..8a5d0d7 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService.adoc
@@ -4,35 +4,11 @@
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 
 
+include::system:generated:page$index/applib/services/homepage/HomePageResolverService.adoc[]
 
+include::HomePageResolverService/hooks/implementation.adoc[]
 
-This service simply provides access to the home page object (if any) annotated with xref:refguide:applib-ant:HomePage.adoc[`@HomePage`].
+include::HomePageResolverService/hooks/examples_and_usage.adoc[]
 
-It was originally introduced to support the default implementation of xref:refguide:applib-svc:RoutingService.adoc[`RoutingService`], but was factored out to support alternative implementations of that service (and may be useful for other use cases).
 
-== API
-
-include::system:generated:page$index/applib/services/homepage/HomePageResolverService.adoc[leveloffset=+2]
-
-TODO example migration
-
-.Deprecated Docs
-[WARNING]
-================================
-
-== API
-
-The API defined by `HomePageResolverService` is:
-
-[source,java]
-----
-include::refguide:applib-svc:example$services/homepage/HomePageResolverService.java[tags="refguide"]
-----
-
-
-================================
-
-== Implementation
-
-The default implementation is provided by `o.a.i.core.runtimeservices.homepage.HomePageResolverServiceDefault`.
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/examples_and_usage.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/examples_and_usage.adoc
index 21f4ba4..40c2d3f 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/examples_and_usage.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/examples_and_usage.adoc
@@ -2,3 +2,6 @@
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 
 
+== Notes
+
+This service was originally introduced to support the default implementation of xref:refguide:applib-svc:RoutingService.adoc[`RoutingService`], but was factored out to support alternative implementations of that service (and may be useful for other use cases).
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/implementation.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/implementation.adoc
index 697f559..f792826 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/implementation.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/HomePageResolverService/hooks/implementation.adoc
@@ -4,3 +4,5 @@
 
 
 == Implementation
+
+The default implementation is provided by `o.a.i.core.runtimeservices.homepage.HomePageResolverServiceDefault`.
diff --git a/api/applib/src/main/adoc/modules/applib-svc/partials/_presentation-layer-spi.adoc b/api/applib/src/main/adoc/modules/applib-svc/partials/_presentation-layer-spi.adoc
index f82bc3f..109988b 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/partials/_presentation-layer-spi.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/partials/_presentation-layer-spi.adoc
@@ -38,6 +38,10 @@ The framework will call all available implementations until a mapping is made (c
 
 
 
+|xref:refguide:applib-svc:HintStore.adoc[HintIdProvider]
+|Provide a "logical" identity for view models such that UI hints can be stored for them.
+
+
 |xref:refguide:applib-svc:HintStore.adoc[HintStore]
 |Stores UI hints on a per-object basis.
 For example, the viewer remembers which tabs are selected, and for collections which view is selected (eg table or hidden), which page of a table to render, or whether "show all" (rows) is toggled.
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerService.java b/api/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerService.java
index e9e2e5e..41226d2 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerService.java
@@ -31,7 +31,8 @@ import org.apache.isis.commons.collections.Can;
 public interface ExceptionRecognizerService {
 
     /**
-     *
+     * All ExceptionRecognizer implementations as discovered by the IoC
+     * container,  honoring order of precedence.
      * @return all ExceptionRecognizer implementations as discovered by the IoC container,
      * honoring order of precedence.
      */
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/grid/GridSystemService.java b/api/applib/src/main/java/org/apache/isis/applib/services/grid/GridSystemService.java
index d5dc6c2..613e22c 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/grid/GridSystemService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/grid/GridSystemService.java
@@ -21,31 +21,125 @@ package org.apache.isis.applib.services.grid;
 import org.apache.isis.applib.layout.grid.Grid;
 
 /**
- * Provides an implementation of {@link Grid}.
+ *
+ * Encapsulates a single layout grid system which can be used to customize the layout
+ * of domain objects.
+ *
+ * <p>
+ * In particular this means being able to return a "normalized" form
+ * (validating and associating domain object members into the various regions
+ * of the grid) and in providing a default grid if there is no other metadata
+ * available.
+ * </p>
  *
  * @since 1.x {@index}
  */
 public interface GridSystemService<G extends Grid> {
 
+
+
+
     /**
-     * Which grid (implementation) is defined by this service.
+     * The concrete subclass of {@link Grid} supported by this implementation.
+     *
+     * <p>
+     *     There can be multiple implementations of this service, this indicates
+     *     the base class used by the implementation.
+     * </p>
      */
     Class<G> gridImplementation();
 
+    /**
+     * The target namespace for this grid system.
+     *
+     * <p>
+     *     This is used when generating the XML.  The Bootstrap3 grid system
+     *     provided by the framework returns the value
+     *     `http://isis.apache.org/applib/layout/grid/bootstrap3`.
+     * </p>
+     */
     String tns();
 
+    /**
+     * The schema location for the XSD.
+     *
+     * <p>
+     *     Every grid system is expected to provide a schema XSD in order to
+     *     provide code completion in an IDE. The Bootstrap3 grid system
+     *     provided by the framework returns the value
+     *     `http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd`.
+     * </p>
+     *
+     * @return
+     */
     String schemaLocation();
 
+    /**
+     * A default grid, used when no grid layout can be found for the domain
+     * class.
+     *
+     * <p>
+     *     For example, this layout could define two columns in ratio 4:8.
+     * </p>
+     *
+     * @param domainClass
+     * @return
+     */
     G defaultGrid(Class<?> domainClass);
 
     /**
-     * Validate the grid, derive any missing object members, and overwrite any facets in the metamodel based on the
-     * layout.
+     * Validates and normalizes a grid, modifying the grid so that all of the
+     * domain object's members (properties, collections, actions) are bound to
+     * regions of the grid.
+     *
+     * <p>
+     * This is done using existing metadata, most notably that of the
+     * {@link org.apache.isis.applib.annotation.MemberOrder} annotation.
+     * Such a grid, if persisted as the layout XML file for the domain class,
+     * allows the {@link org.apache.isis.applib.annotation.MemberOrder}
+     * annotation to be removed from the source code of the domain class
+     * (but other annotations must be retained).
+     * </p>
      */
     void normalize(G grid, Class<?> domainClass);
 
+    /**
+     * Takes a normalized grid and enriches it with all the available metadata
+     * (taken from Apache Isis' internal metadata) that can be represented in
+     * the layout XML.
+     *
+     * <p>
+     * Such a grid, if persisted as the layout XML file for the domain class,
+     * allows all layout annotations
+     * ({@link org.apache.isis.applib.annotation.ActionLayout},
+     * {@link org.apache.isis.applib.annotation.PropertyLayout},
+     * {@link org.apache.isis.applib.annotation.CollectionLayout}) to be
+     * removed from the source code of the domain class.
+     *
+     * </p>
+     * @param grid
+     * @param domainClass
+     */
     void complete(G grid, Class<?> domainClass);
 
+    /**
+     * Takes a normalized grid and strips out removes all members, leaving only
+     * the grid structure.
+     *
+     * <p>
+     *     Such a grid, if persisted as the layout XML file for the domain
+     *     class, requires that the
+     *     {@link org.apache.isis.applib.annotation.MemberOrder} annotation
+     *     is retained in the source code of said class in order to bind
+     *     members to the regions of the grid.
+     * </p>
+     *
+     * @param grid
+     * @param domainClass
+     */
     void minimal(G grid, Class<?> domainClass);
 
+
+
+
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/health/HealthCheckService.java b/api/applib/src/main/java/org/apache/isis/applib/services/health/HealthCheckService.java
index 8ae9b89..34cb3ac 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/health/HealthCheckService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/health/HealthCheckService.java
@@ -19,6 +19,22 @@
 package org.apache.isis.applib.services.health;
 
 /**
+ * This SPI service allow runtime infrastructure such as Kubernetes or Docker
+ * Swarm to monitor the app and (potentially) restart it if required.
+ *
+ * <p>
+ * This SPI service integrates with Spring Boot's
+ * <a href="https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/actuate/health/HealthIndicator.html">HealthIndicator</a>
+ * SPI, surfaced through the
+ * <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html">Spring Boot Actuator</a>.
+ * It is therefore accessible from the <code>/actuator/health</code> endpoint
+ * (Spring allows the endpoint URL to be altered or suppressed).
+ * </p>
+ *
+ * <p>
+ * The service, when called, will be within the context of a special internal
+ * user <i>__health</i> with the internal role <i>__health-role</i>.
+ * </p>
  *
  * @since 2.0 {@index}
  */
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/hint/HintIdProvider.java b/api/applib/src/main/java/org/apache/isis/applib/services/hint/HintIdProvider.java
new file mode 100644
index 0000000..cbe6815
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/hint/HintIdProvider.java
@@ -0,0 +1,27 @@
+package org.apache.isis.applib.services.hint;
+
+/**
+ * Provides an SPI for view models to implement to represent
+ * their "logical" identity (stable even if the view model's state changes).
+ *
+ * <p>
+ *     Hints are stored against the `Bookmark` of a domain object, essentially
+ *     the identifier of the domain object. For a domain entity this identifier
+ *     is fixed and unchanging but for view models the identifier changes each
+ *     time the view model's state changes (the identifier is basically a
+ *     digest of the object's state).
+ *     This means that any hints stored against the view model's bookmark are
+ *     in effect lost as soon as the view model is modified.
+ * </p>
+ *
+ * <p>
+ *     This SPI therefore allows a view model to take advantage of the hinting
+ *     mechanism of the viewer by providing a "logical" identity stored which
+ *     hints for the view model can be stored.
+ * </p>
+ *
+ * @since 1.x {@index}
+ */
+public interface HintIdProvider {
+    String hintId();
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/hint/HintStore.java b/api/applib/src/main/java/org/apache/isis/applib/services/hint/HintStore.java
index 3a7b774..a76cca7 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/hint/HintStore.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/hint/HintStore.java
@@ -23,22 +23,79 @@ import java.util.Set;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 
 /**
+ * Defines a mechanism for viewers to store arbitrary UI hints on a per-object
+ * basis.
+ *
+ * <p>
+ * This store <i>is</i> used by the Wicket viewer.   For example, the viewer
+ * remembers which tabs are selected, and for collections which view is
+ * selected (eg table or hidden), which page of a table to render, or whether
+ * "show all" (rows) is toggled.
+ * </p>
+ *
  * @since 1.x {@index}
  */
 public interface HintStore {
 
-    interface HintIdProvider {
-        String hintId();
-    }
-
+    /**
+     * Obtain a hint (eg which tab to open) for a particular object.
+     *
+     * <p>
+     * Object identity is represented by {@link Bookmark} so that alternative
+     * implementations can easily serialize this state to a string.
+     * </p>
+     *
+     * @apiNote Object identity is represented by {@link Bookmark} so that
+     *          alternative implementations can easily serialize this state to a string.
+     *
+     * @param bookmark - representing the domain object
+     * @param hintKey - the key of the hint
+     *
+     * @return - the value of the hint, or null.
+     */
     String get(final Bookmark bookmark, String hintKey);
 
+    /**
+     * Set the state of a hint for the domain object
+     *
+     * @apiNote Object identity is represented by {@link Bookmark} so that
+     *          alternative implementations can easily serialize this state to a string.
+     *
+     * @param bookmark - representing the domain object
+     * @param hintKey - the key of the hint
+     * @param value - the value of the hint
+     */
     void set(final Bookmark bookmark, String hintKey, String value);
 
+    /**
+     * Removes hint for the domain object.
+     *
+     * @apiNote Object identity is represented by {@link Bookmark} so that
+     *          alternative implementations can easily serialize this state to a string.
+     *
+     * @param bookmark - representing the domain object
+     * @param hintKey - the key of the hint
+     */
     void remove(final Bookmark bookmark, String hintKey);
 
+    /**
+     * Remotes all hints for the domain object.
+     *
+     * @apiNote Object identity is represented by {@link Bookmark} so that
+     *          alternative implementations can easily serialize this state to a string.
+     *
+     * @param bookmark - representing the domain object
+     */
     void removeAll(Bookmark bookmark);
 
+    /**
+     * The keys of all available hints for the domain object.
+     *
+     * @apiNote Object identity is represented by {@link Bookmark} so that
+     *          alternative implementations can easily serialize this state to a string.
+     *
+     * @param bookmark - representing the domain object
+     */
     Set<String> findHintKeys(Bookmark bookmark);
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/homepage/HomePageResolverService.java b/api/applib/src/main/java/org/apache/isis/applib/services/homepage/HomePageResolverService.java
index 2125bba..9c982fa 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/homepage/HomePageResolverService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/homepage/HomePageResolverService.java
@@ -21,7 +21,8 @@ package org.apache.isis.applib.services.homepage;
 import org.apache.isis.applib.annotation.HomePage;
 
 /**
- * Returns a view model annotated with {@link HomePage}.
+ * This service simply provides access to the home page object (if any)
+ * annotated with {@link HomePage}.
  *
  * @since 2.0 {@index}
  */
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoWkt.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoWkt.java
index 96bcefb..6ad0084 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoWkt.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoWkt.java
@@ -27,7 +27,7 @@ import java.util.Objects;
 import java.util.function.Function;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.hint.HintStore;
+import org.apache.isis.applib.services.hint.HintIdProvider;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -68,7 +68,7 @@ final class ObjectMementoWkt implements Serializable {
      * Factory method
      */
     static ObjectMementoWkt createPersistent(
-            RootOid rootOid, 
+            RootOid rootOid,
             SpecificationLoader specificationLoader) {
 
         return new ObjectMementoWkt(rootOid, specificationLoader);
@@ -186,10 +186,10 @@ final class ObjectMementoWkt implements Serializable {
 
             @Override
             public boolean equals(
-                    ObjectMementoWkt memento, 
+                    ObjectMementoWkt memento,
                     ObjectMementoWkt otherMemento) {
 
-                return otherMemento.recreateStrategy == ENCODEABLE && 
+                return otherMemento.recreateStrategy == ENCODEABLE &&
                         memento.encodableValue.equals(otherMemento.encodableValue);
             }
 
@@ -222,7 +222,7 @@ final class ObjectMementoWkt implements Serializable {
                 if(_NullSafe.isEmpty(memento.persistentOidStr)) {
                     throw _Exceptions.illegalArgument("need an id to lookup an object specId=%s", memento.objectSpecId);
                 }
-                
+
                 RootOid rootOid = Oid.unmarshaller().unmarshal(memento.persistentOidStr, RootOid.class);
                 try {
 
@@ -253,7 +253,7 @@ final class ObjectMementoWkt implements Serializable {
 
             @Override
             public boolean equals(ObjectMementoWkt oam, ObjectMementoWkt other) {
-                return other.recreateStrategy == LOOKUP 
+                return other.recreateStrategy == LOOKUP
                         && oam.persistentOidStr.equals(other.persistentOidStr);
             }
 
@@ -267,10 +267,10 @@ final class ObjectMementoWkt implements Serializable {
                 return oam.persistentOidStr;
             }
 
-        }, 
+        },
         /**
          * If all other strategies fail, as last resort we use plain java serialization, provided
-         * that the type in question is serializable 
+         * that the type in question is serializable
          */
         SERIALIZABLE {
             @Override
@@ -286,7 +286,7 @@ final class ObjectMementoWkt implements Serializable {
 
             @Override
             public boolean equals(
-                    ObjectMementoWkt memento, 
+                    ObjectMementoWkt memento,
                     ObjectMementoWkt otherMemento) {
                 return otherMemento.recreateStrategy == SERIALIZABLE
                         && Objects.equals(memento.objectSpecId, otherMemento.objectSpecId)
@@ -316,7 +316,7 @@ final class ObjectMementoWkt implements Serializable {
                 MetaModelContext mmc);
 
         public abstract boolean equals(
-                ObjectMementoWkt memento, 
+                ObjectMementoWkt memento,
                 ObjectMementoWkt otherMemento);
 
         public abstract int hashCode(ObjectMementoWkt memento);
@@ -351,7 +351,7 @@ final class ObjectMementoWkt implements Serializable {
      * Also, populated only if {@link #getCardinality() sort} is {@link Cardinality#SCALAR scalar}
      */
     private String encodableValue;
-    
+
     /**
      * The current value, if {@link RecreateStrategy#SERIALIZABLE}; will be <tt>null</tt> otherwise.
      *
@@ -377,7 +377,7 @@ final class ObjectMementoWkt implements Serializable {
     private Bookmark bookmark;
 
     /**
-     * Only populated for {@link ManagedObject#getPojo() domain object}s that implement {@link HintStore.HintIdProvider}.
+     * Only populated for {@link ManagedObject#getPojo() domain object}s that implement {@link HintIdProvider}.
      */
     private String hintId;
 
@@ -387,7 +387,7 @@ final class ObjectMementoWkt implements Serializable {
     private ArrayList<ObjectMementoWkt> list;
 
     private ObjectMementoWkt(
-            ArrayList<ObjectMementoWkt> list, 
+            ArrayList<ObjectMementoWkt> list,
             ObjectSpecId objectSpecId) {
 
         this.cardinality = Cardinality.VECTOR;
@@ -398,7 +398,7 @@ final class ObjectMementoWkt implements Serializable {
     private ObjectMementoWkt(RootOid rootOid, SpecificationLoader specificationLoader) {
 
         // -- // TODO[2112] do we ever need to create ENCODEABLE here?
-        val specId = rootOid.getObjectSpecId(); 
+        val specId = rootOid.getObjectSpecId();
         val spec = specificationLoader.lookupBySpecIdElseLoad(specId);
         if(spec!=null && spec.isEncodeable()) {
             this.cardinality = Cardinality.SCALAR;
@@ -406,7 +406,7 @@ final class ObjectMementoWkt implements Serializable {
             this.encodableValue = rootOid.getIdentifier();
             this.recreateStrategy = RecreateStrategy.ENCODEABLE;
             return;
-        } 
+        }
         // -- //
 
         this.cardinality = Cardinality.SCALAR;
@@ -443,14 +443,14 @@ final class ObjectMementoWkt implements Serializable {
             val rootOid = ManagedObjects.identifyElseFail(adapter);
             persistentOidStr = rootOid.enString();
             bookmark = rootOid.asBookmark();
-            if(adapter.getPojo() instanceof HintStore.HintIdProvider) {
-                HintStore.HintIdProvider provider = (HintStore.HintIdProvider) adapter.getPojo();
+            if(adapter.getPojo() instanceof HintIdProvider) {
+                HintIdProvider provider = (HintIdProvider) adapter.getPojo();
                 this.hintId = provider.hintId();
             }
             recreateStrategy = RecreateStrategy.LOOKUP;
             return;
         }
-        
+
         val encodableFacet = spec.getFacet(EncodableFacet.class);
         val isEncodable = encodableFacet != null;
         if (isEncodable) {
@@ -458,21 +458,21 @@ final class ObjectMementoWkt implements Serializable {
             recreateStrategy = RecreateStrategy.ENCODEABLE;
             return;
         }
-        
+
         if(spec.isSerializable()) {
             val serializer = spec.getMetaModelContext().getObjectManager().getObjectSerializer();
-            serializedObject = serializer.serialize(adapter); 
-            recreateStrategy = RecreateStrategy.SERIALIZABLE;    
+            serializedObject = serializer.serialize(adapter);
+            recreateStrategy = RecreateStrategy.SERIALIZABLE;
             return;
         }
-        
+
         throw _Exceptions.illegalArgument("Don't know how to create an ObjectMemento for a type "
                 + "with ObjectSpecification %s. "
                 + "All other strategies failed. Type is neither "
                 + "identifiable (isManagedBean() || isViewModel() || isEntity()), "
                 + "nor is a 'parented' Collection, "
                 + "nor has 'encodable' semantics, nor is (Serializable || Externalizable)", spec);
-        
+
     }
 
     private Cardinality getCardinality() {
@@ -514,7 +514,7 @@ final class ObjectMementoWkt implements Serializable {
         if(spec.getBeanSort().isManagedBean()) {
             return spec.getMetaModelContext().lookupServiceAdapterById(objectSpecId.asString());
         }
-        
+
         return cardinality.asAdapter(this, mmc);
     }
 


[isis] 02/02: ISIS-2444: moves Execution out of Interaction so no longer a nested class.

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

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

commit 360b43deb7f9a321106d4c120281cd11f5556d16
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Feb 13 07:53:32 2021 +0000

    ISIS-2444: moves Execution out of Interaction so no longer a nested class.
    
    This is to make it easier to document
---
 .../pages/Execution/hooks/examples_and_usage.adoc  |  27 ++
 .../hooks/implementation.adoc                      |  26 ++
 .../Interaction/hooks/examples_and_usage.adoc      |  20 +
 .../hooks/implementation.adoc                      |   2 +
 .../applib-svc/pages/InteractionContext.adoc       | 168 +--------
 .../hooks/examples_and_usage.adoc                  |  17 +
 .../InteractionContext/hooks/implementation.adoc   |   3 +
 .../org/apache/isis/applib/annotation/Action.java  |   2 +-
 .../apache/isis/applib/annotation/Property.java    |   3 +-
 .../apache/isis/applib/annotation/Publishing.java  |  11 +-
 .../isis/applib/services/command/Command.java      |  11 +-
 .../applib/services/iactn/ActionInvocation.java    |  30 ++
 .../isis/applib/services/iactn/Execution.java      | 342 +++++++++++++++++
 .../applib/services/iactn/ExecutionContext.java    |  54 +--
 .../isis/applib/services/iactn/Interaction.java    | 417 ++-------------------
 .../applib/services/iactn/InteractionContext.java  |  18 +-
 .../isis/applib/services/iactn/PropertyEdit.java   |  29 ++
 .../isis/applib/services/iactn/Sequence.java       |  36 ++
 .../services/publishing/log/ExecutionLogger.java   |   8 +-
 .../publishing/spi/ExecutionSubscriber.java        |  10 +-
 .../applib/util/schema/InteractionDtoUtils.java    |  29 +-
 .../apache/isis/core/config/IsisConfiguration.java |  42 +--
 .../core/interaction/session/IsisInteraction.java  |   5 +-
 .../metamodel/execution/InternalInteraction.java   |  13 +-
 .../metamodel/execution/MemberExecutorService.java |  32 +-
 ...ctionInvocationFacetForDomainEventAbstract.java |  48 +--
 .../execution/ExecutionPublishingFacet.java        |  17 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java |  16 +-
 .../services/publishing/ExecutionPublisher.java    |   6 +-
 .../command/CommandExecutorServiceDefault.java     |  12 +-
 .../executor/MemberExecutorServiceDefault.java     |  14 +-
 .../InteractionDtoServiceInternalDefault.java      |  11 +-
 .../publish/ExecutionPublisherDefault.java         |  24 +-
 .../changetracking/ChangingEntitiesFactory.java    |  37 +-
 34 files changed, 793 insertions(+), 747 deletions(-)

diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/Execution/hooks/examples_and_usage.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/Execution/hooks/examples_and_usage.adoc
new file mode 100644
index 0000000..9b69e56
--- /dev/null
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/Execution/hooks/examples_and_usage.adoc
@@ -0,0 +1,27 @@
+
+: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 [...]
+
+
+
+== Usage Notes
+
+``Execution``s can be subscribed to using the xref:system:generated:index/applib/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber] interface.
++
+One reason to subscribe is to persist these interaction/executions.
+This supports several use cases:
+
+** they enable profiling of the running application (which actions are invoked then most often, what is their response time)
+
+** if auditing is configured (using xref:system:generated:index/applib/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[`EntityPropertyChangeSubscriber`]), they provide better audit information, since the parent xref:system:generated:index/applib/services/iactn/Interaction.adoc[Interaction] captures the 'cause' of an interaction and can be correlated to the audit records (the "effect" of the interaction) by way of the xref:applib-classes:roles-mixins-contributees/contributee.a [...]
+
+
+== See also
+
+* xref:system:generated:index/applib/services/iactn/Interaction.adoc[Interaction]
+
+* xref:system:generated:index/applib/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber]
+
+
+// TODO: mention oubox publisher once ported over from incode-platform
+//xref:mappings:outbox-publisher:about.adoc[Outbox Publisher] mapping module, for example.
+
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/Execution/hooks/implementation.adoc
similarity index 53%
copy from api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc
copy to api/applib/src/main/adoc/modules/applib-svc/pages/Execution/hooks/implementation.adoc
index 697f559..23a77b5 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/Execution/hooks/implementation.adoc
@@ -4,3 +4,29 @@
 
 
 == Implementation
+
+This is an abstract class with two concrete subclasses
+
+* `ActionInvocation` represents the execution of an action being invoked:
++
+[source,java]
+----
+public class ActionInvocation extends Execution {
+    public List<Object> getArgs();                  // <.>
+}
+----
+
+<.> The objects passed in as the arguments to the action's parameters.
+Any of these could be `null`.
+
+* `PropertyEdit` represents the execution of a property being edited:
+=
+[source,java]
+----
+public class PropertyEdit extends Execution {
+    public Object getNewValue();                    // <.>
+}
+----
+<.> The object used as the new value of the property.
+Could be `null` if the property is being cleared.
+
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/Interaction/hooks/examples_and_usage.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/Interaction/hooks/examples_and_usage.adoc
new file mode 100644
index 0000000..a1325c2
--- /dev/null
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/Interaction/hooks/examples_and_usage.adoc
@@ -0,0 +1,20 @@
+
+: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 [...]
+
+
+
+== Usage Notes
+
+You could also think of this interface as somewhat analogous to a (database) transaction.
+However, the framework's xref:system:generated:index/applib/services/xactn/TransactionService.adoc[TransactionService] allows programmatic control of underlying database transactions, including the ability to commit one transaction and start a new one (using xref:system:generated:index/applib/services/xactn/TransactionService.adoc#nextTransaction[nextTransaction]).
+The is therefore not an exact mapping between an `Interaction` and a (database) transaction, because the former could span multiple of the latter.
+
+
+
+
+== See Also
+
+* xref:system:generated:index/applib/services/iactn/Execution.adoc[Execution]
+
+* xref:system:generated:index/applib/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber]
+
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/Interaction/hooks/implementation.adoc
similarity index 96%
copy from api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc
copy to api/applib/src/main/adoc/modules/applib-svc/pages/Interaction/hooks/implementation.adoc
index 697f559..92fb556 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/Interaction/hooks/implementation.adoc
@@ -4,3 +4,5 @@
 
 
 == Implementation
+
+This is a concrete class.
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext.adoc
index 8bb503d..d09af4e 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext.adoc
@@ -4,172 +4,10 @@
 :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 [...]
 
 
+include::system:generated:page$index/applib/services/iactn/InteractionContext.adoc[]
 
-The `InteractionContext` is a request-scoped domain service that is used to obtain the current
-`Interaction`.
+include::InteractionContext/hooks/implementation.adoc[]
 
-An `Interaction` generally consists of a single top-level `Execution`, either to invoke an action or to edit a property.
-If that top-level action or property uses xref:refguide:applib-svc:WrapperFactory.adoc[`WrapperFactory`] to invoke child actions/properties, then those sub-executions are captured as a call-graph.
-The `Execution` is thus a graph structure.
+include::InteractionContext/hooks/examples_and_usage.adoc[]
 
-If a bulk action is performed (as per an action annotated using xref:refguide:applib-ant:Action.adoc#invokeOn[`@Action#invokeOn`]), then this will result in multiple ``Interaction``s, one per selected object (not one `Interaction` with multiple top-level ``Execution``s).
-
-It is possible for ``Interaction.Execution``s to be persisted; this is supported by the xref:mappings:outbox-publisher:about.adoc[Outbox Publisher] mapping module, for example.
-Persistent``Interaction``s support several use cases:
-
-* they enable profiling of the running application (which actions are invoked then most often, what is their response time)
-
-* if auditing is configured (using xref:refguide:applib-svc:AuditerService.adoc[`AuditerService`]), they provide better audit information, since the
-`Interaction.Execution` captures the 'cause' of an interaction and can be correlated to the audit records (the "effect" of the interaction) by way of the xref:applib-classes:roles-mixins-contributees/contributee.adoc#HasUniqueId[`transactionId`]
-
-== API
-
-The public API of the service consists of several related classes:
-
-* `InteractionContext` domain service itself:
-* `Interaction` class, obtainable from the `InteractionContext`
-+
-The `Interaction` can be used to obtain the `Command` object representing the top-level invocation action/property edit.
-* `Execution` class, obtainable from the `Interaction`.
-
-The `Execution` class itself is abstract; there are two subclasses, `ActionInvocation` and `PropertyEdit`.
-
-== API
-
-include::system:generated:page$index/applib/services/iactn/InteractionContext.adoc[leveloffset=+2]
-
-TODO example migration
-
-.Deprecated Docs
-[WARNING]
-================================
-
-=== `InteractionContext`
-
-The public API of the `InteractionContext` domain service itself consists of simply:
-
-[source,java]
-----
-include::refguide:applib-svc:example$services/iactn/InteractionContext.java[tags="refguide"]
-----
-<.> Returns the currently active {@link Interaction} for this thread.
-
-This class is concrete (that is, it is also the implementation).
-
-
-================================
-
-== API
-
-include::system:generated:page$index/applib/services/iactn/Interaction.adoc[leveloffset=+2]
-
-TODO example migration
-
-.Deprecated Docs
-[WARNING]
-================================
-
-=== `Interaction`
-
-The public API of the `Interaction` class consists of:
-
-[source,java]
-----
-include::refguide:applib-svc:example$services/iactn/Interaction.java[tags="refguide"]
-----
-<.> The unique identifier of this interaction.
-<.> Returns a (list of) execution}s in the order that they were pushed.
-Generally there will be just one entry in this list, but additional entries may arise from the use of mixins/contributions when re-rendering a modified object.
-<.> The current execution.
-<.> The member `Execution` (action invocation or property edit) that preceded the current one.
-<.> Generates numbers in a named sequence.
-Used by the framework both to number successive interaction ``Execution``s and for events published by the xref:refguide:applib-svc:ExecutionSubscriber.adoc[`PublisherService`].
-
-This class is concrete (is also the implementation).
-
-
-================================
-
-=== `Interaction.Execution`
-
-The `Interaction.Execution` (static nested) class represents an action invocation/property edit as a node in a call-stack execution graph.
-Sub-executions can be performed using the
-xref:refguide:applib-svc:WrapperFactory.adoc[`WrapperFactory`].
-
-It has the following public API:
-
-[source,java]
-----
-public abstract class Execution {
-    public Interaction getInteraction();            // <.>
-    public InteractionType getInteractionType();    // <.>
-    public String getMemberIdentifier();            // <.>
-    public Object getTarget();                      // <.>
-
-    public String getTargetClass();                 // <.>
-    public String getTargetMember();
-
-    public Execution getParent();                   // <.>
-    public List<Execution> getChildren();
-
-    public AbstractDomainEvent getEvent();          // <.>
-
-    public Timestamp getStartedAt();                // <.>
-    public Timestamp getCompletedAt();
-
-    public Object getReturned();                    // <.>
-    public Exception getThrew();
-
-    public T getDto();                              // <.>
-}
-----
-
-<.> The owning `Interaction`.
-<.> Whether this is an action invocation or a property edit.
-<.> A string uniquely identifying the action or property (similar to Javadoc syntax).
-<.> The object on which the action is being invoked or property edited.
-In the case of a mixin this will be the mixin object itself (rather than the mixed-in object).
-<.> A human-friendly description of the class of the target object, and of the name of the action invoked/property edited on the target object.
-<.> The parent action/property that invoked this action/property edit (if any), and any actions/property edits made in turn via the xref:refguide:applib-svc:WrapperFactory.adoc[`WrapperFactory`].
-<.> The domain event fired via the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] representing the execution of this action invocation/property edit.
-<.> The date/time at which this execution started/completed.
-<.> The object returned by the action invocation/property edit, or the exception thrown.
-For `void` methods and for actions returning collections, the value will be `null`.
-<.> A DTO (instance of the xref:refguide:schema:ixn.adoc["ixn" schema]) being a serializable representation of this action invocation/property edit.
-
-
-There are two concrete subclasses of `Execution`.
-
-The first is `ActionInvocation`, representing the execution of an action being invoked:
-
-[source,java]
-----
-public class ActionInvocation extends Execution {
-    public List<Object> getArgs();                  // <1>
-}
-----
-<1> The objects passed in as the arguments to the action's parameters.
-Any of these could be `null`.
-
-The second is `PropertyEdit`, and naturally enough represents the execution of a property being edited:
-
-[source,java]
-----
-public class PropertyEdit extends Execution {
-    public Object getNewValue();                    // <1>
-}
-----
-<1> The object used as the new value of the property.
-Could be `null` if the property is being cleared.
-
-== Implementation
-
-This class (`o.a.i.applib.services.iactn.InteractionContext`) is also the default implementation.
-
-== Interacting with the services
-
-Typically domain objects will have little need to interact with the `InteractionContext` and `Interaction` directly.
-The services are used within the framework however, primarily to support the
-xref:refguide:applib-svc:ExecutionSubscriber.adoc[`PublisherService`] SPI, and to emit domain events over the
-xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/examples_and_usage.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/examples_and_usage.adoc
index 21f4ba4..25bb32f 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/examples_and_usage.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/examples_and_usage.adoc
@@ -2,3 +2,20 @@
 :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 [...]
 
 
+
+
+== Usage Notes
+
+Typically domain objects will have little need to interact with the `InteractionContext` and `Interaction` directly.
+The services are used within the framework however, primarily to support the xref:refguide:applib-svc:ExecutionSubscriber.adoc[ExecutionSubscriber] SPI, and to emit domain events over the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
+
+
+
+== See Also
+
+* xref:system:generated:index/applib/services/iactn/Interaction.adoc[Interaction], as provided by the `InteractionContext`
+
+* xref:system:generated:index/applib/services/iactn/Execution.adoc[Execution], as referenced by xref:system:generated:index/applib/services/iactn/Interaction.adoc[Interaction].
+
+* xref:system:generated:index/applib/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber]
+
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc
index 697f559..15474c5 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/InteractionContext/hooks/implementation.adoc
@@ -4,3 +4,6 @@
 
 
 == Implementation
+
+This class (`o.a.i.applib.services.iactn.InteractionContext`) is also the default implementation.
+
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
index 2a6eaa7..39e5bc4 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
@@ -30,7 +30,7 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandsDto;
 import org.apache.isis.applib.services.commanddto.processor.CommandDtoProcessor;
-import org.apache.isis.applib.services.iactn.Interaction.Execution;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.CommandSubscriber;
 import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
 import org.apache.isis.applib.value.Blob;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
index 1bd2227..fe73faf 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
@@ -30,6 +30,7 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandsDto;
 import org.apache.isis.applib.services.commanddto.processor.CommandDtoProcessor;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.CommandSubscriber;
 import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
 import org.apache.isis.applib.spec.Specification;
@@ -112,7 +113,7 @@ public @interface Property {
 
     /**
      * Whether
-     * {@link org.apache.isis.applib.services.iactn.Interaction.Execution}s
+     * {@link Execution}s
      * (triggered property edits), should be dispatched to
      * {@link ExecutionSubscriber}s.
      */
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Publishing.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Publishing.java
index e2e5fb6..0a63365 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Publishing.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Publishing.java
@@ -19,6 +19,7 @@
 package org.apache.isis.applib.annotation;
 
 import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.CommandSubscriber;
 import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 import org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber;
@@ -27,22 +28,22 @@ import org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscr
 import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
 
 /**
- * The available policies as to whether data should be published to  
- * corresponding subscribers. The framework supports several kinds of data 
+ * The available policies as to whether data should be published to
+ * corresponding subscribers. The framework supports several kinds of data
  * that are available for publishing:
  * <ul>
  * <li><b>{@link EntityChanges} ... subscribed to via {@link EntityChangesSubscriber}</li>
  * <li><b>{@link EntityPropertyChange} ... subscribed to via {@link EntityPropertyChangeSubscriber}</li>
  * <li><b>{@link Command} ... subscribed to via {@link CommandSubscriber}</li>
- * <li><b>{@link org.apache.isis.applib.services.iactn.Interaction.Execution} ... subscribed to via {@link ExecutionSubscriber}</li>
+ * <li><b>{@link Execution} ... subscribed to via {@link ExecutionSubscriber}</li>
  * </ul>
  * @since 1.x {@index}
  */
 public enum Publishing {
 
     /**
-     * Publishing of data triggered by interaction with this object 
-     * should be handled as per the default publishing policy 
+     * Publishing of data triggered by interaction with this object
+     * should be handled as per the default publishing policy
      * configured in <tt>application.properties</tt>.
      * <p>
      * If no publishing policy is configured, then publishing is disabled.
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
index 2faa4e9..5f4b385 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
@@ -25,6 +25,7 @@ import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.commanddto.HasCommandDto;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.publishing.spi.CommandSubscriber;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
@@ -177,7 +178,7 @@ public class Command implements HasUniqueId, HasUsername, HasCommandDto {
      * which the {@link Interaction} that executed the command started.
      *
      * @see Interaction#getCurrentExecution()
-     * @see Interaction.Execution#getStartedAt()
+     * @see Execution#getStartedAt()
      */
     @Getter
     private Timestamp startedAt;
@@ -188,12 +189,12 @@ public class Command implements HasUniqueId, HasUsername, HasCommandDto {
      *
      * <p>
      *     Previously this field was deprecated (on the basis that the completedAt is also held in
-     *     {@link Interaction.Execution#getCompletedAt()}). However, this property is now used in master/slave
+     *     {@link Execution#getCompletedAt()}). However, this property is now used in master/slave
      *     replay scenarios which may query a persisted Command.
      * </p>
      *
      * See also {@link Interaction#getCurrentExecution()} and
-     * {@link Interaction.Execution#getCompletedAt()}.
+     * {@link Execution#getCompletedAt()}.
      */
     @Getter
     private Timestamp completedAt;
@@ -208,7 +209,7 @@ public class Command implements HasUniqueId, HasUsername, HasCommandDto {
      * </p>
      *
      * See also  {@link Interaction#getCurrentExecution()} and
-     * {@link org.apache.isis.applib.services.iactn.Interaction.Execution#getReturned()}.
+     * {@link Execution#getReturned()}.
      */
     @Getter
     private Bookmark result;
@@ -223,7 +224,7 @@ public class Command implements HasUniqueId, HasUsername, HasCommandDto {
      * </p>
      *
      * See also {@link Interaction#getCurrentExecution()} and
-     * {@link org.apache.isis.applib.services.iactn.Interaction.Execution#getThrew()}.
+     * {@link Execution#getThrew()}.
      */
     @Getter
     private Throwable exception;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/ActionInvocation.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/ActionInvocation.java
new file mode 100644
index 0000000..c1ed6b5
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/ActionInvocation.java
@@ -0,0 +1,30 @@
+package org.apache.isis.applib.services.iactn;
+
+import java.util.List;
+
+import org.apache.isis.applib.events.domain.ActionDomainEvent;
+import org.apache.isis.schema.common.v2.InteractionType;
+import org.apache.isis.schema.ixn.v2.ActionInvocationDto;
+
+import lombok.Getter;
+
+/**
+ * @since 1.x {@index}
+ */
+public class ActionInvocation extends Execution<ActionInvocationDto, ActionDomainEvent<?>> {
+
+    @Getter
+    private final List<Object> args;
+
+    public ActionInvocation(
+            final Interaction interaction,
+            final String memberId,
+            final Object target,
+            final List<Object> args,
+            final String targetMember,
+            final String targetClass) {
+        super(interaction, InteractionType.ACTION_INVOCATION, memberId, target, targetMember, targetClass);
+        this.args = args;
+    }
+    // ...
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Execution.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Execution.java
new file mode 100644
index 0000000..eb19372
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Execution.java
@@ -0,0 +1,342 @@
+package org.apache.isis.applib.services.iactn;
+
+import java.sql.Timestamp;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.isis.applib.events.domain.AbstractDomainEvent;
+import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
+import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.eventbus.EventBusService;
+import org.apache.isis.applib.services.metrics.MetricsService;
+import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.applib.util.schema.MemberExecutionDtoUtils;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.schema.common.v2.DifferenceDto;
+import org.apache.isis.schema.common.v2.InteractionType;
+import org.apache.isis.schema.common.v2.PeriodDto;
+import org.apache.isis.schema.ixn.v2.MemberExecutionDto;
+import org.apache.isis.schema.ixn.v2.MetricsDto;
+import org.apache.isis.schema.ixn.v2.ObjectCountsDto;
+
+import lombok.Getter;
+import lombok.val;
+
+/**
+ * Represents an action invocation/property edit as a node in a call-stack
+ * execution graph, with sub-interactions being made by way of the
+ * {@link WrapperFactory}).
+ *
+ * <p>
+ *     The {@link Interaction} has a reference to a {@link Interaction#getCurrentExecution() top-level} execution.
+ * </p>
+ *
+ * @since 1.x {@index}
+ */
+public abstract class Execution<T extends MemberExecutionDto, E extends AbstractDomainEvent<?>> {
+
+
+    /**
+     * The owning {@link Interaction}.
+     */
+    @Getter
+    private final Interaction interaction;
+
+    /**
+     * Whether this is an
+     * {@link InteractionType#ACTION_INVOCATION action invocation} or a
+     * {@link InteractionType#PROPERTY_EDIT property edit}.
+     */
+    @Getter
+    private final InteractionType interactionType;
+
+    /**
+     * Uniquely identifies the action or property (similar to Javadoc syntax).
+     */
+    @Getter
+    private final String memberIdentifier;
+
+    /**
+     * The target of the action invocation.
+     *
+     * <p>
+     * If this interaction is for a mixin action, then will be the mixed-in
+     * target (not the transient mixin itself).
+     * </p>
+     */
+    @Getter
+    private final Object target;
+
+    /**
+     * A human-friendly description of the class of the target object.
+     */
+    @Getter
+    private final String targetClass;
+
+    /**
+     * The human-friendly name of the action invoked/property edited on the target object.
+     */
+    @Getter
+    private final String targetMember;
+
+    /**
+     * Captures metrics before the Execution Dto is present.
+     */
+    private int numberObjectsLoadedBefore;
+    /**
+     * Captures metrics before the Execution Dto is present.
+     */
+    private int numberObjectsDirtiedBefore;
+
+    protected Execution(
+            final Interaction interaction,
+            final InteractionType interactionType,
+            final String memberIdentifier,
+            final Object target,
+            final String targetMember,
+            final String targetClass) {
+
+        this.interaction = interaction;
+        this.interactionType = interactionType;
+        this.memberIdentifier = memberIdentifier;
+        this.target = target;
+        this.targetMember = targetMember;
+        this.targetClass = targetClass;
+    }
+
+
+    // -- parent, children
+
+    private final List<Execution<?, ?>> children = _Lists.newArrayList();
+
+    /**
+     * The action/property that invoked this action/property edit (if any).
+     */
+    @Getter
+    private Execution<?, ?> parent;
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    public void setParent(final Execution<?, ?> parent) {
+        this.parent = parent;
+        if (parent != null) {
+            parent.children.add(this);
+        }
+    }
+
+
+    /**
+     * The actions/property edits made in turn via the {@link WrapperFactory}.
+     */
+    public List<Execution<?, ?>> getChildren() {
+
+        return Collections.unmodifiableList(children);
+
+        // ...
+    }
+
+    /**
+     * The domain event fired on the {@link EventBusService event bus} representing the execution of
+     * this action invocation/property edit.
+     *
+     * <p>
+     * This event field is set by the framework before the action invocation/property edit itself;
+     * if read by the executing action/property edit method it will be in the
+     * {@link AbstractDomainEvent.Phase#EXECUTING executing} phase.
+     * </p>
+     */
+    @Getter
+    private E event;
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    public void setEvent(final E event) {
+        this.event = event;
+    }
+
+    /**
+     * The date/time at which this execution started.
+     */
+    @Getter
+    private Timestamp startedAt;
+
+    /**
+     * The date/time at which this execution completed.
+     */
+    @Getter
+    private Timestamp completedAt;
+
+    public Timestamp start(
+            final ClockService clockService,
+            final MetricsService metricsService) {
+
+        val startedAt = clockService.getClock().javaSqlTimestamp();
+        syncMetrics(When.BEFORE, startedAt, metricsService);
+        return startedAt;
+
+        // ...
+    }
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    public void setCompletedAt(
+            final Timestamp completedAt,
+            final MetricsService metricsService) {
+        syncMetrics(When.AFTER, completedAt, metricsService);
+    }
+
+    /**
+     * The object returned by the action invocation (for property edits, this
+     * is always <tt>null</tt>).
+     *
+     * <p>
+     * If the action returned either a domain entity or a simple value (and did not throw an
+     * exception) then this object is provided here.
+     *
+     * <p>
+     * For <tt>void</tt> methods and for actions returning collections, the value
+     * will be <tt>null</tt>.
+     * </p>
+     *
+     * <p>
+     *     If the action threw an exception, then the object returned will also
+     *     be <tt>null</tt>; the exception is instead captured in {@link #getThrew()}.
+     * </p>
+     */
+    @Getter
+    private Object returned;
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    public void setReturned(Object returned) {
+        this.returned = returned;
+    }
+
+    /**
+     * If a property edit or action invocation did not complete successfully
+     * but instead threw an exception, then it is captured here.
+     */
+    @Getter
+    private Exception threw;
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    public void setThrew(Exception threw) {
+        this.threw = threw;
+    }
+
+
+    // -- dto (property)
+
+    /**
+     * A serializable representation of this action invocation/property edit.
+     *
+     * <p>
+     * This <i>will</i> be populated (by the framework) during the method call itself (representing the
+     * action invocation/property edit), though some fields ({@link Execution#getCompletedAt()},
+     * {@link Execution#getReturned()}) will (obviously) still be null.
+     * </p>
+     */
+    @Getter
+    private T dto;
+
+    /**
+     * <b>NOT API</b>: Set by framework (implementation of
+     * {@link org.apache.isis.core.metamodel.execution.InternalInteraction.MemberExecutor})
+     */
+    public void setDto(final T executionDto) {
+        this.dto = executionDto;
+    }
+
+
+    // -- helpers (syncMetrics)
+
+    enum When {
+        BEFORE {
+            @Override
+            void syncMetrics(
+                    final Execution<?, ?> execution,
+                    final Timestamp timestamp,
+                    final int numberObjectsLoaded,
+                    final int numberObjectsDirtied) {
+
+                execution.startedAt = timestamp;
+                execution.numberObjectsLoadedBefore = numberObjectsLoaded;
+                execution.numberObjectsDirtiedBefore = numberObjectsLoaded;
+            }
+
+            // ....
+        },
+        AFTER {
+            @Override
+            void syncMetrics(
+                    final Execution<?, ?> execution,
+                    final Timestamp timestamp,
+                    final int numberObjectsLoaded,
+                    final int numberObjectsDirtied) {
+
+                execution.completedAt = timestamp;
+
+                final MetricsDto metricsDto = metricsFor(execution);
+
+                final PeriodDto periodDto = timingsFor(metricsDto);
+                periodDto.setStartedAt(JavaSqlXMLGregorianCalendarMarshalling.toXMLGregorianCalendar(execution.startedAt));
+                periodDto.setCompletedAt(JavaSqlXMLGregorianCalendarMarshalling.toXMLGregorianCalendar(execution.completedAt));
+
+                final ObjectCountsDto objectCountsDto = objectCountsFor(metricsDto);
+                numberObjectsLoadedFor(objectCountsDto).setBefore(execution.numberObjectsLoadedBefore);
+                numberObjectsDirtiedFor(objectCountsDto).setBefore(execution.numberObjectsDirtiedBefore);
+
+                numberObjectsLoadedFor(objectCountsDto).setAfter(numberObjectsLoaded);
+                numberObjectsDirtiedFor(objectCountsDto).setAfter(numberObjectsDirtied);
+            }
+
+            // ....
+        };
+
+        // -- helpers
+
+        private static DifferenceDto numberObjectsDirtiedFor(final ObjectCountsDto objectCountsDto) {
+            return MemberExecutionDtoUtils.numberObjectsDirtiedFor(objectCountsDto);
+        }
+
+        private static DifferenceDto numberObjectsLoadedFor(final ObjectCountsDto objectCountsDto) {
+            return MemberExecutionDtoUtils.numberObjectsLoadedFor(objectCountsDto);
+        }
+
+        private static ObjectCountsDto objectCountsFor(final MetricsDto metricsDto) {
+            return MemberExecutionDtoUtils.objectCountsFor(metricsDto);
+        }
+
+        private static MetricsDto metricsFor(final Execution<?, ?> execution) {
+            return MemberExecutionDtoUtils.metricsFor(execution.dto);
+        }
+
+        private static PeriodDto timingsFor(final MetricsDto metricsDto) {
+            return MemberExecutionDtoUtils.timingsFor(metricsDto);
+        }
+
+        abstract void syncMetrics(
+                final Execution<?, ?> teExecution,
+                final Timestamp timestamp,
+                final int numberObjectsLoaded,
+                final int numberObjectsDirtied);
+    }
+
+    private void syncMetrics(
+            final When when,
+            final Timestamp timestamp,
+            final MetricsService metricsService) {
+
+        final int numberObjectsLoaded = metricsService.numberEntitiesLoaded();
+        final int numberObjectsDirtied = metricsService.numberEntitiesDirtied();
+
+        when.syncMetrics(this, timestamp, numberObjectsLoaded, numberObjectsDirtied);
+    }
+
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/ExecutionContext.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/ExecutionContext.java
index cbfa51a..4a88c76 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/ExecutionContext.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/ExecutionContext.java
@@ -33,51 +33,51 @@ import lombok.Value;
 import lombok.With;
 
 /**
- * Provides the user and scenario specific environment for an {@link Interaction.Execution}
- * 
+ * Provides the user and scenario specific environment for an {@link Execution}
+ *
  * @since 2.0 {@index}
  */
 @Value @Builder
 @RequiredArgsConstructor
-public final class ExecutionContext implements Serializable {
-    
+public class ExecutionContext implements Serializable {
+
     private static final long serialVersionUID = -220896735209733865L;
-    
+
     // -- IMMUTABLE FIELDS
 
     /**
      * The (programmatically) simulated (or actual) user.
-     * 
-     * @apiNote immutable, allows an {@link Interaction} to (logically) run with its 
-     * own simulated (or actual) user 
+     *
+     * @apiNote immutable, allows an {@link Interaction} to (logically) run with its
+     * own simulated (or actual) user
      */
-    @With @Getter @Builder.Default 
-    private final @NonNull UserMemento user = UserMemento.system();
-    
+    @With @Getter @Builder.Default
+    @NonNull UserMemento user = UserMemento.system();
+
     /**
      * The (programmatically) simulated (or actual) clock.
-     * 
-     * @apiNote immutable, allows an {@link Interaction} to (logically) run with its 
-     * own simulated (or actual) clock 
+     *
+     * @apiNote immutable, allows an {@link Interaction} to (logically) run with its
+     * own simulated (or actual) clock
      */
-    @With @Getter @Builder.Default 
-    private final @NonNull VirtualClock clock = VirtualClock.system();
-    
-    @With @Getter @Builder.Default 
-    private final @NonNull Locale locale = Locale.getDefault();
-    
-    @With @Getter @Builder.Default 
-    private final @NonNull TimeZone timeZone = TimeZone.getDefault();
-    
+    @With @Getter @Builder.Default
+    @NonNull VirtualClock clock = VirtualClock.system();
+
+    @With @Getter @Builder.Default
+    @NonNull Locale locale = Locale.getDefault();
+
+    @With @Getter @Builder.Default
+    @NonNull TimeZone timeZone = TimeZone.getDefault();
+
     // -- FACTORIES
-    
+
     /**
-     * Creates a new {@link ExecutionContext} with the specified user and 
+     * Creates a new {@link ExecutionContext} with the specified user and
      * system defaults for clock, locale and time-zone.
      */
     public static ExecutionContext ofUserWithSystemDefaults(
             final @NonNull UserMemento user) {
         return new ExecutionContext(user, VirtualClock.system(), Locale.getDefault(), TimeZone.getDefault());
-    }   
-    
+    }
+
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
index 5d00103..ea68a44 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
@@ -19,65 +19,68 @@
 
 package org.apache.isis.applib.services.iactn;
 
-import java.sql.Timestamp;
-import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
 
-import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
-import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
-import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.metrics.MetricsService;
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-import org.apache.isis.applib.util.schema.MemberExecutionDtoUtils;
 import org.apache.isis.commons.having.HasUniqueId;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.schema.common.v2.DifferenceDto;
 import org.apache.isis.schema.common.v2.InteractionType;
-import org.apache.isis.schema.common.v2.PeriodDto;
 import org.apache.isis.schema.ixn.v2.ActionInvocationDto;
-import org.apache.isis.schema.ixn.v2.MemberExecutionDto;
-import org.apache.isis.schema.ixn.v2.MetricsDto;
-import org.apache.isis.schema.ixn.v2.ObjectCountsDto;
 import org.apache.isis.schema.ixn.v2.PropertyEditDto;
 
 import lombok.Getter;
-import lombok.val;
 
 /**
- * Represents an action invocation or property modification, resulting in some state change of the system.  It captures
- * not only the target object and arguments passed, but also builds up the call-graph, and captures metrics, eg
- * for profiling.
+ * Represents an action invocation or property modification, resulting in some
+ * state change of the system.  It captures not only the target object and
+ * arguments passed, but also builds up the call-graph, and captures metrics,
+ * eg for profiling.
  *
  * <p>
- *     The distinction between {@link Command} and this object is perhaps subtle: the former represents the
- *     intention to invoke an action/edit a property, whereas this represents the actual invocation/edit itself.
+ *     The `Interaction` can be used to obtain the  {@link Command} object
+ *     representing the top-level invocation action/property edit.
  * </p>
  *
  * <p>
- *     To confuse matters slightly, historically the {@link Command} interface defines members (specifically:
- *     {@link Command#getStartedAt()}, {@link Command#getCompletedAt()}, {@link Command#getResult()},
- *     {@link Command#getException()}) which logically belong to this class instead; they remain in {@link Command}
- *     for backward compatibility only (and have been deprecated).
+ *     The distinction between {@link Command} and this object is perhaps
+ *     subtle: the former represents the intention to invoke an action/edit a
+ *     property, whereas this represents the actual invocation/edit itself.
  * </p>
  *
  * <p>
- *     NOTE: you could also think of this interface as being analogous to the (database) transaction.  The name
- *     &quot;Transaction&quot; has not been used for the interface not chosen however because there is also the
- *     system-level transaction that manages the persistence of
- *     the {@link Command} object itself.
+ *     To confuse matters slightly, historically the {@link Command} interface
+ *     defines members (specifically: {@link Command#getStartedAt()},
+ *     {@link Command#getCompletedAt()}, {@link Command#getResult()},
+ *     {@link Command#getException()}) which logically belong to this class
+ *     instead; they remain in {@link Command} for backward compatibility only
+ *     (and have been deprecated).
  * </p>
  *
- * 
  * @since 1.x revised for 2.0 {@index}
  */
 public interface Interaction extends HasUniqueId {
 
-    Command getCommand();
+    /**
+     * The unique identifier of this interaction (inherited from
+     * {@link HasUniqueId})
+     *
+     * <p>
+     *     This can be used to correlate audit records and transactions
+     *     happening as a consequence or within the interaction.
+     * </p>
+     *
+     * @return
+     */
+    @Override
+    UUID getUniqueId();
 
+    /**
+     * Represents the <i>intention</i> to perform this interaction.
+     * @return
+     */
+    Command getCommand();
 
     /**
      * The current (most recently pushed) {@link Execution}.
@@ -91,364 +94,12 @@ public interface Interaction extends HasUniqueId {
 
 
     /**
-     * Enumerates the different reasons why multiple occurrences of a certain type might occur within a single
-     * (top-level) interaction.
-     */
-    public enum Sequence {
-
-        /**
-         * Each interaction is either an action invocation or a property edit.  There could be multiple of these,
-         * typically as the result of a nested calls using the {@link WrapperFactory}.  Another reason is
-         * support for bulk action invocations within a single transaction.
-         */
-        INTERACTION,
-
-        /**
-         * For objects: multiple such could be dirtied and thus published as separate events.  For actions
-         * invocations/property edits : multiple sub-invocations could occur if sub-invocations are made through the
-         * {@link WrapperFactory}.
-         */
-        PUBLISHED_EVENT,
-
-        /**
-         * There may be multiple transactions within a given interaction.
-         */
-        TRANSACTION,
-        ;
-
-        public String id() {
-            return Interaction.Sequence.class.getName() + "#" + name();
-        }
-    }
-
-    /**
      * Generates numbers in a named sequence.
      *
      * The name of the sequence can be arbitrary, though note that the framework also uses this capability to
      * generate sequence numbers corresponding to the sequences enumerated by the {@link Sequence} enum.
      */
     int next(final String sequenceId);
-    
-
-
-    /**
-     * Represents an action invocation/property edit as a node in a call-stack execution graph, with sub-interactions
-     * being made by way of the {@link WrapperFactory}).
-     */
-    public static abstract class Execution<T extends MemberExecutionDto, E extends AbstractDomainEvent<?>> {
-
-        @Getter
-        private final Interaction interaction;
-        @Getter
-        private final InteractionType interactionType;
-        @Getter
-        private final String memberIdentifier;
-
-        /**
-         * The target of the action invocation.  If this interaction is for a mixin action, then will be the
-         * mixed-in target (not the transient mixin itself).
-         */
-        @Getter
-        private final Object target;
-
-        /**
-         * A human-friendly description of the class of the target object.
-         */
-        @Getter
-        private final String targetClass;
-
-        /**
-         * The human-friendly name of the action invoked/property edited on the target object.
-         */
-        @Getter
-        private final String targetMember;
-
-
-        /**
-         * Captures metrics before the Execution Dto is present.
-         */
-        private int numberObjectsLoadedBefore;
-        /**
-         * Captures metrics before the Execution Dto is present.
-         */
-        private int numberObjectsDirtiedBefore;
-
-        protected Execution(
-                final Interaction interaction,
-                final InteractionType interactionType,
-                final String memberIdentifier,
-                final Object target,
-                final String targetMember,
-                final String targetClass) {
-
-            this.interaction = interaction;
-            this.interactionType = interactionType;
-            this.memberIdentifier = memberIdentifier;
-            this.target = target;
-            this.targetMember = targetMember;
-            this.targetClass = targetClass;
-        }
-
-
-        // -- parent, children
-
-        private final List<Execution<?,?>> children = _Lists.newArrayList();
-        /**
-         * The action/property that invoked this action/property edit (if any).
-         */
-        @Getter
-        private Execution<?,?> parent;
-
-        /**
-         * <b>NOT API</b>: intended to be called only by the framework.
-         */
-        public void setParent(final Execution<?,?> parent) {
-            this.parent = parent;
-            if(parent != null) {
-                parent.children.add(this);
-            }
-        }
-
-        /**
-         * The actions/property edits made in turn via the {@link WrapperFactory}.
-         */
-        public List<Execution<?,?>> getChildren() {
-
-            return Collections.unmodifiableList(children);
-
-            // ...
-        }
-
-        /**
-         * The domain event fired on the {@link EventBusService event bus} representing the execution of
-         * this action invocation/property edit.
-         *
-         * <p>
-         *     This event field is set by the framework before the action invocation/property edit itself;
-         *     if read by the executing action/property edit method it will be in the
-         *     {@link AbstractDomainEvent.Phase#EXECUTING executing} phase.
-         * </p>
-         */
-        @Getter
-        private E event;
-
-        /**
-         * <b>NOT API</b>: intended to be called only by the framework.
-         */
-        public void setEvent(final E event) {
-            this.event = event;
-        }
-
-        /**
-         * The date/time at which this execution started.
-         */
-        @Getter
-        private Timestamp startedAt;
-
-        /**
-         * The date/time at which this execution completed.
-         */
-        @Getter
-        private Timestamp completedAt;
-
-        public Timestamp start(
-                final ClockService clockService,
-                final MetricsService metricsService) {
-
-            val startedAt = clockService.getClock().javaSqlTimestamp();
-            syncMetrics(When.BEFORE, startedAt, metricsService);
-            return startedAt;
-
-            // ...
-        }
-
-        /**
-         * <b>NOT API</b>: intended to be called only by the framework.
-         */
-        public void setCompletedAt(
-                final Timestamp completedAt,
-                final MetricsService metricsService) {
-            syncMetrics(When.AFTER, completedAt, metricsService);
-        }
-
-        /**
-         * The object returned by the action invocation/property edit.
-         *
-         * <p>
-         * If the action returned either a domain entity or a simple value (and did not throw an
-         * exception) then this object is provided here.
-         *
-         * <p>
-         * For <tt>void</tt> methods and for actions returning collections, the value
-         * will be <tt>null</tt>.
-         */
-        @Getter
-        private Object returned;
-
-        /**
-         * <b>NOT API</b>: intended to be called only by the framework.
-         */
-        public void setReturned(Object returned) {
-            this.returned = returned;
-        }
-
-        @Getter
-        private Exception threw;
-
-        /**
-         * <b>NOT API</b>: intended to be called only by the framework.
-         */
-        public void setThrew(Exception threw) {
-            this.threw = threw;
-        }
-
-
-        // -- dto (property)
-
-        /**
-         * A serializable representation of this action invocation/property edit.
-         *
-         * <p>
-         *     This <i>will</i> be populated (by the framework) during the method call itself (representing the
-         *     action invocation/property edit), though some fields ({@link Execution#getCompletedAt()},
-         *     {@link Execution#getReturned()}) will (obviously) still be null.
-         * </p>
-         */
-        @Getter
-        private T dto;
-
-        /**
-         * <b>NOT API</b>: Set by framework (implementation of 
-         * {@link org.apache.isis.core.metamodel.execution.InternalInteraction.MemberExecutor})
-         */
-        public void setDto(final T executionDto) {
-            this.dto = executionDto;
-        }
-
-
-        // -- helpers (syncMetrics)
-
-        enum When {
-            BEFORE {
-
-                @Override
-                void syncMetrics(
-                        final Execution<?, ?> execution,
-                        final Timestamp timestamp,
-                        final int numberObjectsLoaded,
-                        final int numberObjectsDirtied) {
-
-                    execution.startedAt = timestamp;
-                    execution.numberObjectsLoadedBefore = numberObjectsLoaded;
-                    execution.numberObjectsDirtiedBefore = numberObjectsLoaded;
-                }
-
-                // ....
-            },
-            AFTER {
-
-                @Override void syncMetrics(
-                        final Execution<?, ?> execution,
-                        final Timestamp timestamp,
-                        final int numberObjectsLoaded,
-                        final int numberObjectsDirtied) {
-
-                    execution.completedAt = timestamp;
-
-                    final MetricsDto metricsDto = metricsFor(execution);
-
-                    final PeriodDto periodDto = timingsFor(metricsDto);
-                    periodDto.setStartedAt(JavaSqlXMLGregorianCalendarMarshalling.toXMLGregorianCalendar(execution.startedAt));
-                    periodDto.setCompletedAt(JavaSqlXMLGregorianCalendarMarshalling.toXMLGregorianCalendar(execution.completedAt));
-
-                    final ObjectCountsDto objectCountsDto = objectCountsFor(metricsDto);
-                    numberObjectsLoadedFor(objectCountsDto).setBefore(execution.numberObjectsLoadedBefore);
-                    numberObjectsDirtiedFor(objectCountsDto).setBefore(execution.numberObjectsDirtiedBefore);
-
-                    numberObjectsLoadedFor(objectCountsDto).setAfter(numberObjectsLoaded);
-                    numberObjectsDirtiedFor(objectCountsDto).setAfter(numberObjectsDirtied);
-                }
-
-                // ....
-            };
-
-            // -- helpers
-
-            private static DifferenceDto numberObjectsDirtiedFor(final ObjectCountsDto objectCountsDto) {
-                return MemberExecutionDtoUtils.numberObjectsDirtiedFor(objectCountsDto);
-            }
-
-            private static DifferenceDto numberObjectsLoadedFor(final ObjectCountsDto objectCountsDto) {
-                return MemberExecutionDtoUtils.numberObjectsLoadedFor(objectCountsDto);
-            }
-
-            private static ObjectCountsDto objectCountsFor(final MetricsDto metricsDto) {
-                return MemberExecutionDtoUtils.objectCountsFor(metricsDto);
-            }
-
-            private static MetricsDto metricsFor(final Execution<?, ?> execution) {
-                return MemberExecutionDtoUtils.metricsFor(execution.dto);
-            }
-
-            private static PeriodDto timingsFor(final MetricsDto metricsDto) {
-                return MemberExecutionDtoUtils.timingsFor(metricsDto);
-            }
-
-            abstract void syncMetrics(
-                    final Execution<?, ?> teExecution,
-                    final Timestamp timestamp,
-                    final int numberObjectsLoaded,
-                    final int numberObjectsDirtied);
-        }
-
-        private void syncMetrics(
-                final When when,
-                final Timestamp timestamp,
-                final MetricsService metricsService) {
-
-            final int numberObjectsLoaded = metricsService.numberEntitiesLoaded();
-            final int numberObjectsDirtied = metricsService.numberEntitiesDirtied();
-
-            when.syncMetrics(this, timestamp, numberObjectsLoaded, numberObjectsDirtied);
-        }
-
-    }
-
-    public static class ActionInvocation extends Execution<ActionInvocationDto, ActionDomainEvent<?>> {
-
-        @Getter
-        private final List<Object> args;
-
-        public ActionInvocation(
-                final Interaction interaction,
-                final String memberId,
-                final Object target,
-                final List<Object> args,
-                final String targetMember,
-                final String targetClass) {
-            super(interaction, InteractionType.ACTION_INVOCATION, memberId, target, targetMember, targetClass);
-            this.args = args;
-        }
-        // ...
-    }
-
-    public static class PropertyEdit extends Execution<PropertyEditDto, PropertyDomainEvent<?,?>> {
-
-        @Getter
-        private final Object newValue;
-
-        public PropertyEdit(
-                final Interaction interaction,
-                final String memberId,
-                final Object target,
-                final Object newValue,
-                final String targetMember,
-                final String targetClass) {
-            super(interaction, InteractionType.PROPERTY_EDIT, memberId, target, targetMember, targetClass);
-            this.newValue = newValue;
-        }
 
-        // ...
-    }
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
index 524883f..0d58a2e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
@@ -24,8 +24,18 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 
 /**
  * Provides the current thread's {@link Interaction}.
- * 
- * @since 2.0 {@index}
+ *
+ * <p>
+ * An {@link Interaction}  contains a top-level {@link Execution}
+ * representing the invocation of an action or the editing of a property.
+ * If that top-level action or property uses the
+ * {@link org.apache.isis.applib.services.wrapper.WrapperFactory} domain
+ * service to invoke child actions/properties, then those sub-executions are
+ * captured as a call-graph. The {@link Execution} is thus a
+ * graph structure.
+ * </p>
+ *
+ * @since 1.x {@index}
  */
 public interface InteractionContext {
 
@@ -36,11 +46,11 @@ public interface InteractionContext {
     Optional<Interaction> currentInteraction();
 
     // -- SHORTCUTS
-    
+
     default Interaction currentInteractionElseFail() {
     	return currentInteraction().orElseThrow(()->_Exceptions
     			.illegalState("No InteractionSession on current thread"));
     }
-    
+
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/PropertyEdit.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/PropertyEdit.java
new file mode 100644
index 0000000..c6e71c8
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/PropertyEdit.java
@@ -0,0 +1,29 @@
+package org.apache.isis.applib.services.iactn;
+
+import org.apache.isis.applib.events.domain.PropertyDomainEvent;
+import org.apache.isis.schema.common.v2.InteractionType;
+import org.apache.isis.schema.ixn.v2.PropertyEditDto;
+
+import lombok.Getter;
+
+/**
+ * @since 1.x {@index}
+ */
+public class PropertyEdit extends Execution<PropertyEditDto, PropertyDomainEvent<?, ?>> {
+
+    @Getter
+    private final Object newValue;
+
+    public PropertyEdit(
+            final Interaction interaction,
+            final String memberId,
+            final Object target,
+            final Object newValue,
+            final String targetMember,
+            final String targetClass) {
+        super(interaction, InteractionType.PROPERTY_EDIT, memberId, target, targetMember, targetClass);
+        this.newValue = newValue;
+    }
+
+    // ...
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Sequence.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Sequence.java
new file mode 100644
index 0000000..5f1de87
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Sequence.java
@@ -0,0 +1,36 @@
+package org.apache.isis.applib.services.iactn;
+
+import org.apache.isis.applib.services.wrapper.WrapperFactory;
+
+/**
+ * Enumerates the different reasons why multiple occurrences of a certain type might occur within a single
+ * (top-level) interaction.
+ *
+ * @since 1.x {@index}
+ */
+public enum Sequence {
+
+    /**
+     * Each interaction is either an action invocation or a property edit.  There could be multiple of these,
+     * typically as the result of a nested calls using the {@link WrapperFactory}.  Another reason is
+     * support for bulk action invocations within a single transaction.
+     */
+    INTERACTION,
+
+    /**
+     * For objects: multiple such could be dirtied and thus published as separate events.  For actions
+     * invocations/property edits : multiple sub-invocations could occur if sub-invocations are made through the
+     * {@link WrapperFactory}.
+     */
+    PUBLISHED_EVENT,
+
+    /**
+     * There may be multiple transactions within a given interaction.
+     */
+    TRANSACTION,
+    ;
+
+    public String id() {
+        return Sequence.class.getName() + "#" + name();
+    }
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/publishing/log/ExecutionLogger.java b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/log/ExecutionLogger.java
index 940cff4..03498d9 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/publishing/log/ExecutionLogger.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/log/ExecutionLogger.java
@@ -26,7 +26,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
 import org.apache.isis.schema.ixn.v2.InteractionDto;
@@ -34,7 +34,7 @@ import org.apache.isis.schema.ixn.v2.InteractionDto;
 import lombok.extern.log4j.Log4j2;
 
 /**
- * 
+ *
  * @since 2.0 {@index}
  */
 @Service
@@ -49,9 +49,9 @@ public class ExecutionLogger implements ExecutionSubscriber {
     public boolean isEnabled() {
         return log.isDebugEnabled();
     }
-    
+
     @Override
-    public void onExecution(final Interaction.Execution<?, ?> execution) {
+    public void onExecution(final Execution<?, ?> execution) {
 
         final InteractionDto interactionDto =
                 InteractionDtoUtils.newInteractionDto(execution, InteractionDtoUtils.Strategy.DEEP);
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/ExecutionSubscriber.java b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/ExecutionSubscriber.java
index b141b31..908951c 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/ExecutionSubscriber.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/ExecutionSubscriber.java
@@ -20,7 +20,7 @@ package org.apache.isis.applib.services.publishing.spi;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Property;
-import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
 import org.apache.isis.commons.having.HasEnabling;
 
@@ -49,7 +49,7 @@ public interface ExecutionSubscriber extends HasEnabling {
     /**
      * Callback to notify that an interaction (an action invocation or property
      * edit, as represented by
-     * {@link org.apache.isis.applib.services.iactn.Interaction.Execution}) has
+     * {@link Execution}) has
      * completed.
      *
      * <p>
@@ -60,12 +60,12 @@ public interface ExecutionSubscriber extends HasEnabling {
      *
      * <p>
      * Most implementations are expected to use
-     * {@link org.apache.isis.applib.services.iactn.Interaction.Execution#getDto()}
+     * {@link Execution#getDto()}
      * to create a serializable XML representation of the execution.
      * The easiest way to do this is using
-     * {@link InteractionDtoUtils#newInteractionDto(Interaction.Execution)}.
+     * {@link InteractionDtoUtils#newInteractionDto(Execution)}.
      * </p>
      */
-    void onExecution(Interaction.Execution<?, ?> execution);
+    void onExecution(Execution<?, ?> execution);
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java b/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
index b715931..ace463d 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
@@ -36,6 +36,7 @@ import javax.xml.bind.Unmarshaller;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.util.JaxbUtil;
 import org.apache.isis.commons.internal.base._NullSafe;
@@ -115,30 +116,30 @@ public final class InteractionDtoUtils {
     // -- newInteractionDto
 
     /**
-     * Encapsulates the mechanism for obtaining a {@link MemberExecutionDto} DTO (XML memento) 
-     * of the provided in-memory 
-     * {@link org.apache.isis.applib.services.iactn.Interaction.Execution}.
+     * Encapsulates the mechanism for obtaining a {@link MemberExecutionDto} DTO (XML memento)
+     * of the provided in-memory
+     * {@link Execution}.
      */
     public enum Strategy {
         FLAT {
 
             @Override
-            public MemberExecutionDto dtoFor(final Interaction.Execution<?, ?> execution) {
+            public MemberExecutionDto dtoFor(final Execution<?, ?> execution) {
                 return execution.getDto();
             }
         },
         DEEP {
             @Override
-            public MemberExecutionDto dtoFor(final Interaction.Execution<?, ?> execution) {
+            public MemberExecutionDto dtoFor(final Execution<?, ?> execution) {
                 return traverse(execution);
             }
 
-            private MemberExecutionDto traverse(final Interaction.Execution<?, ?> parentExecution) {
+            private MemberExecutionDto traverse(final Execution<?, ?> parentExecution) {
 
                 final MemberExecutionDto parentDto = clone(parentExecution.getDto());
 
-                final List<Interaction.Execution<?, ?>> children = parentExecution.getChildren();
-                for (Interaction.Execution<?, ?> childExecution : children) {
+                final List<Execution<?, ?>> children = parentExecution.getChildren();
+                for (Execution<?, ?> childExecution : children) {
                     final MemberExecutionDto childDto = clone(childExecution.getDto());
                     final MemberExecutionDto.ChildExecutions childExecutions =
                             InteractionDtoUtils.childExecutionsOf(parentDto);
@@ -158,7 +159,7 @@ public final class InteractionDtoUtils {
         };
 
 
-        public abstract MemberExecutionDto dtoFor(final Interaction.Execution<?, ?> execution);
+        public abstract MemberExecutionDto dtoFor(final Execution<?, ?> execution);
 
     }
 
@@ -173,20 +174,20 @@ public final class InteractionDtoUtils {
 
     /**
      * Creates a {@link InteractionDto} (serializable  to XML) for the provided
-     * {@link org.apache.isis.applib.services.iactn.Interaction.Execution} 
+     * {@link Execution}
      * (the applib object).
      */
-    public static InteractionDto newInteractionDto(final Interaction.Execution<?, ?> execution) {
+    public static InteractionDto newInteractionDto(final Execution<?, ?> execution) {
         return newInteractionDto(execution, Strategy.FLAT);
     }
 
     /**
      * Creates a {@link InteractionDto} (serializable  to XML) for the provided
-     * {@link org.apache.isis.applib.services.iactn.Interaction.Execution} 
+     * {@link Execution}
      * (the applib object).
      */
     public static InteractionDto newInteractionDto(
-            final Interaction.Execution<?, ?> execution,
+            final Execution<?, ?> execution,
             final Strategy strategy) {
 
         final MemberExecutionDto memberExecutionDto = strategy.dtoFor(execution);
@@ -194,7 +195,7 @@ public final class InteractionDtoUtils {
     }
 
     private static InteractionDto newInteractionDto(
-            final Interaction.Execution<?, ?> execution,
+            final Execution<?, ?> execution,
             final MemberExecutionDto executionDto) {
         final Interaction interaction = execution.getInteraction();
         final String transactionId = interaction.getUniqueId().toString();
diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index a3a7fcb..203f295 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -59,7 +59,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber;
 import org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber;
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
@@ -655,9 +655,9 @@ public class IsisConfiguration {
                  * {@link org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber} for publishing.
                  *
                  * <p>
-                 *     The service's {@link org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber#publish(Interaction.Execution) publish}
+                 *     The service's {@link org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber#publish(Execution) publish}
                  *     method is called only once per transaction, with
-                 *     {@link Interaction.Execution} collecting details of
+                 *     {@link Execution} collecting details of
                  *     the identity of the target object, the action invoked, the action arguments and the returned
                  *     object (if any).
                  * </p>
@@ -841,9 +841,9 @@ public class IsisConfiguration {
                  * {@link org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber} for publishing.
                  *
                  * <p>
-                 * The service's {@link org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber#publish(Interaction.Execution) publish}
+                 * The service's {@link org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber#publish(Execution) publish}
                  * method is called only once per transaction, with
-                 * {@link Interaction.Execution} collecting details of
+                 * {@link Execution} collecting details of
                  * the identity of the target object, the property edited, and the new value of the property.
                  * </p>
                  *
@@ -1594,7 +1594,7 @@ public class IsisConfiguration {
             public static class Translation {
 
                 private final Po po = new Po();
-                
+
                 /**
                  * Specifies the relative resource path to look for translation files.
                  * <p>
@@ -1646,44 +1646,44 @@ public class IsisConfiguration {
     private final Persistence persistence = new Persistence();
     @Data
     public static class Persistence {
-        
+
         private final Schema schema = new Schema();
         @Data
         public static class Schema {
-            
+
             /**
              * List of additional schemas to be auto-created.
              * <p>
-             * Explicitly creates given list of schemas by using the specified 
-             * {@link #getCreateSchemaSqlTemplate()} to generate the actual SQL 
+             * Explicitly creates given list of schemas by using the specified
+             * {@link #getCreateSchemaSqlTemplate()} to generate the actual SQL
              * statement against the configured data-source.
-             * <p> 
-             * This configuration mechanism does not consider any schema-auto-creation 
+             * <p>
+             * This configuration mechanism does not consider any schema-auto-creation
              * configuration (if any), that independently is provided the standard JPA way.
              */
             private final List<String> autoCreateSchemas = new ArrayList<>();
-            
+
             /**
              * Does lookup additional "mapping-files" in META-INF/orm-<i>name</i>.xml
-             * (equivalent to "mapping-file" entries in persistence.xml) and adds these 
+             * (equivalent to "mapping-file" entries in persistence.xml) and adds these
              * to those that are already configured the <i>Spring Data</i> way (if any).
-             * @implNote not implemented for JDO 
+             * @implNote not implemented for JDO
              */
             private final List<String> additionalOrmFiles = new ArrayList<>();
-            
+
             /**
              * Vendor specific SQL syntax to create a DB schema.
              * <p>
-             * This template is passed through {@link String#format(String, schemaName)} to 
+             * This template is passed through {@link String#format(String, schemaName)} to
              * make the actual SQL statement thats to be used against the configured data-source.
              * <p>
-             * Default template is {@literal CREATE SCHEMA IF NOT EXISTS %S} with the schema name 
+             * Default template is {@literal CREATE SCHEMA IF NOT EXISTS %S} with the schema name
              * converted to upper-case.
-             * <p>  
+             * <p>
              * For MYSQL/MARIADB use escape like {@code `%S`}
              */
             private String createSchemaSqlTemplate = "CREATE SCHEMA IF NOT EXISTS %S";
-        
+
         }
     }
 
@@ -2768,7 +2768,7 @@ public class IsisConfiguration {
         }
     }
 
-    
+
     private final Extensions extensions = new Extensions();
     @Data
     public static class Extensions {
diff --git a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java
index 9a49559..e5024c1 100644
--- a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java
+++ b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/IsisInteraction.java
@@ -26,6 +26,9 @@ import java.util.concurrent.atomic.LongAdder;
 
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.iactn.ActionInvocation;
+import org.apache.isis.applib.services.iactn.Execution;
+import org.apache.isis.applib.services.iactn.PropertyEdit;
 import org.apache.isis.applib.services.metrics.MetricsService;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -154,7 +157,7 @@ public class IsisInteraction implements InternalInteraction {
     }
 
     private void start(
-            final IsisInteraction.Execution<?,?> execution,
+            final Execution<?,?> execution,
             final ClockService clockService,
             final MetricsService metricsService,
             final Command command) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/execution/InternalInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/execution/InternalInteraction.java
index edd02b5..af0458e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/execution/InternalInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/execution/InternalInteraction.java
@@ -22,7 +22,10 @@ import java.util.concurrent.Callable;
 
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.iactn.ActionInvocation;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.PropertyEdit;
 import org.apache.isis.applib.services.metrics.MetricsService;
 
 /**
@@ -40,10 +43,10 @@ public interface InternalInteraction extends Interaction {
 
     /**
      * Use the provided {@link MemberExecutor} to invoke an action, with the provided
-     * {@link org.apache.isis.applib.services.iactn.Interaction.ActionInvocation} capturing 
+     * {@link ActionInvocation} capturing
      * the details of said action.
      * <p>
-     * Because this both pushes an {@link org.apache.isis.applib.services.iactn.Interaction.Execution} to
+     * Because this both pushes an {@link Execution} to
      * represent the action invocation and then pops it, that completed
      * execution is accessible at {@link Interaction#getPriorExecution()}.
      */
@@ -56,10 +59,10 @@ public interface InternalInteraction extends Interaction {
 
     /**
      * Use the provided {@link MemberExecutor} to edit a property, with the provided
-     * {@link org.apache.isis.applib.services.iactn.Interaction.PropertyEdit} 
+     * {@link PropertyEdit}
      * capturing the details of said property edit.
      * <p>
-     * Because this both pushes an {@link org.apache.isis.applib.services.iactn.Interaction.Execution} to
+     * Because this both pushes an {@link Execution} to
      * represent the property edit and then pops it, that completed
      * execution is accessible at {@link Interaction#getPriorExecution()}.
      */
@@ -69,5 +72,5 @@ public interface InternalInteraction extends Interaction {
             final ClockService clockService,
             final MetricsService metricsService,
             final Command command);
-    
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/execution/MemberExecutorService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/execution/MemberExecutorService.java
index 4e615ab..97a6cfa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/execution/MemberExecutorService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/execution/MemberExecutorService.java
@@ -21,8 +21,8 @@ package org.apache.isis.core.metamodel.execution;
 import java.lang.reflect.Method;
 import java.util.Optional;
 
-import org.apache.isis.applib.services.iactn.Interaction.ActionInvocation;
-import org.apache.isis.applib.services.iactn.Interaction.PropertyEdit;
+import org.apache.isis.applib.services.iactn.ActionInvocation;
+import org.apache.isis.applib.services.iactn.PropertyEdit;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -40,11 +40,11 @@ import lombok.NonNull;
  * Used by ActionInvocationFacets and PropertySetterOrClearFacets to submit their executions.
  * <p>
  * That is, invoke a domain action or edit a domain property.
- * 
+ *
  * @since 2.0
  */
 public interface MemberExecutorService {
-    
+
     @Deprecated // just a refactoring step
     @FunctionalInterface
     interface ActionExecutorFactory {
@@ -55,7 +55,7 @@ public interface MemberExecutorService {
                 ManagedObject mixinElseRegularAdapter,
                 ManagedObject mixedInAdapter);
     }
-    
+
     @Deprecated // just a refactoring step
     @FunctionalInterface
     interface PropertyExecutorFactory {
@@ -67,45 +67,45 @@ public interface MemberExecutorService {
                 InteractionHead head,
                 EditingVariant editingVariant);
     }
-    
+
     /**
      * Optionally, the currently active {@link InternalInteraction} for the calling thread.
      */
     Optional<InternalInteraction> getInteraction();
 
     // -- SHORTCUTS
-    
+
     default InternalInteraction getInteractionIfAny() {
         return getInteraction().orElse(null);
     }
-    
+
     default InternalInteraction getInteractionElseFail() {
         return getInteraction().orElseThrow(()->_Exceptions
                 .unrecoverable("needs an InteractionSession on current thread"));
     }
-    
+
     // -- REFACTORING
 
     //TODO implementations of this service should also handle domain object events, don't delegate this responsibility to facets
     ManagedObject invokeAction(
-            @NonNull ObjectAction owningAction, 
+            @NonNull ObjectAction owningAction,
             @NonNull InteractionHead head,
-            @NonNull Can<ManagedObject> argumentAdapters, 
+            @NonNull Can<ManagedObject> argumentAdapters,
             @NonNull InteractionInitiatedBy interactionInitiatedBy,
             @NonNull Method method,
-            @NonNull ActionExecutorFactory actionExecutorFactory, 
-            @NonNull FacetHolder facetHolder, 
+            @NonNull ActionExecutorFactory actionExecutorFactory,
+            @NonNull FacetHolder facetHolder,
             @NonNull IdentifiedHolder identifiedHolder);
 
     //TODO implementations of this service should also handle domain object events, don't delegate this responsibility to facets
     ManagedObject setOrClearProperty(
-            @NonNull OneToOneAssociation owningProperty, 
-            @NonNull InteractionHead head, 
+            @NonNull OneToOneAssociation owningProperty,
+            @NonNull InteractionHead head,
             @NonNull ManagedObject newValueAdapter,
             @NonNull InteractionInitiatedBy interactionInitiatedBy,
             @NonNull PropertyExecutorFactory propertyExecutorFactory,
             @NonNull FacetHolder facetHolder,
             @NonNull IdentifiedHolder identifiedHolder,
             @NonNull EditingVariant editingVariant);
-         
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 1386db5..936d08e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -28,7 +28,7 @@ import java.util.Objects;
 
 import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
-import org.apache.isis.applib.services.iactn.Interaction.ActionInvocation;
+import org.apache.isis.applib.services.iactn.ActionInvocation;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.collections.Can;
@@ -73,7 +73,7 @@ implements ImperativeFacet {
             final ObjectSpecification onType,
             final ObjectSpecification returnType,
             final FacetHolder holder) {
-        
+
         super(holder);
         this.eventType = eventType;
         this.method = method;
@@ -104,7 +104,7 @@ implements ImperativeFacet {
             final Can<ManagedObject> argumentAdapters,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        val executionResult = 
+        val executionResult =
                 getTransactionService().callWithinCurrentTransactionElseCreateNew(()->
                     doInvoke(owningAction, head, argumentAdapters, interactionInitiatedBy));
 
@@ -115,7 +115,7 @@ implements ImperativeFacet {
                 .orElse(null);
     }
 
-    @Override 
+    @Override
     public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
@@ -123,31 +123,31 @@ implements ImperativeFacet {
         attributeMap.put("returnType", returnType);
         attributeMap.put("eventType", eventType);
     }
-    
+
     @Override
     protected String toStringValues() {
         return "method=" + method;
     }
-    
+
     // -- HELPER
-    
+
     private ManagedObject doInvoke(
             final ObjectAction owningAction,
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        
+
         _Assert.assertEquals(owningAction.getParameterCount(), argumentAdapters.size(),
                 "action's parameter count and provided argument count must match");
-        
+
         return getMemberExecutor().invokeAction(
-                owningAction, 
-                head, 
-                argumentAdapters, 
-                interactionInitiatedBy, 
+                owningAction,
+                head,
+                argumentAdapters,
+                interactionInitiatedBy,
                 method,
-                DomainEventMemberExecutor::new, 
-                getFacetHolder(), 
+                DomainEventMemberExecutor::new,
+                getFacetHolder(),
                 getIdentified());
     }
 
@@ -162,7 +162,7 @@ implements ImperativeFacet {
     }
 
     private Object invokeMethodElseFromCache(
-            final ManagedObject targetAdapter, 
+            final ManagedObject targetAdapter,
             final Can<ManagedObject> arguments)
                     throws IllegalAccessException, InvocationTargetException {
 
@@ -210,7 +210,7 @@ implements ImperativeFacet {
         final ManagedObject clonedAdapter = getObjectManager().adapt(clone);
         return clonedAdapter;
     }
-    
+
     private QueryResultsCache getQueryResultsCache() {
         return serviceRegistry.lookupServiceElseFail(QueryResultsCache.class);
     }
@@ -218,11 +218,11 @@ implements ImperativeFacet {
     private InteractionDtoServiceInternal getInteractionDtoServiceInternal() {
         return serviceRegistry.lookupServiceElseFail(InteractionDtoServiceInternal.class);
     }
-    
+
     @RequiredArgsConstructor
-    private final class DomainEventMemberExecutor 
+    private final class DomainEventMemberExecutor
             implements InternalInteraction.MemberExecutor<ActionInvocation> {
-        
+
         private final Can<ManagedObject> argumentAdapters;
         private final ManagedObject targetAdapter;
         private final ObjectAction owningAction;
@@ -241,9 +241,9 @@ implements ImperativeFacet {
                 // update the current execution with the DTO (memento)
                 val invocationDto = getInteractionDtoServiceInternal()
                 .asActionInvocationDto(owningAction, mixinElseRegularAdapter, argumentAdapters);
-                
+
                 currentExecution.setDto(invocationDto);
-                
+
                 val head = InteractionHead.mixedIn(targetAdapter, mixedInAdapter);
 
 
@@ -264,7 +264,7 @@ implements ImperativeFacet {
 
                 // invoke method
                 val resultPojo = invokeMethodElseFromCache(targetAdapter, argumentAdapters);
-                ManagedObject resultAdapterPossiblyCloned = 
+                ManagedObject resultAdapterPossiblyCloned =
                         cloneIfViewModelCloneable(resultPojo, mixinElseRegularAdapter);
 
                 // ... post the executed event
@@ -277,7 +277,7 @@ implements ImperativeFacet {
 
                 final Object returnValue = actionDomainEvent.getReturnValue();
                 if(returnValue != resultPojo) {
-                    resultAdapterPossiblyCloned = 
+                    resultAdapterPossiblyCloned =
                             cloneIfViewModelCloneable(returnValue, mixinElseRegularAdapter);
                 }
                 return UnwrapUtil.single(resultAdapterPossiblyCloned);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacet.java
index 38b8ac1..f6d9208 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacet.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.members.publish.execution;
 
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,22 +29,22 @@ import lombok.NonNull;
 import lombok.val;
 
 /**
- * Indicates that details of the action invocation or property edit, 
- * captured by an {@link org.apache.isis.applib.services.iactn.Interaction.Execution},
- * should be dispatched via {@link ExecutionPublisher} to all subscribed 
+ * Indicates that details of the action invocation or property edit,
+ * captured by an {@link Execution},
+ * should be dispatched via {@link ExecutionPublisher} to all subscribed
  * {@link ExecutionSubscriber}s.
  * <p>
- * Corresponds to annotating the action method or property using 
+ * Corresponds to annotating the action method or property using
  * {@code @Action/@Property(executionPublishing=ENABLED)}
- * 
+ *
  * @since 2.0
- * 
+ *
  */
 public interface ExecutionPublishingFacet extends Facet {
-    
+
     public static boolean isPublishingEnabled(final @NonNull FacetHolder facetHolder) {
         val executionPublishingFacet = facetHolder.getFacet(ExecutionPublishingFacet.class);
         return executionPublishingFacet!=null;
     }
-    
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
index f8238c9..5cd6a74 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
@@ -24,7 +24,7 @@ import java.util.Objects;
 
 import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
-import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.PropertyEdit;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.execution.InternalInteraction;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -151,10 +151,10 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
         return getTransactionService()
                 .callWithinCurrentTransactionElseCreateNew(() ->
                     doSetOrClearProperty(
-                            style, 
-                            owningProperty, 
-                            InteractionHead.simple(targetAdapter), 
-                            newValueAdapter, 
+                            style,
+                            owningProperty,
+                            InteractionHead.simple(targetAdapter),
+                            newValueAdapter,
                             interactionInitiatedBy))
                 .optionalElseFail()
                 .orElse(null);
@@ -162,7 +162,7 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
 
     @RequiredArgsConstructor
     private final class DomainEventMemberExecutor
-            implements InternalInteraction.MemberExecutor<Interaction.PropertyEdit> {
+            implements InternalInteraction.MemberExecutor<PropertyEdit> {
 
         private final ManagedObject newValueAdapter;
         private final OneToOneAssociation owningProperty;
@@ -173,7 +173,7 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
         private final InteractionHead head;
         private final EditingVariant style;
 
-        public Object execute(Interaction.PropertyEdit currentExecution) {
+        public Object execute(PropertyEdit currentExecution) {
 
             // TODO: REVIEW - is this safe to do?
             ManagedObject newValueAdapterMutatable = newValueAdapter;
@@ -253,7 +253,7 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
         if(!editingVariant.hasCorrespondingFacet(this)) {
             return head.getTarget();
         }
-        
+
         return getMemberExecutor().setOrClearProperty(
                 owningProperty,
                 head,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/ExecutionPublisher.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/ExecutionPublisher.java
index a5a6ebc..a41a9c2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/ExecutionPublisher.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/ExecutionPublisher.java
@@ -20,7 +20,7 @@ package org.apache.isis.core.metamodel.services.publishing;
 
 import java.util.function.Supplier;
 
-import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
 
 /**
@@ -29,9 +29,9 @@ import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
  */
 public interface ExecutionPublisher {
 
-    void publishActionInvocation(Interaction.Execution<?,?> execution);
+    void publishActionInvocation(Execution<?,?> execution);
 
-    void publishPropertyEdit(Interaction.Execution<?,?> execution);
+    void publishPropertyEdit(Execution<?,?> execution);
 
     /**
      * Slightly hokey wormhole (anti)pattern to disable publishing for mixin associations.
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
index 758148a..f40dc60 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
@@ -40,7 +40,7 @@ import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandExecutorService;
 import org.apache.isis.applib.services.command.CommandOutcomeHandler;
-import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.applib.services.sudo.SudoService;
 import org.apache.isis.applib.services.user.UserMemento;
@@ -159,7 +159,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
             log.warn("Exception when executing : {}",
                     dto.getMember().getLogicalMemberIdentifier(), ex);
         });
-        
+
         return handleOutcomeAndSetCompletedAt(commandUpdater, result);
     }
 
@@ -238,7 +238,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
                 final Object targetObject = bookmarkService.lookup(bookmark);
 
                 val targetAdapter = adapterFor(targetObject);
-                
+
                 if(ManagedObjects.isNullOrUnspecifiedOrEmpty(targetAdapter)) {
                     throw _Exceptions.unrecoverableFormatted("cannot recreate ManagedObject from bookmark %s", bookmark);
                 }
@@ -259,7 +259,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
             final CommandOutcomeHandler outcomeHandler,
             final Result<Bookmark> result) {
 
-        
+
         //
         // copy over the outcome
         //
@@ -274,7 +274,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
         //
         val interaction = interactionContextProvider.get().currentInteractionElseFail();
 
-        final Interaction.Execution<?, ?> priorExecution = interaction.getPriorExecution();
+        final Execution<?, ?> priorExecution = interaction.getPriorExecution();
         if(priorExecution != null) {
 
             if (outcomeHandler.getStartedAt() == null) {
@@ -344,7 +344,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
     private static ObjectAction findActionElseNull(
             final ObjectSpecification specification,
             final String localActionId) {
-        
+
         return specification.getAction(localActionId).orElse(null);
     }
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
index d667dcc..f9afd3d 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
@@ -34,7 +34,9 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.ActionInvocation;
+import org.apache.isis.applib.services.iactn.Execution;
+import org.apache.isis.applib.services.iactn.PropertyEdit;
 import org.apache.isis.applib.services.metrics.MetricsService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.collections.Can;
@@ -133,10 +135,10 @@ implements MemberExecutorService {
         val targetClass = CommandUtil.targetClassNameFor(targetAdapter);
 
         val actionInvocation =
-                new Interaction.ActionInvocation(
+                new ActionInvocation(
                         interaction, actionId, targetPojo, argumentPojos, targetMemberName,
                         targetClass);
-        final InternalInteraction.MemberExecutor<Interaction.ActionInvocation> memberExecution =
+        final InternalInteraction.MemberExecutor<ActionInvocation> memberExecution =
                 actionExecutorFactory.createExecutor(
                         argumentAdapters, targetAdapter, owningAction,
                         targetAdapter, mixedInAdapter);
@@ -145,7 +147,7 @@ implements MemberExecutorService {
         interaction.execute(memberExecution, actionInvocation, clockService, metricsService.get(), command);
 
         // handle any exceptions
-        final Interaction.Execution<ActionInvocationDto, ?> priorExecution =
+        final Execution<ActionInvocationDto, ?> priorExecution =
                 _Casts.uncheckedCast(interaction.getPriorExecution());
 
         val executionExceptionIfAny = priorExecution.getThrew();
@@ -205,7 +207,7 @@ implements MemberExecutorService {
         val targetMemberName = CommandUtil.targetMemberNameFor(owningProperty);
         val targetClass = CommandUtil.targetClassNameFor(targetManagedObject);
 
-        val propertyEdit = new Interaction.PropertyEdit(interaction, propertyId, target, argValue, targetMemberName, targetClass);
+        val propertyEdit = new PropertyEdit(interaction, propertyId, target, argValue, targetMemberName, targetClass);
         val executor = propertyExecutorFactory
                 .createExecutor(newValueAdapter, owningProperty, targetManagedObject,
                         interactionInitiatedBy, head, editingVariant);
@@ -214,7 +216,7 @@ implements MemberExecutorService {
         val targetPojo = interaction.execute(executor, propertyEdit, clockService, metricsService.get(), command);
 
         // handle any exceptions
-        final Interaction.Execution<?, ?> priorExecution = interaction.getPriorExecution();
+        final Execution<?, ?> priorExecution = interaction.getPriorExecution();
 
         // TODO: should also sync DTO's 'threw' attribute here...?
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoServiceInternalDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoServiceInternalDefault.java
index f6ac707..3f3457a 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoServiceInternalDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoServiceInternalDefault.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.InteractionContext;
+import org.apache.isis.applib.services.iactn.Sequence;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
@@ -65,18 +66,18 @@ public class InteractionDtoServiceInternalDefault implements InteractionDtoServi
     @Inject private BookmarkService bookmarkService;
     @Inject private javax.inject.Provider<InteractionContext> interactionContextProvider;
     @Inject private UserService userService;
-    
+
     @Override
     public ActionInvocationDto asActionInvocationDto(
             final ObjectAction objectAction,
             final ManagedObject targetAdapter,
             final Can<ManagedObject> argumentAdapters) {
-        
+
         _Assert.assertEquals(objectAction.getParameterCount(), argumentAdapters.size(),
                 "action's parameter count and provided argument count must match");
-        
+
         final Interaction interaction = interactionContextProvider.get().currentInteractionElseFail();
-        final int nextEventSequence = interaction.next(Interaction.Sequence.INTERACTION.id());
+        final int nextEventSequence = interaction.next(Sequence.INTERACTION.id());
 
         final Bookmark targetBookmark = targetAdapter.getRootOid()
                 .map(RootOid::asBookmark)
@@ -122,7 +123,7 @@ public class InteractionDtoServiceInternalDefault implements InteractionDtoServi
 
         final Interaction interaction = interactionContextProvider.get().currentInteractionElseFail();
 
-        final int nextEventSequence = interaction.next(Interaction.Sequence.INTERACTION.id());
+        final int nextEventSequence = interaction.next(Sequence.INTERACTION.id());
 
         final Bookmark targetBookmark = targetAdapter.getRootOid()
                 .map(RootOid::asBookmark)
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ExecutionPublisherDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ExecutionPublisherDefault.java
index 66c9082..ac48b9a 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ExecutionPublisherDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ExecutionPublisherDefault.java
@@ -34,7 +34,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.InteractionScope;
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.having.HasEnabling;
@@ -51,13 +51,13 @@ import lombok.val;
 @InteractionScope
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 //@Log4j2
-public class ExecutionPublisherDefault 
+public class ExecutionPublisherDefault
 implements ExecutionPublisher {
 
     private final List<ExecutionSubscriber> subscribers;
-    
+
     private Can<ExecutionSubscriber> enabledSubscribers;
-    
+
     @PostConstruct
     public void init() {
         enabledSubscribers = Can.ofCollection(subscribers)
@@ -65,15 +65,15 @@ implements ExecutionPublisher {
     }
 
     @Override
-    public void publishActionInvocation(final Interaction.Execution<?,?> execution) {
+    public void publishActionInvocation(final Execution<?,?> execution) {
         notifySubscribers(execution);
     }
 
     @Override
-    public void publishPropertyEdit(final Interaction.Execution<?,?> execution) {
+    public void publishPropertyEdit(final Execution<?,?> execution) {
         notifySubscribers(execution);
     }
-    
+
     @Override
     public <T> T withPublishingSuppressed(final Supplier<T> block) {
         try {
@@ -86,7 +86,7 @@ implements ExecutionPublisher {
 
     // -- HELPERS
 
-    private void notifySubscribers(final Interaction.Execution<?,?> execution) {
+    private void notifySubscribers(final Execution<?,?> execution) {
         if(isSuppressed()) {
             return;
         }
@@ -96,12 +96,12 @@ implements ExecutionPublisher {
     }
 
     private final LongAdder suppressionRequestCounter = new LongAdder();
-    
+
     private boolean isSuppressed() {
-        return enabledSubscribers == null 
-                || enabledSubscribers.isEmpty() 
+        return enabledSubscribers == null
+                || enabledSubscribers.isEmpty()
                 || suppressionRequestCounter.intValue() > 0;
     }
-    
+
 
 }
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
index c632a8f..a223383 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
@@ -28,6 +28,7 @@ import javax.annotation.Nullable;
 import org.apache.isis.applib.annotation.EntityChangeKind;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
 import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.Sequence;
 import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -44,15 +45,15 @@ import lombok.experimental.UtilityClass;
 
 @UtilityClass
 class ChangingEntitiesFactory {
-    
+
     @Nullable
     public static EntityChanges createChangingEntities(
             final java.sql.Timestamp completedAt,
             final String userName,
             final EntityChangeTrackerDefault entityChangeTracker) {
-        
+
         // take a copy of enlisted adapters ... the JDO implementation of the PublishingService
-        // creates further entities which would be enlisted; 
+        // creates further entities which would be enlisted;
         // taking copy of the map avoids ConcurrentModificationException
 
         val changeKindByEnlistedAdapter = new HashMap<>(
@@ -66,15 +67,15 @@ class ChangingEntitiesFactory {
                 completedAt,
                 userName,
                 entityChangeTracker.currentInteraction(),
-                entityChangeTracker.numberEntitiesLoaded(), 
+                entityChangeTracker.numberEntitiesLoaded(),
                 entityChangeTracker.numberAuditedEntityPropertiesModified(),
                 changeKindByEnlistedAdapter);
-        
+
         return changingEntities;
     }
-    
+
     // -- HELPER
-    
+
     private static EntityChanges newChangingEntities(
             final java.sql.Timestamp completedAt,
             final String userName,
@@ -84,17 +85,17 @@ class ChangingEntitiesFactory {
             final Map<ManagedObject, EntityChangeKind> changeKindByEnlistedAdapter) {
 
         val uniqueId = interaction.getUniqueId();
-        final int nextEventSequence = interaction.next(Interaction.Sequence.INTERACTION.id());
+        final int nextEventSequence = interaction.next(Sequence.INTERACTION.id());
 
         return new SimpleChangingEntities(
                     uniqueId, nextEventSequence,
                     userName, completedAt,
-                    numberEntitiesLoaded, 
-                    numberEntityPropertiesModified, 
+                    numberEntitiesLoaded,
+                    numberEntityPropertiesModified,
                     ()->newDto(
                             uniqueId, nextEventSequence,
                             userName, completedAt,
-                            numberEntitiesLoaded,         
+                            numberEntitiesLoaded,
                             numberEntityPropertiesModified,
                             changeKindByEnlistedAdapter));
     }
@@ -105,11 +106,11 @@ class ChangingEntitiesFactory {
             final int numberEntitiesLoaded,
             final int numberEntityPropertiesModified,
             final Map<ManagedObject, EntityChangeKind> changeKindByEnlistedAdapter) {
-        
+
         // calculate the inverse of 'changesByAdapter'
-        final ListMultimap<EntityChangeKind, ManagedObject> adaptersByChange = 
+        final ListMultimap<EntityChangeKind, ManagedObject> adaptersByChange =
             _Maps.invertToListMultimap(changeKindByEnlistedAdapter);
-        
+
         val objectsDto = new ObjectsDto();
 
         objectsDto.setCreated(oidsDtoFor(adaptersByChange, EntityChangeKind.CREATE));
@@ -135,22 +136,22 @@ class ChangingEntitiesFactory {
     }
 
     private static OidsDto oidsDtoFor(
-            final ListMultimap<EntityChangeKind, ManagedObject> adaptersByChange, 
+            final ListMultimap<EntityChangeKind, ManagedObject> adaptersByChange,
             final EntityChangeKind kind) {
         val oidsDto = new OidsDto();
 
         _NullSafe.stream(adaptersByChange.get(kind))
-        .map((final ManagedObject adapter) -> 
+        .map((final ManagedObject adapter) ->
             ManagedObjects.identify(adapter)
             .map(RootOid::asOidDto)
             .orElse(null)
         )
         .filter(Objects::nonNull)
         .forEach(oidsDto.getOid()::add);
-        
+
         return oidsDto;
     }
 
 
-    
+
 }