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 2022/07/12 12:43:31 UTC

[isis] 01/01: ISIS-3002: wip, adding executionlog and scaffolding for executionoutbox

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

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

commit f799756156483d7db288df5b4796a917c4f4d06b
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Jul 12 13:40:34 2022 +0100

    ISIS-3002: wip, adding executionlog and scaffolding for executionoutbox
    
    also
    - renames HasTransactionId -> HasInteractionAndSequence; docs to disambiguate usages
    - introduces HasInteractionDto, similar to HasCommandDto
    - rename DomainChangeRecord.ChangeType's PUBLISHED_INTERACTION -> EXECUTION
    - removes most of @PropertyLayout for Command; rely on .layout.xml
    - renames commandlog's jpa -> persistence-jpa, jdo -> persistence-jdo
    - renames vw/exceldownload/ui -> vw/exceldownload/wicket-ui
    - duplicate <dependencyManagement> for each of the extension modules so user can import either top-level extensions pom or more specific extension module pom
    - adds AttributeConverters for JPA to mirror those we have for JDO (in particular, CommandDto and InteractionDto etc).
    - fixes schema for CommandLog
    - moves some default impls into DomainChangeRecord (preValue, postValue etc)
    - global change
      - "o.a.i.persistence.jdo.datanucleus5" -> "o.a.i.persistence.jdo.datanucleus"
      - "o.a.i.xxx.xxx.persistence.jdo.dn5" -> "o.a.i.xxx.xxx.persistence.jdo.dn"
---
 antora/playbooks/site-extensions.yml               |  18 +
 antora/playbooks/site.yml                          |   6 +
 .../applib/mixins/system/DomainChangeRecord.java   | 162 +++++---
 .../mixins/system/HasInteractionIdAndSequence.java |  93 +++++
 ...Object.java => HasTarget_openTargetObject.java} |  13 +-
 .../applib/mixins/system/HasTransactionId.java     |  71 ----
 .../applib/services/iactn/HasInteractionDto.java   |  47 +++
 .../services/publishing/spi/EntityChanges.java     |   8 +-
 .../isis/applib/services/xactn/TransactionId.java  |   8 +-
 .../config/presets/DebugPersistence.properties     |   6 +-
 .../DebugTransactionScopedServices.properties      |   2 +-
 .../images/jpa/JavaAwtBufferedImageJpa.java        |   2 +-
 .../webapp/wicket/jdo/DemoAppWicketJdo.java        |   8 +-
 extensions/applib/excel/pom.xml                    |  25 ++
 .../adoc/modules/command-log/pages/about.adoc      |   4 +-
 extensions/core/commandlog/applib/pom.xml          |   4 +-
 .../HasInteractionId_commandLogEntry.java          |  41 ++
 .../commandlog/applib/dom/CommandLogEntry.java     | 292 ++++++--------
 .../applib/dom/CommandLogEntry.layout.fallback.xml |  29 +-
 .../applib/dom/CommandLogEntryRepository.java      |  10 +-
 .../subscriber/CommandSubscriberForCommandLog.java |   7 +-
 .../logging-dn-enhance.properties                  |   0
 .../commandlog/{jdo => persistence-jdo}/pom.xml    |  10 +-
 .../src/main/java/META-INF/persistence.xml         |   0
 .../commandlog/jdo/IsisModuleExtCommandLogJdo.java |   0
 .../commandlog/jdo/dom/CommandLogEntry.java        |  83 ++--
 .../jdo/dom/CommandLogEntryRepository.java         |   0
 .../commandlog/{jpa => persistence-jpa}/pom.xml    |  10 +-
 .../commandlog/jpa/IsisModuleExtCommandLogJpa.java |   0
 .../commandlog/jpa/dom/CommandLogEntry.java        |  44 ++-
 .../jpa/dom/CommandLogEntryRepository.java         |   0
 .../resources/META-INF/orm-commandlog.template     |   0
 extensions/core/commandlog/pom.xml                 |  24 +-
 extensions/core/commandreplay/pom.xml              |  13 +
 .../analysis/CommandReplayAnalysisService.java     |   8 +-
 .../core/executionlog/adoc/antora.yml              |   8 +-
 .../core/executionlog/adoc/modules/antora.yml      |   8 +-
 .../adoc/modules/executionlog/nav.adoc             |   4 +
 .../adoc/modules/executionlog/pages/about.adoc     |  11 +
 .../modules/executionlog/partials/module-nav.adoc  |   6 +
 .../{commandlog => executionlog}/applib/pom.xml    |  14 +-
 .../applib/IsisModuleExtExecutionLogApplib.java    |  57 +++
 .../ExecutionLogEntry_siblingExecutions.java       |  36 ++
 .../HasInteractionId_executionLogEntries.java      |  33 ++
 .../executionlog/applib/dom/ExecutionLogEntry.java | 432 +++++++++++++++++++++
 .../dom/ExecutionLogEntry.layout.fallback.xml      |  97 +++++
 .../executionlog/applib/dom/ExecutionLogEntry.png  | Bin 0 -> 541 bytes
 .../applib/dom/ExecutionLogEntryPK.java            |  71 ++++
 .../applib/dom/ExecutionLogEntryRepository.java    |  14 +
 .../applib/dom/ExecutionLogEntryType.java          |   6 +
 .../applib/spiimpl/ExecutionSubscriberForLog.java  |  24 ++
 .../executionlog/applib/util/BigDecimalUtils.java  |  27 ++
 .../jdo => executionlog/persistence-jdo}/pom.xml   |  14 +-
 .../.gitkeep                                       |   0
 .../.gitkeep                                       |   0
 .../persistence-jpa/src/main/java}/.gitkeep        |   0
 .../persistence-jpa/src/test/java}/.gitkeep        |   0
 .../core/{commandreplay => executionlog}/pom.xml   |  31 +-
 .../core/executionoutbox/adoc/antora.yml           |   8 +-
 .../core/executionoutbox/adoc/modules/antora.yml   |   8 +-
 .../adoc/modules/executionoutbox/nav.adoc          |   4 +
 .../adoc/modules/executionoutbox/pages/about.adoc  |  16 +
 .../executionoutbox/partials/module-nav.adoc       |   6 +
 .../{commandlog => executionoutbox}/applib/pom.xml |  14 +-
 .../applib/IsisModuleExtExecutionOutboxApplib.java |  56 +++
 .../applib/src/test/java}/.gitkeep                 |   0
 .../jdo => executionoutbox/dto}/pom.xml            |  26 +-
 .../dto/src/main/java}/.gitkeep                    |   0
 .../dto/src/test/java}/.gitkeep                    |   0
 .../persistence-jdo/src/main/java}/.gitkeep        |   0
 .../persistence-jdo/src/test/java}/.gitkeep        |   0
 .../persistence-jpa/src/main/java}/.gitkeep        |   0
 .../persistence-jpa/src/test/java}/.gitkeep        |   0
 .../{commandreplay => executionoutbox}/pom.xml     |  49 ++-
 .../jdo => executionoutbox/restapi}/pom.xml        |  25 +-
 .../restapi/src/main/java}/.gitkeep                |   0
 .../restapi/src/test/java}/.gitkeep                |   0
 .../jdo => executionoutbox/restclient}/pom.xml     |  25 +-
 .../restclient/src/main/java}/.gitkeep             |   0
 .../restclient/src/test/java}/.gitkeep             |   0
 extensions/core/flyway/pom.xml                     |  25 +-
 extensions/pom.xml                                 | 209 ++++++++--
 .../jdo/permission/dom/ApplicationPermission.java  |   3 +
 .../secman/jdo/role/dom/ApplicationRole.java       |   3 +
 .../secman/jdo/tenancy/dom/ApplicationTenancy.java |   7 +-
 .../secman/jdo/user/dom/ApplicationUser.java       |   7 +-
 .../jpa/permission/dom/ApplicationPermission.java  |   3 +
 .../secman/jpa/role/dom/ApplicationRole.java       |   5 +-
 .../secman/jpa/tenancy/dom/ApplicationTenancy.java |   6 +
 .../secman/jpa/user/dom/ApplicationUser.java       |   6 +-
 extensions/security/secman/pom.xml                 |  10 +
 extensions/security/sessionlog/pom.xml             |   3 +-
 extensions/vro/cors/pom.xml                        |  28 +-
 extensions/vw/exceldownload/pom.xml                |  12 +-
 .../vw/exceldownload/{ui => wicket-ui}/pom.xml     |   6 +-
 .../ui/IsisModuleExtExcelDownloadUi.java           |   0
 .../CollectionContentsAsExcelFactory.java          |   0
 .../ui/components/ExcelFileDownloadLink.java       |   0
 .../ui/components/ExcelFileModel.java              |   0
 .../ui/components/_TimeConversion.java             |   0
 extensions/vw/fullcalendar/pom.xml                 |  26 ++
 extensions/vw/pdfjs/pom.xml                        |  35 ++
 .../snapshots/demo2_0_0/RESTFUL_DOMAIN_TYPES.kt    |   8 +-
 .../simpleapp1_16_0/RESTFUL_DOMAIN_TYPES.kt        |   2 +-
 .../src/main/resources/META-INF/MANIFEST.MF        |   4 +-
 .../jdo/datanucleus/src/main/resources/plugin.xml  |  48 +--
 .../IsisModulePersistenceJpaIntegration.java       |   2 +-
 .../applib/IsisBookmarkConverter.java              |  23 +-
 .../applib/IsisLocalResourcePathConverter.java     |  19 +-
 .../typeconverters/applib/IsisMarkupConverter.java |  20 +-
 .../applib/IsisPasswordConverter.java              |  18 +-
 .../JavaAwtBufferedImageByteArrayConverter.java    |   2 +-
 .../schema/v2/IsisChangesDtoConverter.java         |  23 +-
 .../schema/v2/IsisCommandDtoConverter.java         |  23 +-
 .../schema/v2/IsisInteractionDtoConverter.java     |  23 +-
 .../schema/v2/IsisOidDtoConverter.java             |  21 +-
 .../time/IsoOffsetTimeConverter.java               |  19 +-
 .../time/IsoZonedDateTimeConverter.java            |  20 +-
 .../jdo/JdoEntityChangePublishingTest.java         |   2 +-
 .../publishing/jdo/JdoCommandPublishingTest.java   |   4 +-
 .../publishing/jdo/JdoEntityPublishingTest.java    |   2 +-
 .../publishing/jdo/JdoExecutionPublishingTest.java |   4 +-
 .../bootstrapping/builtin-domain-services.list     |   2 +-
 .../bootstrapping/builtin-domain-services.list     |   2 +-
 testing/fixtures/pom.xml                           |  28 +-
 .../IsisModuleValAsciidocPersistenceJdoDn.java}    |   4 +-
 .../converters/IsisAsciiDocConverter.java          |   2 +-
 .../jdo/src/main/resources/META-INF/MANIFEST.MF    |   4 +-
 .../persistence/jdo/src/main/resources/plugin.xml  |  34 +-
 .../IsisModuleValMarkdownPersistenceJdoDn.java}    |   4 +-
 .../converters/IsisMarkdownConverter.java          |   2 +-
 .../jdo/src/main/resources/META-INF/MANIFEST.MF    |   4 +-
 .../persistence/jdo/src/main/resources/plugin.xml  |  34 +-
 133 files changed, 2190 insertions(+), 789 deletions(-)

diff --git a/antora/playbooks/site-extensions.yml b/antora/playbooks/site-extensions.yml
index 911d35bcc4..ef5c17d874 100644
--- a/antora/playbooks/site-extensions.yml
+++ b/antora/playbooks/site-extensions.yml
@@ -46,16 +46,34 @@ content:
     - url: .
       start_path: extensions/core/commandreplay/adoc # extensions
       branches: HEAD
+    - url: .
+      start_path: extensions/core/executionlog/adoc # extensions
+      branches: HEAD
+    - url: .
+      start_path: extensions/core/executionoutbox/adoc # extensions
+      branches: HEAD
     - url: .
       start_path: extensions/core/flyway/adoc # userguide
       branches: HEAD
+    - url: .
+      start_path: extensions/core/quartz/adoc # userguide
+      branches: HEAD
 
+    - url: .
+      start_path: extensions/security/audittrail/adoc # security
+      branches: HEAD
     - url: .
       start_path: extensions/security/secman/adoc # security
       branches: HEAD
+    - url: .
+      start_path: extensions/security/sessionlog/adoc # security
+      branches: HEAD
     - url: .
       start_path: extensions/security/shiro-realm-ldap/adoc # security
       branches: HEAD
+    - url: .
+      start_path: extensions/security/spring-oauth2/src/main/adoc # security
+      branches: HEAD
 
     - url: .
       start_path: extensions/vro/cors/adoc # vro
diff --git a/antora/playbooks/site.yml b/antora/playbooks/site.yml
index 293e7e527c..a761cb2c57 100644
--- a/antora/playbooks/site.yml
+++ b/antora/playbooks/site.yml
@@ -117,6 +117,12 @@ content:
     - url: .
       start_path: extensions/core/commandreplay/adoc # extensions
       branches: HEAD
+    - url: .
+      start_path: extensions/core/executionlog/adoc # extensions
+      branches: HEAD
+    - url: .
+      start_path: extensions/core/executionoutbox/adoc # extensions
+      branches: HEAD
     - url: .
       start_path: extensions/core/flyway/adoc # userguide
       branches: HEAD
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java
index c39fa60f16..72234bd4cd 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java
@@ -25,6 +25,7 @@ import java.util.UUID;
 
 import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
@@ -35,7 +36,7 @@ import org.apache.isis.applib.services.bookmark.HasTarget;
 
 /**
  * Allows domain objects that represents some sort of recorded change to a
- * domain object (commands, audit entries, published interactions) to act
+ * domain object (commands, executions, audit entries) to act
  * as a mixee in order that other modules can contribute behaviour.
  *
  * @since 2.0 {@index}
@@ -52,7 +53,7 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTa
     enum ChangeType {
         COMMAND,
         AUDIT_ENTRY,
-        PUBLISHED_INTERACTION;
+        EXECUTION;
         @Override
         public String toString() {
             return name().replace("_", " ");
@@ -64,9 +65,7 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTa
             editing = Editing.DISABLED
     )
     @PropertyLayout(
-            hidden = Where.ALL_EXCEPT_STANDALONE_TABLES,
-            fieldSetId="Identifiers",
-            sequence = "1"
+            hidden = Where.ALL_EXCEPT_STANDALONE_TABLES
     )
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
@@ -85,10 +84,6 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTa
     @Property(
             editing = Editing.DISABLED
     )
-    @PropertyLayout(
-            fieldSetId="Identifiers",
-            sequence = "50"
-    )
     @HasInteractionId.InteractionId
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
@@ -108,11 +103,11 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTa
 
 
     @Property(
-            editing = Editing.DISABLED
+            editing = Editing.DISABLED,
+            maxLength = Username.MAX_LENGTH
     )
-    @PropertyLayout(
-            fieldSetId="Identifiers",
-            sequence = "10"
+    @Parameter(
+            maxLength = Username.MAX_LENGTH
     )
     @HasUsername.Username
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
@@ -133,15 +128,11 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTa
     @Property(
             editing = Editing.DISABLED
     )
-    @PropertyLayout(
-            fieldSetId="Identifiers",
-            sequence = "20"
-    )
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
     @interface Timestamp {
-        boolean NULLABLE = HasUsername.Username.NULLABLE;
-        String ALLOWS_NULL = HasUsername.Username.ALLOWS_NULL;
+        boolean NULLABLE = false;
+        String ALLOWS_NULL = "false";
     }
     /**
      * The time that the change occurred.
@@ -150,27 +141,36 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTa
     java.sql.Timestamp getTimestamp();
 
 
+    @Property(
+            editing = Editing.DISABLED,
+            maxLength = TargetLogicalTypeName.MAX_LENGTH
+    )
+    @Parameter(
+            maxLength = TargetLogicalTypeName.MAX_LENGTH
+    )
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface TargetLogicalTypeName {
+        int MAX_LENGTH = 255;
+        boolean NULLABLE = false;
+        String ALLOWS_NULL = "false";
+    }
+
     /**
-     * The object type of the domain object being changed.
+     * The logical type name of the domain object being changed.
      */
-    @Property
-    @PropertyLayout(
-            named="Object Type",
-            fieldSetId="Target",
-            sequence = "10")
-    default String getTargetObjectType() {
+    @TargetLogicalTypeName
+    default String getTargetLogicalTypeName() {
         return getTarget().getLogicalTypeName();
     }
 
 
-
     @Property(
-            editing = Editing.DISABLED
+            editing = Editing.DISABLED,
+            maxLength = Target.MAX_LENGTH
     )
-    @PropertyLayout(
-            named="Object",
-            fieldSetId="Target",
-            sequence="30"
+    @Parameter(
+            maxLength = Target.MAX_LENGTH
     )
     @HasTarget.Target
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
@@ -189,45 +189,84 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTa
 
 
     /**
-     * The member interaction (ie action invocation or property edit) which caused the domain object to be changed.
+     * The (logical) member identifier (ie action id or property id) that caused the domain object to be changed.
      *
      * <p>
-     *     Populated for commands and for published events that represent action invocations or property edits.
+     *     Populated only for commands and for executions (action invocations/property edits).
      * </p>
      */
     @Property(
-            optionality = Optionality.OPTIONAL
+            editing = Editing.DISABLED,
+            optionality = Optionality.OPTIONAL,
+            maxLength = LogicalMemberIdentifier.MAX_LENGTH
     )
-    @PropertyLayout(
-            named="Member",
-            hidden = Where.ALL_EXCEPT_STANDALONE_TABLES,
-            fieldSetId="Target",
-            sequence = "20"
+    @Parameter(
+            optionality = Optionality.OPTIONAL,
+            maxLength = LogicalMemberIdentifier.MAX_LENGTH
     )
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
-    @interface TargetMember {
-        int MAX_LENGTH = HasTarget.Target.MAX_LENGTH;
+    @interface LogicalMemberIdentifier {
+        int MAX_LENGTH = 255;
+        boolean NULLABLE = false;
+        String ALLOWS_NULL = "false";
+    }
+    @LogicalMemberIdentifier
+    String getLogicalMemberIdentifier();
+    default boolean hideLogicalMemberIdentifier() {
+        return getType() != ChangeType.COMMAND && getType() != ChangeType.EXECUTION;
+    }
+
+
+    /**
+     * The property Id whose value has changed.
+     *
+     * <p>
+     *     Populated only for audit entries.
+     * </p>
+     */
+    @Property(
+            editing = Editing.DISABLED,
+            optionality = Optionality.OPTIONAL,
+            maxLength = PropertyId.MAX_LENGTH
+    )
+    @Parameter(
+            optionality = Optionality.OPTIONAL,
+            maxLength = PropertyId.MAX_LENGTH
+    )
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface PropertyId {
+        int MAX_LENGTH = 255;
         boolean NULLABLE = true;
         String ALLOWS_NULL = "true";
     }
-    @TargetMember
-    String getTargetMember();
+    @LogicalMemberIdentifier
+    default String getPropertyId() {
+        return null;
+    }
+    default boolean hidePropertyIds() {
+        return getType() != ChangeType.AUDIT_ENTRY;
+    }
 
 
 
 
     @Property(
-            optionality = Optionality.OPTIONAL
+            optionality = Optionality.OPTIONAL,
+            maxLength = PreValue.MAX_LENGTH
     )
     @PropertyLayout(
-            hidden = Where.ALL_EXCEPT_STANDALONE_TABLES,
-            fieldSetId = "Detail",
-            sequence = "6"
+            hidden = Where.ALL_EXCEPT_STANDALONE_TABLES
+    )
+    @Parameter(
+            optionality = Optionality.OPTIONAL,
+            maxLength = PreValue.MAX_LENGTH
     )
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
     public @interface PreValue {
+        int MAX_LENGTH = 255;
         boolean NULLABLE = true;
         String ALLOWS_NULL = "true";
     }
@@ -239,22 +278,31 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTa
      * </p>
      */
     @PreValue
-    String getPreValue();
+    default String getPreValue() {
+        return null;
+    }
+    default boolean hidePreValue() {
+        return getType() != ChangeType.AUDIT_ENTRY;
+    }
 
 
 
 
     @Property(
-            optionality = Optionality.OPTIONAL
+            optionality = Optionality.OPTIONAL,
+            maxLength = PostValue.MAX_LENGTH
     )
     @PropertyLayout(
-            hidden = Where.ALL_EXCEPT_STANDALONE_TABLES,
-            fieldSetId = "Detail",
-            sequence = "7"
+            hidden = Where.ALL_EXCEPT_STANDALONE_TABLES
+    )
+    @Parameter(
+            optionality = Optionality.OPTIONAL,
+            maxLength = PostValue.MAX_LENGTH
     )
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
     public @interface PostValue {
+        int MAX_LENGTH = 255;
         boolean NULLABLE = true;
         String ALLOWS_NULL = "true";
     }
@@ -266,7 +314,11 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTa
      * </p>
      */
     @PostValue
-    String getPostValue();
-
+    default String getPostValue() {
+        return null;
+    }
+    default boolean hidePostValue() {
+        return getType() != ChangeType.AUDIT_ENTRY;
+    }
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionIdAndSequence.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionIdAndSequence.java
new file mode 100644
index 0000000000..c0945616ec
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionIdAndSequence.java
@@ -0,0 +1,93 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.mixins.system;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.Property;
+
+/**
+ * Extends {@link HasInteractionId} to add a strictly monotonically increasing
+ * sequence number.
+ *
+ * <p>
+ *     There are two different use cases for this:
+ * </p>
+ * <ul>
+ *     <li>
+ *         <p>
+ *             The first is to identify different transactions within the overall
+ *             {@link org.apache.isis.applib.services.iactn.Interaction}.
+ *         </p>
+ *         <p>
+ *             In the vast majority of cases there will only be a single transaction
+ *             per {@link org.apache.isis.applib.services.iactn.Interaction}, but this
+ *             isn't <i>always</i> the case as domain objects may on occasion need to
+ *             explicitly manage transaction boundaries using
+ *             {@link org.apache.isis.applib.services.xactn.TransactionService}.
+ *         </p>
+ *     </li>
+ *     <li>
+ *         <p>
+ *             The second is to identify different executions within the overall
+ *             {@link org.apache.isis.applib.services.iactn.Interaction}.
+ *         </p>
+ *         <p>
+ *             In the vast majority of cases there will only be a single execution
+ *             per {@link org.apache.isis.applib.services.iactn.Interaction}, but this
+ *             isn't <i>always</i> the case; sometimes a top-level execution will cause
+ *             another execution to occur, using the {@link org.apache.isis.applib.services.wrapper.WrapperFactory}.
+ *         </p>
+ *     </li>
+ * </ul>
+ * <p>
+ *     These two different sequences are independent of each other.
+ * </p>
+ *
+ *
+ * @since 2.0 {@index}
+ */
+public interface HasInteractionIdAndSequence extends HasInteractionId {
+
+    @Property(
+            editing = Editing.DISABLED
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface Sequence {
+        boolean NULLABLE = false;
+        String ALLOWS_NULL = "false";
+    }
+
+    /**
+     * Holds the sequence number uniquely an &quot;event&quot; within the overall
+     * {@link org.apache.isis.applib.services.iactn.Interaction}.
+     *
+     * <p>
+     *     The &quot;event&quot; could be a member execution (an action invocation or property edit),
+     *     or could be a transaction.
+     * </p>
+     */
+    @Sequence
+    int getSequence();
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord_openTargetObject.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTarget_openTargetObject.java
similarity index 85%
rename from api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord_openTargetObject.java
rename to api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTarget_openTargetObject.java
index 1562f0ea5b..ba5bb7cbdc 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord_openTargetObject.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTarget_openTargetObject.java
@@ -25,6 +25,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberSupport;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.services.bookmark.HasTarget;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
@@ -42,14 +43,14 @@ import lombok.RequiredArgsConstructor;
 @Action(semantics = SemanticsOf.SAFE)
 @ActionLayout(named = "Open", associateWith = "target", sequence = "1")
 @RequiredArgsConstructor
-public class DomainChangeRecord_openTargetObject {
+public class HasTarget_openTargetObject {
 
-    private final DomainChangeRecord domainChangeRecord;
+    private final HasTarget hasTarget;
 
     @MemberSupport public Object act() {
         try {
             return bookmarkService != null
-                    ? bookmarkService.lookup(domainChangeRecord.getTarget()).orElse(null)
+                    ? bookmarkService.lookup(hasTarget.getTarget()).orElse(null)
                     : null;
         } catch(RuntimeException ex) {
             if(ex.getClass().getName().contains("ObjectNotFoundException")) {
@@ -61,15 +62,15 @@ public class DomainChangeRecord_openTargetObject {
     }
 
     @MemberSupport public boolean hideAct() {
-        return domainChangeRecord.getTarget() == null;
+        return hasTarget.getTarget() == null;
     }
 
     @MemberSupport public String disableAct() {
-        final Object targetObject = domainChangeRecord.getTarget();
+        final Object targetObject = hasTarget.getTarget();
         if (targetObject == null) {
             return null;
         }
-        final BeanSort sortOfObject = metaModelService.sortOf(domainChangeRecord.getTarget(), MetaModelService.Mode.RELAXED);
+        final BeanSort sortOfObject = metaModelService.sortOf(hasTarget.getTarget(), MetaModelService.Mode.RELAXED);
         return !(sortOfObject.isViewModel() || sortOfObject.isEntity())
                 ? "Can only open view models or entities"
                 : null;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java
deleted file mode 100644
index 8b568da87a..0000000000
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.applib.mixins.system;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.apache.isis.applib.annotation.Editing;
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.applib.annotation.Property;
-
-import lombok.Setter;
-
-/**
- * Extends {@link HasInteractionId} to add a strictly monotonically increasing
- * sequence number so that each transaction within the overall
- * {@link org.apache.isis.applib.services.iactn.Interaction} has its own
- * unique identity.
- *
- * <p>
- *     In the vast majority of cases there will only be a single transaction
- *     per {@link org.apache.isis.applib.services.iactn.Interaction}, but this
- *     isn't <i>always</i> the case as domain objects may on occasion need to
- *     explicitly manage transaction boundaries using
- *     {@link org.apache.isis.applib.services.xactn.TransactionService}.
- * </p>
- *
- * @since 2.0 {@index}
- */
-public interface HasTransactionId extends HasInteractionId {
-
-    @Property(
-            editing = Editing.DISABLED
-    )
-    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
-    @Retention(RetentionPolicy.RUNTIME)
-    @interface Sequence {
-    }
-
-    /**
-     * Holds the sequence number uniquely identifying the transaction number
-     * within the overall
-     * {@link org.apache.isis.applib.services.iactn.Interaction}.
-     *
-     * <p>
-     *     The values in this sequence are ultimately obtained from the non-API
-     *     method
-     *     {@link org.apache.isis.core.metamodel.execution.InteractionInternal#getTransactionSequence}.
-     * </p>
-     */
-    @Sequence
-    int getSequence();
-}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/HasInteractionDto.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/HasInteractionDto.java
new file mode 100644
index 0000000000..909fc68408
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/HasInteractionDto.java
@@ -0,0 +1,47 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.services.iactn;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+
+public interface HasInteractionDto {
+
+    @Property(
+            editing = Editing.DISABLED
+    )
+    @PropertyLayout(
+            multiLine = 9
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface InteractionDtoAnnot {
+        boolean NULLABLE = false;
+        String ALLOWS_NULL = "false";
+    }
+
+    @InteractionDtoAnnot
+    org.apache.isis.schema.ixn.v2.InteractionDto getInteractionDto();
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java
index 1c9e8f1876..641561c57c 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java
@@ -23,7 +23,7 @@ import java.util.UUID;
 
 import org.apache.isis.applib.mixins.security.HasUsername;
 import org.apache.isis.applib.mixins.system.HasInteractionId;
-import org.apache.isis.applib.mixins.system.HasTransactionId;
+import org.apache.isis.applib.mixins.system.HasInteractionIdAndSequence;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 
 /**
@@ -38,11 +38,11 @@ import org.apache.isis.schema.chg.v2.ChangesDto;
  * @since 2.0 {@index}
  */
 public interface EntityChanges
-        extends HasTransactionId,
+        extends HasInteractionIdAndSequence,
                 HasUsername {
 
     /**
-     * inherited from {@link HasTransactionId} and transitively from
+     * inherited from {@link HasInteractionIdAndSequence} and transitively from
      * {@link HasInteractionId}, correlates back to the unique identifier of
      * the {@link org.apache.isis.applib.services.iactn.Interaction} in which
      * these objects were changed.
@@ -51,7 +51,7 @@ public interface EntityChanges
     UUID getInteractionId();
 
     /**
-     * inherited from {@link HasTransactionId}, with {@link #getInteractionId()}
+     * inherited from {@link HasInteractionIdAndSequence}, with {@link #getInteractionId()}
      * it identifies the transaction within the
      * {@link org.apache.isis.applib.services.iactn.Interaction} in which
      * these objects were changed.
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java b/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
index 3ea93fd7cc..30c6d49f00 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
@@ -20,7 +20,7 @@ package org.apache.isis.applib.services.xactn;
 
 import java.util.UUID;
 
-import org.apache.isis.applib.mixins.system.HasTransactionId;
+import org.apache.isis.applib.mixins.system.HasInteractionIdAndSequence;
 
 import lombok.Value;
 
@@ -41,7 +41,7 @@ import lombok.Value;
  * @since 2.0 {@index}
  */
 @Value(staticConstructor = "of")
-public class TransactionId implements HasTransactionId {
+public class TransactionId implements HasInteractionIdAndSequence {
 
     /**
      * The unique identifier of the outer
@@ -49,7 +49,7 @@ public class TransactionId implements HasTransactionId {
      *
      * <p>
      *     Together with {@link #getSequence()}, this makes up the
-     *     implementation of {@link org.apache.isis.applib.mixins.system.HasTransactionId}
+     *     implementation of {@link HasInteractionIdAndSequence}
      * </p>
      */
     UUID interactionId;
@@ -60,7 +60,7 @@ public class TransactionId implements HasTransactionId {
      *
      * <p>
      *     Together with {@link #getInteractionId()}, this makes up the
-     *     implementation of {@link org.apache.isis.applib.mixins.system.HasTransactionId}
+     *     implementation of {@link HasInteractionIdAndSequence}
      * </p>
      */
     int sequence;
diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugPersistence.properties b/core/config/src/main/java/org/apache/isis/core/config/presets/DebugPersistence.properties
index fde41157a4..c7c03059ae 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugPersistence.properties
+++ b/core/config/src/main/java/org/apache/isis/core/config/presets/DebugPersistence.properties
@@ -15,6 +15,6 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisPlatformTransactionManagerForJdo = DEBUG
-logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.PersistenceSession5 = DEBUG
-logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisTransactionJdo = DEBUG
\ No newline at end of file
+logging.level.org.apache.isis.persistence.jdo.datanucleus.persistence.IsisPlatformTransactionManagerForJdo = DEBUG
+logging.level.org.apache.isis.persistence.jdo.datanucleus.persistence.PersistenceSession5 = DEBUG
+logging.level.org.apache.isis.persistence.jdo.datanucleus.persistence.IsisTransactionJdo = DEBUG
diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties b/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
index 8977db726f..457a717bac 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
+++ b/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
@@ -16,6 +16,6 @@
 #  under the License.
 
 # -- framework internal transaction scoped --
-logging.level.org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceForJdo = DEBUG
+logging.level.org.apache.isis.persistence.jdo.datanucleus.metrics.MetricsServiceForJdo = DEBUG
 logging.level.org.apache.isis.applib.services.queryresultscache.QueryResultsCache = DEBUG
 logging.level.org.apache.isis.core.runtime.persistence.transaction.ChangedObjectsService = DEBUG
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jpa/JavaAwtBufferedImageJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jpa/JavaAwtBufferedImageJpa.java
index ce0b0ea7d3..cb4435d27e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jpa/JavaAwtBufferedImageJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jpa/JavaAwtBufferedImageJpa.java
@@ -37,7 +37,7 @@ import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener;
-import org.apache.isis.persistence.jpa.integration.typeconverters.JavaAwtBufferedImageByteArrayConverter;
+import org.apache.isis.persistence.jpa.integration.typeconverters.image.JavaAwtBufferedImageByteArrayConverter;
 
 import lombok.Getter;
 import lombok.NoArgsConstructor;
diff --git a/examples/demo/wicket/jdo/src/main/java/demoapp/webapp/wicket/jdo/DemoAppWicketJdo.java b/examples/demo/wicket/jdo/src/main/java/demoapp/webapp/wicket/jdo/DemoAppWicketJdo.java
index 483fce25f6..210dad2544 100644
--- a/examples/demo/wicket/jdo/src/main/java/demoapp/webapp/wicket/jdo/DemoAppWicketJdo.java
+++ b/examples/demo/wicket/jdo/src/main/java/demoapp/webapp/wicket/jdo/DemoAppWicketJdo.java
@@ -30,10 +30,10 @@ import org.apache.isis.core.config.util.SpringProfileUtil;
 import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib;
 import org.apache.isis.extensions.pdfjs.wkt.ui.IsisModuleExtPdfjsWicketUi;
 import org.apache.isis.valuetypes.asciidoc.metamodel.IsisModuleValAsciidocMetaModel;
-import org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5.IsisModuleValAsciidocPersistenceJdoDn5;
+import org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn.IsisModuleValAsciidocPersistenceJdoDn;
 import org.apache.isis.valuetypes.asciidoc.ui.wkt.IsisModuleValAsciidocUiWkt;
 import org.apache.isis.valuetypes.markdown.metamodel.IsisModuleValMarkdownMetaModel;
-import org.apache.isis.valuetypes.markdown.persistence.jdo.dn5.IsisModuleValMarkdownPersistenceJdoDn5;
+import org.apache.isis.valuetypes.markdown.persistence.jdo.dn.IsisModuleValMarkdownPersistenceJdoDn;
 import org.apache.isis.valuetypes.markdown.ui.wkt.IsisModuleValMarkdownUiWkt;
 import org.apache.isis.valuetypes.sse.ui.wkt.IsisModuleValSseUiWkt;
 import org.apache.isis.viewer.wicket.viewer.IsisModuleViewerWicketViewer;
@@ -64,8 +64,8 @@ import demoapp.webapp.wicket.common.ui.DemoAppWicketCommon;
     DemoAppWicketCommon.class,
 
     // Persistence (JDO/DN5)
-    IsisModuleValAsciidocPersistenceJdoDn5.class,
-    IsisModuleValMarkdownPersistenceJdoDn5.class,
+    IsisModuleValAsciidocPersistenceJdoDn.class,
+    IsisModuleValMarkdownPersistenceJdoDn.class,
 
     // XrayEnable.class // for debugging only
 })
diff --git a/extensions/applib/excel/pom.xml b/extensions/applib/excel/pom.xml
index 67d144a1e5..137c5ef84b 100644
--- a/extensions/applib/excel/pom.xml
+++ b/extensions/applib/excel/pom.xml
@@ -30,6 +30,31 @@
 
     <packaging>pom</packaging>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-excel-applib</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-excel-testing</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-excel-fixtures</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-excel-integtests</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <modules>
         <module>applib</module>
         <module>fixture</module>
diff --git a/extensions/core/commandlog/adoc/modules/command-log/pages/about.adoc b/extensions/core/commandlog/adoc/modules/command-log/pages/about.adoc
index 0df1ae270f..b41570435b 100644
--- a/extensions/core/commandlog/adoc/modules/command-log/pages/about.adoc
+++ b/extensions/core/commandlog/adoc/modules/command-log/pages/about.adoc
@@ -4,9 +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 [...]
 
 
-WARNING: TODO: v2 - this code has not yet been brought into the framework.
+WARNING: TODO: v2 - to fully document
 
-The _commandlog_ module provides an implementation that persists xref:refguide:applib:index/services/command/Command.adoc[Command]s using the xref:pjdo:ROOT:about.adoc[JDO/DataNucleus] object store.
+The _commandlog_ module provides an implementation that persists xref:refguide:applib:index/services/command/Command.adoc[Command]s using either the xref:pjpa:ROOT:about.adoc[JPA/EclipseLink] or xref:pjdo:ROOT:about.adoc[JDO/DataNucleus] object store.
 
 //It further provides a number of supporting services:
 //
diff --git a/extensions/core/commandlog/applib/pom.xml b/extensions/core/commandlog/applib/pom.xml
index 714c146b54..6d9eb6050c 100644
--- a/extensions/core/commandlog/applib/pom.xml
+++ b/extensions/core/commandlog/applib/pom.xml
@@ -37,9 +37,11 @@
                 <filtering>false</filtering>
                 <directory>src/main/java</directory>
                 <includes>
-                    <!-- we include all .java too, so that we can reference it from the descriptions -->
                     <include>**</include>
                 </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </resource>
         </resources>
     </build>
diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/HasInteractionId_commandLogEntry.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/HasInteractionId_commandLogEntry.java
new file mode 100644
index 0000000000..efbd837094
--- /dev/null
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/HasInteractionId_commandLogEntry.java
@@ -0,0 +1,41 @@
+package org.apache.isis.extensions.commandlog.applib.contributions;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
+import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
+import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository;
+
+import lombok.RequiredArgsConstructor;
+
+@Property(
+        domainEvent = HasInteractionId_commandLogEntry.PropertyDomainEvent.class
+)
+@RequiredArgsConstructor
+public class HasInteractionId_commandLogEntry {
+
+    private final HasInteractionId hasInteractionId;
+
+    public static class PropertyDomainEvent
+            extends IsisModuleExtCommandLogApplib.PropertyDomainEvent<HasInteractionId_commandLogEntry, CommandLogEntry> { }
+
+
+    public CommandLogEntry prop() {
+        return queryResultsCache.execute(this::doProp, getClass(), "prop");
+    }
+
+    private CommandLogEntry doProp() {
+        return commandLogEntryRepository.findByInteractionId(hasInteractionId.getInteractionId()).orElse(null);
+    }
+
+    public boolean hideProp() {
+        return prop() == hasInteractionId;
+    }
+
+    @Inject CommandLogEntryRepository<CommandLogEntry> commandLogEntryRepository;
+    @Inject QueryResultsCache queryResultsCache;
+
+}
diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.java
index 7a466f5683..0f7df847c8 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.java
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.java
@@ -26,7 +26,6 @@ import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.UUID;
 import java.util.function.Consumer;
 
@@ -69,7 +68,6 @@ import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.cmd.v2.MapDto;
 
 import lombok.NoArgsConstructor;
-import lombok.val;
 import lombok.experimental.UtilityClass;
 
 /**
@@ -81,7 +79,8 @@ import lombok.experimental.UtilityClass;
  * </p>
  *
  * Note that this class doesn't subclass from {@link Command} ({@link Command}
- * is not an interface).
+ * is not an interface), but it does implement {@link HasCommandDto}, providing access to
+ * {@link CommandDto}, a serialized representation of the {@link Command}.
  */
 @Named(CommandLogEntry.LOGICAL_TYPE_NAME)
 @DomainObject(
@@ -96,10 +95,10 @@ import lombok.experimental.UtilityClass;
 )
 @NoArgsConstructor
 public abstract class CommandLogEntry
-implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
+implements Comparable<CommandLogEntry>, DomainChangeRecord, HasCommandDto {
 
     public final static String LOGICAL_TYPE_NAME = IsisModuleExtCommandLogApplib.NAMESPACE + ".CommandLog";
-    public static final String SCHEMA = "isisExtensionsCommandLog";
+    public static final String SCHEMA = IsisModuleExtCommandLogApplib.SCHEMA;
     public static final String TABLE = "Command";
 
     public static class TitleUiEvent extends IsisModuleExtCommandLogApplib.TitleUiEvent<CommandLogEntry> { }
@@ -210,10 +209,10 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
 
     public String title() {
         return new TitleBuffer()
-            .append(formatter.format(getTimestamp().toLocalDateTime()))
-            .append(" ")
-            .append(getLogicalMemberIdentifier())
-            .toString();
+                .append(formatter.format(getTimestamp().toLocalDateTime()))
+                .append(" ")
+                .append(getLogicalMemberIdentifier())
+                .toString();
     }
 
 
@@ -224,13 +223,6 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
     }
 
 
-
-    @InteractionIdStr
-    public abstract String getInteractionIdStr();
-    public abstract void setInteractionIdStr(String interactionIdStr);
-
-
-
     @Property(
             domainEvent = InteractionId.DomainEvent.class
     )
@@ -247,6 +239,23 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
     }
 
 
+    /**
+     * This is the persistence model for {@link #getInteractionId()}; hidden everywhere.
+     */
+    @HasInteractionId.InteractionIdStr // hidden everywhere
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface InteractionIdStr {
+        int MAX_LENGTH = HasInteractionId.InteractionIdStr.MAX_LENGTH;
+        boolean NULLABLE = HasInteractionId.InteractionIdStr.NULLABLE;
+        String ALLOWS_NULL = HasInteractionId.InteractionIdStr.ALLOWS_NULL;
+        String NAME = HasInteractionId.InteractionIdStr.NAME;
+    }
+    @InteractionIdStr
+    public abstract String getInteractionIdStr();
+    public abstract void setInteractionIdStr(String interactionIdStr);
+
+
 
     @Property(
             domainEvent = Username.DomainEvent.class
@@ -286,52 +295,21 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
 
 
     @Property(
-            domainEvent = ReplayState.DomainEvent.class
-    )
-    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface ReplayState {
-        class DomainEvent extends PropertyDomainEvent<org.apache.isis.extensions.commandlog.applib.dom.ReplayState> {}
-        int MAX_LENGTH = 10;
-        boolean NULLABLE = true;
-        String ALLOWS_NULL = "true";
-    }
-    /**
-     * For a replayed command, what the outcome was.
-     */
-    @ReplayState
-    public abstract org.apache.isis.extensions.commandlog.applib.dom.ReplayState getReplayState();
-    public abstract void setReplayState(org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState);
-
-
-
-    @Property(
-            domainEvent = ReplayStateFailureReason.DomainEvent.class,
-            optionality = Optionality.OPTIONAL,
-            maxLength = ReplayStateFailureReason.MAX_LENGTH
-    )
-    @PropertyLayout(hidden = Where.ALL_TABLES, multiLine = 5)
-    @Parameter(
-            optionality = Optionality.OPTIONAL,
-            maxLength = ReplayStateFailureReason.MAX_LENGTH
+            domainEvent = Target.DomainEvent.class
     )
+    @DomainChangeRecord.Target
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
-    public @interface ReplayStateFailureReason {
-        class DomainEvent extends PropertyDomainEvent<String> {}
-        int MAX_LENGTH = 255;
-        boolean NULLABLE = true;
-        String ALLOWS_NULL = "true";
-    }
-    /**
-     * For a {@link org.apache.isis.extensions.commandlog.applib.dom.ReplayState#FAILED failed} replayed command, what the reason was for the failure.
-     */
-    @ReplayStateFailureReason
-    public abstract String getReplayStateFailureReason();
-    public abstract void setReplayStateFailureReason(String replayStateFailureReason);
-    @MemberSupport public boolean hideReplayStateFailureReason() {
-        return getReplayState() == null || !getReplayState().isFailed();
+    public @interface Target {
+        class DomainEvent extends PropertyDomainEvent<Bookmark> {}
+        int MAX_LENGTH = DomainChangeRecord.Target.MAX_LENGTH;
+        boolean NULLABLE = DomainChangeRecord.Target.NULLABLE;
+        String ALLOWS_NULL = DomainChangeRecord.Target.ALLOWS_NULL;
     }
+    @Override
+    @Target
+    public abstract Bookmark getTarget();
+    public abstract void setTarget(Bookmark target);
 
 
 
@@ -359,71 +337,6 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
 
 
 
-    @Property(
-            domainEvent = Target.DomainEvent.class
-    )
-    @DomainChangeRecord.Target
-    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface Target {
-        class DomainEvent extends PropertyDomainEvent<Bookmark> {}
-        int MAX_LENGTH = DomainChangeRecord.Target.MAX_LENGTH;
-        boolean NULLABLE = DomainChangeRecord.Target.NULLABLE;
-        String ALLOWS_NULL = DomainChangeRecord.Target.ALLOWS_NULL;
-    }
-    @Override
-    @Target
-    public abstract Bookmark getTarget();
-    public abstract void setTarget(Bookmark target);
-
-
-
-    @Deprecated // TO DELETE IF UNUSED
-    private String getTargetStr() {
-        return Optional.ofNullable(getTarget()).map(Bookmark::toString).orElse(null);
-    }
-
-
-
-    @Property(
-            domainEvent = TargetMember.DomainEvent.class
-    )
-    @PropertyLayout(
-            hidden = Where.ALL_TABLES
-    )
-    @DomainChangeRecord.TargetMember
-    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface TargetMember {
-        class DomainEvent extends PropertyDomainEvent<String> {}
-    }
-    @TargetMember
-    @Override
-    public String getTargetMember() {
-        return getCommandDto().getMember().getLogicalMemberIdentifier();
-    }
-
-
-
-    @Property(
-            domainEvent = LocalMember.DomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(
-            named = "Member"
-    )
-    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface LocalMember {
-        class DomainEvent extends PropertyDomainEvent<String> {}
-    }
-    @LocalMember
-    public String getLocalMember() {
-        val targetMember = getTargetMember();
-        return targetMember.substring(targetMember.indexOf("#") + 1);
-    }
-
-
 
     @Property(
             domainEvent = LogicalMemberIdentifier.DomainEvent.class,
@@ -432,13 +345,15 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
     @PropertyLayout(
             hidden = Where.ALL_TABLES
     )
+    @DomainChangeRecord.LogicalMemberIdentifier
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
     public @interface LogicalMemberIdentifier {
         class DomainEvent extends PropertyDomainEvent<String> {}
-        int MAX_LENGTH = 255;
-        boolean NULLABLE = false;
-        String ALLOWS_NULL = "false";
+        int MAX_LENGTH = DomainChangeRecord.LogicalMemberIdentifier.MAX_LENGTH;
+        boolean NULLABLE = DomainChangeRecord.LogicalMemberIdentifier.NULLABLE;
+        String ALLOWS_NULL = DomainChangeRecord.LogicalMemberIdentifier.ALLOWS_NULL;
+
     }
     @LogicalMemberIdentifier
     public abstract String getLogicalMemberIdentifier();
@@ -447,7 +362,6 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
 
 
 
-
     @Property(
             domainEvent = CommandDtoAnnot.DomainEvent.class
     )
@@ -466,7 +380,6 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
 
 
 
-
     @Property(
             domainEvent = StartedAt.DomainEvent.class,
             editing = Editing.DISABLED,
@@ -482,6 +395,7 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
         boolean NULLABLE = true;
         String ALLOWS_NULL = "true";
     }
+    @StartedAt
     public abstract java.sql.Timestamp getStartedAt();
     public abstract void setStartedAt(java.sql.Timestamp startedAt);
 
@@ -502,6 +416,7 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
         boolean NULLABLE = true;
         String ALLOWS_NULL = "true";
     }
+    @CompletedAt
     public abstract java.sql.Timestamp getCompletedAt();
     public abstract void setCompletedAt(java.sql.Timestamp completedAt);
 
@@ -511,14 +426,17 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
             domainEvent = Duration.DomainEvent.class,
             editing = Editing.DISABLED
     )
-    @Digits(integer=5, fraction=3)
+    @Digits(integer=Duration.DIGITS_INTEGER, fraction=Duration.DIGITS_FRACTION)
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
     public @interface Duration {
         class DomainEvent extends PropertyDomainEvent<BigDecimal> {}
+        int DIGITS_INTEGER = 5;
+        int DIGITS_FRACTION = 3;
     }
     /**
-     * The number of seconds (to 3 decimal places) that this interaction lasted.
+     * The number of seconds (to 3 decimal places) that this command lasted, derived from
+     *      * {@link #getStartedAt()} and {@link #getCompletedAt()}.
      *
      * <p>
      * Populated only if it has {@link #getCompletedAt() completed}.
@@ -550,36 +468,6 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
 
 
 
-    @Property(
-            domainEvent = ResultSummary.DomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(
-            hidden = Where.OBJECT_FORMS,
-            named = "Result"
-    )
-    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface ResultSummary {
-        class DomainEvent extends PropertyDomainEvent<String> {}
-    }
-    @ResultSummary
-    public String getResultSummary() {
-        if(getCompletedAt() == null) {
-            return "";
-        }
-        if(!_Strings.isNullOrEmpty(getException())) {
-            return "EXCEPTION";
-        }
-        if(getResult() != null) {
-            return "OK";
-        } else {
-            return "OK (VOID)";
-        }
-    }
-
-
-
     @Property(
             domainEvent = Result.DomainEvent.class
     )
@@ -634,6 +522,36 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
 
 
 
+    @Property(
+            domainEvent = ResultSummary.DomainEvent.class,
+            editing = Editing.DISABLED
+    )
+    @PropertyLayout(
+            hidden = Where.OBJECT_FORMS,
+            named = "Result"
+    )
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface ResultSummary {
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+    @ResultSummary
+    public String getResultSummary() {
+        if(getCompletedAt() == null) {
+            return "";
+        }
+        if(!_Strings.isNullOrEmpty(getException())) {
+            return "EXCEPTION";
+        }
+        if(getResult() != null) {
+            return "OK";
+        } else {
+            return "OK (VOID)";
+        }
+    }
+
+
+
     @Property(
             domainEvent = IsCaused.DomainEvent.class,
             editing = Editing.DISABLED
@@ -652,34 +570,56 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
     }
 
 
-
-    @DomainChangeRecord.PreValue
+    @Property(
+            domainEvent = ReplayState.DomainEvent.class
+    )
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
-    public @interface PreValue {
-        class DomainEvent extends PropertyDomainEvent<String> {}
-    }
-    @PreValue
-    @Override
-    public String getPreValue() {
-        return null;
+    public @interface ReplayState {
+        class DomainEvent extends PropertyDomainEvent<org.apache.isis.extensions.commandlog.applib.dom.ReplayState> {}
+        int MAX_LENGTH = 10;
+        boolean NULLABLE = true;
+        String ALLOWS_NULL = "true";
     }
+    /**
+     * For a replayed command, what the outcome was.
+     */
+    @ReplayState
+    public abstract org.apache.isis.extensions.commandlog.applib.dom.ReplayState getReplayState();
+    public abstract void setReplayState(org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState);
 
 
 
-    @DomainChangeRecord.PostValue
+    @Property(
+            domainEvent = ReplayStateFailureReason.DomainEvent.class,
+            optionality = Optionality.OPTIONAL,
+            maxLength = ReplayStateFailureReason.MAX_LENGTH
+    )
+    @PropertyLayout(hidden = Where.ALL_TABLES, multiLine = 5)
+    @Parameter(
+            optionality = Optionality.OPTIONAL,
+            maxLength = ReplayStateFailureReason.MAX_LENGTH
+    )
     @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
     @Retention(RetentionPolicy.RUNTIME)
-    public @interface PostValue {
+    public @interface ReplayStateFailureReason {
         class DomainEvent extends PropertyDomainEvent<String> {}
+        int MAX_LENGTH = 255;
+        boolean NULLABLE = true;
+        String ALLOWS_NULL = "true";
     }
-    @PostValue
-    @Override
-    public String getPostValue() {
-        return null;
+    /**
+     * For a {@link org.apache.isis.extensions.commandlog.applib.dom.ReplayState#FAILED failed} replayed command, what the reason was for the failure.
+     */
+    @ReplayStateFailureReason
+    public abstract String getReplayStateFailureReason();
+    public abstract void setReplayStateFailureReason(String replayStateFailureReason);
+    @MemberSupport public boolean hideReplayStateFailureReason() {
+        return getReplayState() == null || !getReplayState().isFailed();
     }
 
 
+    @Programmatic
     public void saveAnalysis(final String analysis) {
         if (analysis == null) {
             setReplayState(org.apache.isis.extensions.commandlog.applib.dom.ReplayState.OK);
@@ -754,7 +694,7 @@ implements HasCommandDto, Comparable<CommandLogEntry>, DomainChangeRecord {
 
         private List<String> ordered(final List<String> propertyIds) {
             return Arrays.asList(
-                "timestamp", "target", "targetMember", "username", "complete", "resultSummary", "interactionIdStr"
+                "timestamp", "target", "logicalMemberIdentifier", "username", "complete", "resultSummary", "duration", "interactionId"
             );
         }
     }
diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.layout.fallback.xml b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.layout.fallback.xml
index be6c3ef08c..2283e0e62a 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.layout.fallback.xml
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.layout.fallback.xml
@@ -34,21 +34,13 @@
                         <cpt:action id="downloadJdoMetadata" position="PANEL_DROPDOWN"/>
                         <cpt:action id="openRestApi" position="PANEL_DROPDOWN"/>
                         <cpt:property id="type"/>
-                        <cpt:property id="interactionIdStr"/>
+                        <cpt:property id="interactionId"/>
                         <cpt:property id="logicalMemberIdentifier"/>
                     </cpt:fieldSet>
                     <cpt:fieldSet name="Who and When">
                         <cpt:property id="username"/>
                         <cpt:property id="timestamp"/>
                     </cpt:fieldSet>
-                    <cpt:fieldSet name="Other" id="other" unreferencedProperties="true">
-                    </cpt:fieldSet>
-                </bs3:col>
-                <bs3:col span="0">
-                    <cpt:fieldSet name="Hidden" id="hidden">
-                        <cpt:property id="preValue" hidden="EVERYWHERE"/>
-                        <cpt:property id="postValue" hidden="EVERYWHERE"/>
-                    </cpt:fieldSet>
                 </bs3:col>
             </bs3:row>
             <bs3:row>
@@ -58,11 +50,9 @@
                             <bs3:row>
                                 <bs3:col span="12">
                                     <cpt:fieldSet name="Target" id="target">
-                                        <cpt:property id="targetObjectType"/>
-                                        <cpt:property id="localMember" hidden="OBJECT_FORMS"/>
+                                        <cpt:property id="targetLogicalTypeName"/>
                                         <cpt:property id="target"/>
                                     </cpt:fieldSet>
-                                    <cpt:fieldSet name="Notes" id="notes"/>
                                 </bs3:col>
                             </bs3:row>
                         </bs3:tab>
@@ -115,26 +105,25 @@
     <bs3:row>
         <bs3:col span="12">
             <bs3:tabGroup>
-                <bs3:tab name="Audit">
+                <bs3:tab name="Related Commands">
                     <bs3:row>
                         <bs3:col span="12">
-                            <cpt:collection id="auditEntriesInTransaction"/>
+                            <cpt:collection id="childCommands"/>
+                            <cpt:collection id="siblingCommands"/>
                         </bs3:col>
                     </bs3:row>
                 </bs3:tab>
-                <bs3:tab name="Publishing">
+                <bs3:tab name="Related Executions">
                     <bs3:row>
                         <bs3:col span="12">
-                            <cpt:collection id="publishedEventsInTransaction"/>
-                            <cpt:collection id="statusMessagesInTransaction"/>
+                            <cpt:collection id="executionLogEntries"/>
                         </bs3:col>
                     </bs3:row>
                 </bs3:tab>
-                <bs3:tab name="Commands">
+                <bs3:tab name="Related Audit">
                     <bs3:row>
                         <bs3:col span="12">
-                            <cpt:collection id="childCommands"/>
-                            <cpt:collection id="siblingCommands"/>
+                            <cpt:collection id="auditLogEntries"/>
                         </bs3:col>
                     </bs3:row>
                 </bs3:tab>
diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntryRepository.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntryRepository.java
index 954d5b0f04..ffbadfd97c 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntryRepository.java
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntryRepository.java
@@ -42,6 +42,7 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
+import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.cmd.v2.CommandsDto;
 import org.apache.isis.schema.cmd.v2.MapDto;
@@ -72,10 +73,11 @@ public abstract class CommandLogEntryRepository<C extends CommandLogEntry> {
         this.commandLogClass = commandLogClass;
     }
 
-    /** Creates a transient (yet not persisted) {@link CommandLogEntry} instance. */
-    public C createCommandLog(final Command command) {
+    public C createEntryAndPersist(final Command command, CommandLogEntry parentEntryIfAny) {
         C c = factoryService.detachedEntity(commandLogClass);
         c.setCommandDto(command.getCommandDto());
+        c.setParent(parentEntryIfAny);
+        persist(c);
         return c;
     }
 
@@ -302,8 +304,8 @@ public abstract class CommandLogEntryRepository<C extends CommandLogEntry> {
     }
 
 
-    public void persist(final C commandLog) {
-        repositoryService().persist(commandLog);
+    public void persist(final C commandLogEntry) {
+        repositoryService().persist(commandLogEntry);
     }
 
     public void truncateLog() {
diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java
index 0b8d2eca6e..3344bdc1cd 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java
@@ -21,7 +21,6 @@ package org.apache.isis.extensions.commandlog.applib.subscriber;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
@@ -72,16 +71,14 @@ public class CommandSubscriberForCommandLog implements CommandSubscriber {
                 log.debug("proposed: \n{}", commandDtoXml);
             }
         } else {
-            val commandLogInstance = commandLogEntryRepository.createCommandLog(command);
             val parent = command.getParent();
-            val parentJdo =
+            val parentEntryIfAny =
                 parent != null
                     ? commandLogEntryRepository
                         .findByInteractionId(parent.getInteractionId())
                         .orElse(null)
                     : null;
-            commandLogInstance.setParent(parentJdo);
-            commandLogEntryRepository.persist(_Casts.uncheckedCast(commandLogInstance));
+            commandLogEntryRepository.createEntryAndPersist(command, parentEntryIfAny);
         }
     }
 
diff --git a/extensions/core/commandlog/jdo/logging-dn-enhance.properties b/extensions/core/commandlog/persistence-jdo/logging-dn-enhance.properties
similarity index 100%
rename from extensions/core/commandlog/jdo/logging-dn-enhance.properties
rename to extensions/core/commandlog/persistence-jdo/logging-dn-enhance.properties
diff --git a/extensions/core/commandlog/jdo/pom.xml b/extensions/core/commandlog/persistence-jdo/pom.xml
similarity index 90%
copy from extensions/core/commandlog/jdo/pom.xml
copy to extensions/core/commandlog/persistence-jdo/pom.xml
index a850ba9987..915899e8e8 100644
--- a/extensions/core/commandlog/jdo/pom.xml
+++ b/extensions/core/commandlog/persistence-jdo/pom.xml
@@ -19,12 +19,12 @@
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-extensions-commandlog-jdo</artifactId>
+    <artifactId>isis-extensions-commandlog-persistence-jdo</artifactId>
     <name>Apache Isis Ext - Command Log Implementation (JDO)</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.jdo</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/jdo</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.persistence.jdo</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/persistence-jdo</git-plugin.propertiesDir>
     </properties>
 
     <build>
@@ -37,9 +37,11 @@
                 <filtering>false</filtering>
                 <directory>src/main/java</directory>
                 <includes>
-                    <!-- we include all .java too, so that we can reference it from the descriptions -->
                     <include>**</include>
                 </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </resource>
         </resources>
     </build>
diff --git a/extensions/core/commandlog/jdo/src/main/java/META-INF/persistence.xml b/extensions/core/commandlog/persistence-jdo/src/main/java/META-INF/persistence.xml
similarity index 100%
rename from extensions/core/commandlog/jdo/src/main/java/META-INF/persistence.xml
rename to extensions/core/commandlog/persistence-jdo/src/main/java/META-INF/persistence.xml
diff --git a/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java b/extensions/core/commandlog/persistence-jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java
similarity index 100%
rename from extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java
rename to extensions/core/commandlog/persistence-jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java
diff --git a/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java b/extensions/core/commandlog/persistence-jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java
similarity index 88%
rename from extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java
rename to extensions/core/commandlog/persistence-jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java
index 49aa3de62a..aaf80eef0c 100644
--- a/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java
+++ b/extensions/core/commandlog/persistence-jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java
@@ -28,14 +28,18 @@ import javax.jdo.annotations.Persistent;
 import javax.jdo.annotations.PrimaryKey;
 import javax.jdo.annotations.Queries;
 import javax.jdo.annotations.Query;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.extensions.commandlog.jdo.IsisModuleExtCommandLogJdo;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 
+import static org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry.*;
+
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -45,43 +49,43 @@ import lombok.Setter;
         schema = CommandLogEntry.SCHEMA,
         table = CommandLogEntry.TABLE)
 @Indices({
-        @Index(name = "CommandJdo__startedAt__timestamp__IDX", members = { "startedAt", "timestamp" }),
-        @Index(name = "CommandJdo__timestamp__IDX", members = { "timestamp" }),
+        @Index(name = "Command__startedAt__timestamp__IDX", members = { "startedAt", "timestamp" }),
+        @Index(name = "Command__timestamp__IDX", members = { "timestamp" }),
 //        @javax.jdo.annotations.Index(name = "CommandJdo__replayState__timestamp__startedAt_IDX", members = { "replayState", "timestamp", "startedAt"}),
 //        @javax.jdo.annotations.Index(name = "CommandJdo__replayState__startedAt__completedAt_IDX", members = {"startedAt", "replayState", "completedAt"}),
 })
 @Queries( {
     @Query(
-            name  = "findByInteractionIdStr",
+            name  = Nq.FIND_BY_INTERACTION_ID_STR,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE interactionIdStr == :interactionIdStr "),
     @Query(
-            name  = "findByParent",
+            name  = Nq.FIND_BY_PARENT,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE parent == :parent "),
     @Query(
-            name  = "findCurrent",
+            name  = Nq.FIND_CURRENT,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE completedAt == null "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "findCompleted",
+            name  = Nq.FIND_COMPLETED,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE completedAt != null "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "findRecentByTarget",
+            name  = Nq.FIND_RECENT_BY_TARGET,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE target == :target "
                   + " ORDER BY this.timestamp DESC "
                   + " RANGE 0,30"),
     @Query(
-            name  = "findByTargetAndTimestampBetween",
+            name  = Nq.FIND_BY_TARGET_AND_TIMESTAMP_BETWEEN,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE target == :target "
@@ -89,58 +93,58 @@ import lombok.Setter;
                   + "    && timestamp <= :to "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "findByTargetAndTimestampAfter",
+            name  = Nq.FIND_BY_TARGET_AND_TIMESTAMP_AFTER,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE target == :target "
                   + "    && timestamp >= :from "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "findByTargetAndTimestampBefore",
+            name  = Nq.FIND_BY_TARGET_AND_TIMESTAMP_BEFORE,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE target == :target "
                   + "    && timestamp <= :to "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "findByTarget",
+            name  = Nq.FIND_BY_TARGET,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE target == :target "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "findByTimestampBetween",
+            name  = Nq.FIND_BY_TIMESTAMP_BETWEEN,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE timestamp >= :from "
                   + "    && timestamp <= :to "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "findByTimestampAfter",
+            name  = Nq.FIND_BY_TIMESTAMP_AFTER,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE timestamp >= :from "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "findByTimestampBefore",
+            name  = Nq.FIND_BY_TIMESTAMP_BEFORE,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE timestamp <= :to "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "find",
+            name  = Nq.FIND,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " ORDER BY this.timestamp DESC"),
     @Query(
-            name  = "findRecentByUsername",
+            name  = Nq.FIND_RECENT_BY_USERNAME,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE username == :username "
                   + " ORDER BY this.timestamp DESC "
                   + " RANGE 0,30"),
     @Query(
-            name  = "findFirst",
+            name  = Nq.FIND_FIRST,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE startedAt   != null "
@@ -149,7 +153,7 @@ import lombok.Setter;
                   + " RANGE 0,2"), // this should be RANGE 0,1 but results in DataNucleus submitting "FETCH NEXT ROW ONLY"
                                    // which SQL Server doesn't understand.  However, as workaround, SQL Server *does* understand FETCH NEXT 2 ROWS ONLY
     @Query(
-            name  = "findSince",
+            name  = Nq.FIND_SINCE,
             value = "SELECT "
                   + "FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE timestamp > :timestamp "
@@ -161,7 +165,7 @@ import lombok.Setter;
     // secondary.  This should always exist except for the very first times
     // (after restored the prod DB to secondary).
     @Query(
-            name  = "findMostRecentReplayed",
+            name  = Nq.FIND_MOST_RECENT_REPLAYED,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE (replayState == 'OK' || replayState == 'FAILED') "
@@ -173,7 +177,7 @@ import lombok.Setter;
     // secondary, corresponding to the last command run on primary before the
     // production database was restored to the secondary
     @Query(
-            name  = "findMostRecentCompleted",
+            name  = Nq.FIND_MOST_RECENT_COMPLETED,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE startedAt   != null "
@@ -183,7 +187,7 @@ import lombok.Setter;
                                    // which SQL Server doesn't understand.  However, as workaround, SQL Server *does* understand FETCH NEXT 2 ROWS ONLY
 
     @Query(
-            name  = "findNotYetReplayed",
+            name  = Nq.FIND_NOT_YET_REPLAYED,
             value = "SELECT "
                   + "  FROM " + CommandLogEntry.FQCN + " "
                   + " WHERE replayState == 'PENDING' "
@@ -194,7 +198,7 @@ import lombok.Setter;
 @DomainObject(
         editing = Editing.DISABLED
 )
-//@Log4j2
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 @NoArgsConstructor
 public class CommandLogEntry
 extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry {
@@ -204,7 +208,7 @@ extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry {
     /**
      * Intended for use on primary system.
      *
-     * @param command
+     * @param command - framework's representation of the action invocation or property edit to be performed
      */
     public CommandLogEntry(final Command command) {
         super(command);
@@ -243,16 +247,11 @@ extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry {
     private java.sql.Timestamp timestamp;
 
 
-    @Column(allowsNull = ReplayState.ALLOWS_NULL, length=ReplayState.MAX_LENGTH)
-    @ReplayState
-    @Getter @Setter
-    private org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState;
-
-
-    @Column(allowsNull = ReplayStateFailureReason.ALLOWS_NULL, length = ReplayStateFailureReason.MAX_LENGTH)
-    @ReplayStateFailureReason
+    @Persistent
+    @Column(allowsNull = Target.ALLOWS_NULL, length = Target.MAX_LENGTH)
+    @Target
     @Getter @Setter
-    private String replayStateFailureReason;
+    private Bookmark target;
 
 
     @Column(name = Parent.NAME, allowsNull = Parent.ALLOWS_NULL)
@@ -265,13 +264,6 @@ extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry {
     }
 
 
-    @Persistent
-    @Column(allowsNull = Target.ALLOWS_NULL, length = Target.MAX_LENGTH)
-    @Target
-    @Getter @Setter
-    private Bookmark target;
-
-
     @Column(allowsNull = LogicalMemberIdentifier.ALLOWS_NULL, length = LogicalMemberIdentifier.MAX_LENGTH)
     @LogicalMemberIdentifier
     @Getter @Setter
@@ -306,8 +298,21 @@ extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry {
 
     @Persistent
     @Column(allowsNull = Exception.ALLOWS_NULL, jdbcType = "CLOB")
+    @Exception
     @Getter @Setter
     private String exception;
 
+    @Column(allowsNull = ReplayState.ALLOWS_NULL, length = ReplayState.MAX_LENGTH)
+    @ReplayState
+    @Getter @Setter
+    private org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState;
+
+
+    @Column(allowsNull = ReplayStateFailureReason.ALLOWS_NULL, length = ReplayStateFailureReason.MAX_LENGTH)
+    @ReplayStateFailureReason
+    @Getter @Setter
+    private String replayStateFailureReason;
+
+
 }
 
diff --git a/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntryRepository.java b/extensions/core/commandlog/persistence-jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntryRepository.java
similarity index 100%
rename from extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntryRepository.java
rename to extensions/core/commandlog/persistence-jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntryRepository.java
diff --git a/extensions/core/commandlog/jpa/pom.xml b/extensions/core/commandlog/persistence-jpa/pom.xml
similarity index 90%
rename from extensions/core/commandlog/jpa/pom.xml
rename to extensions/core/commandlog/persistence-jpa/pom.xml
index 854366a6a4..62709c7145 100644
--- a/extensions/core/commandlog/jpa/pom.xml
+++ b/extensions/core/commandlog/persistence-jpa/pom.xml
@@ -19,12 +19,12 @@
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-extensions-commandlog-jpa</artifactId>
+    <artifactId>isis-extensions-commandlog-persistence-jpa</artifactId>
     <name>Apache Isis Ext - Command Log Implementation (JPA)</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.jpa</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/jpa</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.persistence.jpa</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/persistence-jpa</git-plugin.propertiesDir>
     </properties>
 
     <build>
@@ -37,9 +37,11 @@
                 <filtering>false</filtering>
                 <directory>src/main/java</directory>
                 <includes>
-                    <!-- we include all .java too, so that we can reference it from the descriptions -->
                     <include>**</include>
                 </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </resource>
         </resources>
     </build>
diff --git a/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java b/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java
similarity index 100%
rename from extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java
rename to extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java
diff --git a/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java b/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java
similarity index 92%
rename from extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java
rename to extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java
index e1335c4c79..b5f7b56239 100644
--- a/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java
+++ b/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java
@@ -21,6 +21,7 @@ package org.apache.isis.extensions.commandlog.jpa.dom;
 import javax.inject.Named;
 import javax.persistence.Basic;
 import javax.persistence.Column;
+import javax.persistence.Convert;
 import javax.persistence.Entity;
 import javax.persistence.EntityListeners;
 import javax.persistence.EnumType;
@@ -34,12 +35,15 @@ import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener;
+import org.apache.isis.persistence.jpa.integration.typeconverters.schema.v2.IsisCommandDtoConverter;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 
 import static org.apache.isis.extensions.commandlog.jpa.dom.CommandLogEntry.*;
@@ -53,8 +57,8 @@ import lombok.Setter;
         schema = CommandLogEntry.SCHEMA,
         name = CommandLogEntry.TABLE,
         indexes = {
-                @Index(name = "CommandJdo__startedAt__timestamp__IDX", columnList = "startedAt, timestamp" ),
-                @Index(name = "CommandJdo__timestamp__IDX", columnList = "timestamp"),
+                @Index(name = "Command__startedAt__timestamp__IDX", columnList = "startedAt, timestamp" ),
+                @Index(name = "Command__timestamp__IDX", columnList = "timestamp"),
         }
 )
 @NamedQueries({
@@ -186,6 +190,7 @@ import lombok.Setter;
 @DomainObject(
         editing = Editing.DISABLED
 )
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 @EntityListeners(IsisEntityListener.class)
 @NoArgsConstructor
 public class CommandLogEntry extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry {
@@ -193,7 +198,7 @@ public class CommandLogEntry extends org.apache.isis.extensions.commandlog.appli
     /**
      * Intended for use on primary system.
      *
-     * @param command
+     * @param command - representation of the action invocation or property edit to be performed
      */
     public CommandLogEntry(final Command command) {
         super(command);
@@ -232,16 +237,10 @@ public class CommandLogEntry extends org.apache.isis.extensions.commandlog.appli
     private java.sql.Timestamp timestamp;
 
 
-    @Column(nullable=true, length = ReplayState.MAX_LENGTH) @Enumerated(EnumType.STRING)
-    @ReplayState
-    @Getter @Setter
-    private org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState;
-
-
-    @Column(nullable=ReplayStateFailureReason.NULLABLE, length=ReplayStateFailureReason.MAX_LENGTH)
-    @ReplayStateFailureReason
+    @Column(nullable = Target.NULLABLE, length = Target.MAX_LENGTH)
+    @Target
     @Getter @Setter
-    private String replayStateFailureReason;
+    private Bookmark target;
 
 
     @ManyToOne
@@ -255,12 +254,6 @@ public class CommandLogEntry extends org.apache.isis.extensions.commandlog.appli
     }
 
 
-    @Column(nullable = Target.NULLABLE, length = Target.MAX_LENGTH)
-    @Target
-    @Getter @Setter
-    private Bookmark target;
-
-
     @Column(nullable = LogicalMemberIdentifier.NULLABLE, length = LogicalMemberIdentifier.MAX_LENGTH)
     @LogicalMemberIdentifier
     @Getter @Setter
@@ -269,6 +262,7 @@ public class CommandLogEntry extends org.apache.isis.extensions.commandlog.appli
 
     @Lob @Basic(fetch = FetchType.LAZY)
     @Column(nullable = CommandDtoAnnot.NULLABLE, columnDefinition = "CLOB")
+    @Convert(converter = IsisCommandDtoConverter.class)
     @CommandDtoAnnot
     @Getter @Setter
     private CommandDto commandDto;
@@ -294,7 +288,21 @@ public class CommandLogEntry extends org.apache.isis.extensions.commandlog.appli
 
     @Lob @Basic(fetch = FetchType.LAZY)
     @Column(nullable = Exception.NULLABLE, columnDefinition = "CLOB")
+    @Exception
     @Getter @Setter
     private String exception;
 
+    @Column(nullable = ReplayState.NULLABLE, length = ReplayState.MAX_LENGTH) @Enumerated(EnumType.STRING)
+    @ReplayState
+    @Getter @Setter
+    private org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState;
+
+
+    @Column(nullable = ReplayStateFailureReason.NULLABLE, length = ReplayStateFailureReason.MAX_LENGTH)
+    @ReplayStateFailureReason
+    @Getter @Setter
+    private String replayStateFailureReason;
+
+
+
 }
diff --git a/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryRepository.java b/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryRepository.java
similarity index 100%
rename from extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryRepository.java
rename to extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryRepository.java
diff --git a/extensions/core/commandlog/jpa/src/main/resources/META-INF/orm-commandlog.template b/extensions/core/commandlog/persistence-jpa/src/main/resources/META-INF/orm-commandlog.template
similarity index 100%
rename from extensions/core/commandlog/jpa/src/main/resources/META-INF/orm-commandlog.template
rename to extensions/core/commandlog/persistence-jpa/src/main/resources/META-INF/orm-commandlog.template
diff --git a/extensions/core/commandlog/pom.xml b/extensions/core/commandlog/pom.xml
index 5f250483cd..a21e1c054d 100644
--- a/extensions/core/commandlog/pom.xml
+++ b/extensions/core/commandlog/pom.xml
@@ -27,10 +27,30 @@
 
 	<packaging>pom</packaging>
 
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-commandlog-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-commandlog-persistence-jdo</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-commandlog-persistence-jpa</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
 	<modules>
 		<module>applib</module>
-		<module>jdo</module>
-		<module>jpa</module>
+		<module>persistence-jdo</module>
+		<module>persistence-jpa</module>
 	</modules>
 
 </project>
diff --git a/extensions/core/commandreplay/pom.xml b/extensions/core/commandreplay/pom.xml
index 9d97273bae..e382d0eb35 100644
--- a/extensions/core/commandreplay/pom.xml
+++ b/extensions/core/commandreplay/pom.xml
@@ -29,6 +29,19 @@
 
 	<dependencyManagement>
 		<dependencies>
+
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-commandreplay-primary</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-commandreplay-secondary</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+
+
 			<dependency>
 				<groupId>org.apache.isis.testing</groupId>
 				<artifactId>isis-testing</artifactId>
diff --git a/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java
index c37b7f2ba7..8b0d1892ff 100644
--- a/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java
+++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java
@@ -30,6 +30,7 @@ import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry;
 import org.apache.isis.extensions.commandreplay.secondary.IsisModuleExtCommandReplaySecondary;
 import org.apache.isis.extensions.commandreplay.secondary.analyser.CommandReplayAnalyser;
 
+import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 /**
@@ -47,16 +48,15 @@ public class CommandReplayAnalysisService {
      * This will effectively block the running of any further commands until the administrator fixes the issue.
      */
     public void analyse(final CommandLogEntry commandLogEntry) {
-        final String analysis = analyseReplay(commandLogEntry);
-
+        val analysis = analyseReplay(commandLogEntry);
         commandLogEntry.saveAnalysis(analysis);
     }
 
     private String analyseReplay(final CommandLogEntry commandLogEntry) {
 
-        for (final CommandReplayAnalyser analyser : analysers) {
+        for (val analyser : analysers) {
             try {
-                String reason = analyser.analyzeReplay(commandLogEntry);
+                val reason = analyser.analyzeReplay(commandLogEntry);
                 if (reason != null) {
                     return reason;
                 }
diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties b/extensions/core/executionlog/adoc/antora.yml
similarity index 66%
copy from core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
copy to extensions/core/executionlog/adoc/antora.yml
index 8977db726f..448d819e20 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
+++ b/extensions/core/executionlog/adoc/antora.yml
@@ -6,7 +6,7 @@
 #  "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
+#    http://www.apache.org/licenses/LICENSE-2.0
 #
 #  Unless required by applicable law or agreed to in writing,
 #  software distributed under the License is distributed on an
@@ -15,7 +15,5 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-# -- framework internal transaction scoped --
-logging.level.org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceForJdo = DEBUG
-logging.level.org.apache.isis.applib.services.queryresultscache.QueryResultsCache = DEBUG
-logging.level.org.apache.isis.core.runtime.persistence.transaction.ChangedObjectsService = DEBUG
+name: userguide
+version: latest
diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties b/extensions/core/executionlog/adoc/modules/antora.yml
similarity index 66%
copy from core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
copy to extensions/core/executionlog/adoc/modules/antora.yml
index 8977db726f..448d819e20 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
+++ b/extensions/core/executionlog/adoc/modules/antora.yml
@@ -6,7 +6,7 @@
 #  "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
+#    http://www.apache.org/licenses/LICENSE-2.0
 #
 #  Unless required by applicable law or agreed to in writing,
 #  software distributed under the License is distributed on an
@@ -15,7 +15,5 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-# -- framework internal transaction scoped --
-logging.level.org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceForJdo = DEBUG
-logging.level.org.apache.isis.applib.services.queryresultscache.QueryResultsCache = DEBUG
-logging.level.org.apache.isis.core.runtime.persistence.transaction.ChangedObjectsService = DEBUG
+name: userguide
+version: latest
diff --git a/extensions/core/executionlog/adoc/modules/executionlog/nav.adoc b/extensions/core/executionlog/adoc/modules/executionlog/nav.adoc
new file mode 100644
index 0000000000..35b7262129
--- /dev/null
+++ b/extensions/core/executionlog/adoc/modules/executionlog/nav.adoc
@@ -0,0 +1,4 @@
+
+: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::userguide:ROOT:partial$component-nav.adoc[]
diff --git a/extensions/core/executionlog/adoc/modules/executionlog/pages/about.adoc b/extensions/core/executionlog/adoc/modules/executionlog/pages/about.adoc
new file mode 100644
index 0000000000..1581062667
--- /dev/null
+++ b/extensions/core/executionlog/adoc/modules/executionlog/pages/about.adoc
@@ -0,0 +1,11 @@
+[[executionlog]]
+= Execution Log
+
+:Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
+
+
+WARNING: TODO: v2 - to properly document.
+
+The _executionlog_ module provides an implementation of xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber] that persists xref:refguide:applib:index/services/iactn/Execution[Execution]s using either the xref:pjpa:ROOT:about.adoc[JPA/EclipseLink] or xref:pjdo:ROOT:about.adoc[JDO/DataNucleus] object store.
+
+
diff --git a/extensions/core/executionlog/adoc/modules/executionlog/partials/module-nav.adoc b/extensions/core/executionlog/adoc/modules/executionlog/partials/module-nav.adoc
new file mode 100644
index 0000000000..065e1bfd73
--- /dev/null
+++ b/extensions/core/executionlog/adoc/modules/executionlog/partials/module-nav.adoc
@@ -0,0 +1,6 @@
+
+
+
+** xref:userguide:executionlog:about.adoc[Execution Log]
+
+
diff --git a/extensions/core/commandlog/applib/pom.xml b/extensions/core/executionlog/applib/pom.xml
similarity index 86%
copy from extensions/core/commandlog/applib/pom.xml
copy to extensions/core/executionlog/applib/pom.xml
index 714c146b54..518714a2aa 100644
--- a/extensions/core/commandlog/applib/pom.xml
+++ b/extensions/core/executionlog/applib/pom.xml
@@ -15,16 +15,16 @@
 
     <parent>
         <groupId>org.apache.isis.extensions</groupId>
-        <artifactId>isis-extensions-commandlog</artifactId>
+        <artifactId>isis-extensions-executionlog</artifactId>
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-extensions-commandlog-applib</artifactId>
-    <name>Apache Isis Ext - Command Log API</name>
+    <artifactId>isis-extensions-executionlog-applib</artifactId>
+    <name>Apache Isis Ext - Execution Log API</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.applib</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/applib</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.executionlog.applib</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/executionlog/applib</git-plugin.propertiesDir>
     </properties>
 
     <build>
@@ -37,9 +37,11 @@
                 <filtering>false</filtering>
                 <directory>src/main/java</directory>
                 <includes>
-                    <!-- we include all .java too, so that we can reference it from the descriptions -->
                     <include>**</include>
                 </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </resource>
         </resources>
     </build>
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/IsisModuleExtExecutionLogApplib.java b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/IsisModuleExtExecutionLogApplib.java
new file mode 100644
index 0000000000..ef25c85ea8
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/IsisModuleExtExecutionLogApplib.java
@@ -0,0 +1,57 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.extensions.executionlog.applib;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+import org.apache.isis.core.config.util.SpringProfileUtil;
+import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures;
+
+@Configuration
+@Import({
+})
+public class IsisModuleExtExecutionLogApplib
+implements ModuleWithFixtures {
+
+    public static final String NAMESPACE = "isis.ext.executionLog";
+    public static final String SCHEMA = "isisExtExecutionLog";
+
+    public abstract static class TitleUiEvent<S>
+        extends org.apache.isis.applib.events.ui.TitleUiEvent<S> { }
+
+    public abstract static class IconUiEvent<S>
+        extends org.apache.isis.applib.events.ui.IconUiEvent<S> { }
+
+    public abstract static class CssClassUiEvent<S>
+        extends org.apache.isis.applib.events.ui.CssClassUiEvent<S> { }
+
+    public abstract static class LayoutUiEvent<S>
+        extends org.apache.isis.applib.events.ui.LayoutUiEvent<S> { }
+
+    public abstract static class ActionDomainEvent<S>
+        extends org.apache.isis.applib.events.domain.ActionDomainEvent<S> { }
+
+    public abstract static class CollectionDomainEvent<S,T>
+        extends org.apache.isis.applib.events.domain.CollectionDomainEvent<S,T> { }
+    public abstract static class PropertyDomainEvent<S,T>
+        extends org.apache.isis.applib.events.domain.PropertyDomainEvent<S,T> { }
+
+
+}
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/contributions/ExecutionLogEntry_siblingExecutions.java b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/contributions/ExecutionLogEntry_siblingExecutions.java
new file mode 100644
index 0000000000..59fd14b241
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/contributions/ExecutionLogEntry_siblingExecutions.java
@@ -0,0 +1,36 @@
+package org.apache.isis.extensions.executionlog.applib.contributions;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+
+import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.extensions.executionlog.applib.IsisModuleExtExecutionLogApplib;
+import org.apache.isis.extensions.executionlog.applib.dom.ExecutionLogEntry;
+import org.apache.isis.extensions.executionlog.applib.dom.ExecutionLogEntryRepository;
+
+import lombok.RequiredArgsConstructor;
+import lombok.val;
+
+@Collection(
+        domainEvent = ExecutionLogEntry_siblingExecutions.CollectionDomainEvent.class
+)
+@RequiredArgsConstructor
+public class ExecutionLogEntry_siblingExecutions {
+
+    private final ExecutionLogEntry executionLogEntry;
+
+    public static class CollectionDomainEvent
+            extends IsisModuleExtExecutionLogApplib.CollectionDomainEvent<ExecutionLogEntry_siblingExecutions, ExecutionLogEntry> { }
+
+
+    public List<ExecutionLogEntry> coll() {
+        val entries = executionLogEntryRepository.findByInteractionId(executionLogEntry.getInteractionId());
+        entries.remove(executionLogEntry);
+        return entries;
+    }
+
+    @Inject ExecutionLogEntryRepository<ExecutionLogEntry> executionLogEntryRepository;
+
+}
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/contributions/HasInteractionId_executionLogEntries.java b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/contributions/HasInteractionId_executionLogEntries.java
new file mode 100644
index 0000000000..4f370d211b
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/contributions/HasInteractionId_executionLogEntries.java
@@ -0,0 +1,33 @@
+package org.apache.isis.extensions.executionlog.applib.contributions;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
+import org.apache.isis.extensions.executionlog.applib.IsisModuleExtExecutionLogApplib;
+import org.apache.isis.extensions.executionlog.applib.dom.ExecutionLogEntry;
+import org.apache.isis.extensions.executionlog.applib.dom.ExecutionLogEntryRepository;
+
+import lombok.RequiredArgsConstructor;
+
+@Collection(
+        domainEvent = HasInteractionId_executionLogEntries.CollectionDomainEvent.class
+)
+@RequiredArgsConstructor
+public class HasInteractionId_executionLogEntries {
+
+    private final HasInteractionId hasInteractionId;
+
+    public static class CollectionDomainEvent
+            extends IsisModuleExtExecutionLogApplib.CollectionDomainEvent<HasInteractionId_executionLogEntries, ExecutionLogEntry> { }
+
+
+    public List<ExecutionLogEntry> act() {
+        return executionLogEntryRepository.findByInteractionId(hasInteractionId.getInteractionId());
+    }
+
+    @Inject ExecutionLogEntryRepository<ExecutionLogEntry> executionLogEntryRepository;
+
+}
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntry.java b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntry.java
new file mode 100644
index 0000000000..646dd631a2
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntry.java
@@ -0,0 +1,432 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.extensions.executionlog.applib.dom;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.math.BigDecimal;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+
+import javax.annotation.Priority;
+import javax.inject.Named;
+import javax.validation.constraints.Digits;
+
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.mixins.system.DomainChangeRecord;
+import org.apache.isis.applib.mixins.system.HasInteractionId;
+import org.apache.isis.applib.mixins.system.HasInteractionIdAndSequence;
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.iactn.ActionInvocation;
+import org.apache.isis.applib.services.iactn.Execution;
+import org.apache.isis.applib.services.iactn.HasInteractionDto;
+import org.apache.isis.applib.services.iactn.PropertyEdit;
+import org.apache.isis.applib.services.tablecol.TableColumnOrderForCollectionTypeAbstract;
+import org.apache.isis.applib.util.ObjectContracts;
+import org.apache.isis.applib.util.TitleBuffer;
+import org.apache.isis.applib.util.ToString;
+import org.apache.isis.extensions.executionlog.applib.IsisModuleExtExecutionLogApplib;
+import org.apache.isis.extensions.executionlog.applib.util.BigDecimalUtils;
+import org.apache.isis.schema.ixn.v2.InteractionDto;
+import org.apache.isis.schema.ixn.v2.MemberExecutionDto;
+
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+/**
+ * A persistent representation of an {@link org.apache.isis.applib.services.iactn.Execution execution} (property edit or
+ * action invocation), within a larger
+ * {@link org.apache.isis.applib.services.iactn.Interaction interaction}.
+ *
+ *  Note that this class implements {@link HasInteractionDto}, providing access to
+ *  {@link org.apache.isis.applib.services.iactn.Interaction}, a serialized representation containing the {@link org.apache.isis.applib.services.iactn.Execution}.
+ */
+@Named(ExecutionLogEntry.LOGICAL_TYPE_NAME)
+@DomainObject(
+        editing = Editing.DISABLED
+)
+@DomainObjectLayout(
+        named = "Execution",
+        titleUiEvent = ExecutionLogEntry.TitleUiEvent.class,
+        iconUiEvent = ExecutionLogEntry.IconUiEvent.class,
+        cssClassUiEvent = ExecutionLogEntry.CssClassUiEvent.class,
+        layoutUiEvent = ExecutionLogEntry.LayoutUiEvent.class
+)
+@NoArgsConstructor
+public abstract class ExecutionLogEntry
+implements Comparable<ExecutionLogEntry>, DomainChangeRecord, HasInteractionIdAndSequence, HasInteractionDto {
+
+    public final static String LOGICAL_TYPE_NAME = IsisModuleExtExecutionLogApplib.NAMESPACE + ".ExecutionLog";
+    public static final String SCHEMA = IsisModuleExtExecutionLogApplib.SCHEMA;
+    public static final String TABLE = "Execution";
+
+    public static class TitleUiEvent extends IsisModuleExtExecutionLogApplib.TitleUiEvent<ExecutionLogEntry> { }
+    public static class IconUiEvent extends IsisModuleExtExecutionLogApplib.IconUiEvent<ExecutionLogEntry> { }
+    public static class CssClassUiEvent extends IsisModuleExtExecutionLogApplib.CssClassUiEvent<ExecutionLogEntry> { }
+    public static class LayoutUiEvent extends IsisModuleExtExecutionLogApplib.LayoutUiEvent<ExecutionLogEntry> { }
+
+    public static abstract class PropertyDomainEvent<T> extends IsisModuleExtExecutionLogApplib.PropertyDomainEvent<ExecutionLogEntry, T> { }
+    public static abstract class CollectionDomainEvent<T> extends IsisModuleExtExecutionLogApplib.CollectionDomainEvent<ExecutionLogEntry, T> { }
+    public static abstract class ActionDomainEvent extends IsisModuleExtExecutionLogApplib.ActionDomainEvent<ExecutionLogEntry> { }
+
+    @UtilityClass
+    public static class Nq {
+    }
+
+    public ExecutionLogEntry(@NonNull Execution<? extends MemberExecutionDto,?> execution) {
+
+        val interactionIdStr = execution.getInteraction().getInteractionId().toString();
+        setInteractionIdStr(interactionIdStr);
+
+        val memberExecutionDto = execution.getDto();
+        setSequence(memberExecutionDto.getSequence());
+
+        val interactionDto = new InteractionDto();
+        interactionDto.setInteractionId(interactionIdStr);
+        interactionDto.setExecution(memberExecutionDto);
+        setInteractionDto(interactionDto);
+
+        setTimestamp(execution.getStartedAt());
+        setStartedAt(execution.getStartedAt());
+        setCompletedAt(execution.getCompletedAt());
+
+        setLogicalMemberIdentifier(memberExecutionDto.getLogicalMemberIdentifier());
+
+        setTarget(execution.getEvent().getSubject());
+        setUsername(memberExecutionDto.getUser());
+
+        if(execution instanceof PropertyEdit) {
+            setExecutionType(ExecutionLogEntryType.PROPERTY_EDIT);
+        } else if(execution instanceof ActionInvocation) {
+            setExecutionType(ExecutionLogEntryType.ACTION_INVOCATION);
+        } else {
+            // shouldn't happen, there are no other subtypes
+            throw new IllegalArgumentException(String.format("Execution subtype unknown: %s", execution.getClass().getName()));
+        }
+    }
+
+
+    private static final DateTimeFormatter formatter =
+            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+
+    public String title() {
+        return new TitleBuffer()
+                .append(formatter.format(getTimestamp().toLocalDateTime()))
+                .append(" ")
+                .append(getLogicalMemberIdentifier())
+                .toString();
+    }
+
+
+    @DomainChangeRecord.Type
+    @Override
+    public ChangeType getType() {
+        return ChangeType.EXECUTION;
+    }
+
+
+    @Property(
+            domainEvent = InteractionId.DomainEvent.class
+    )
+    @DomainChangeRecord.InteractionId
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface InteractionId {
+        class DomainEvent extends PropertyDomainEvent<UUID> {}
+    }
+    @Override
+    @InteractionId
+    public UUID getInteractionId() {
+        return UUID.fromString(getInteractionIdStr());
+    }
+
+
+
+    /**
+     * This is the persistence model for {@link #getInteractionId()}; hidden everywhere.
+     */
+    @HasInteractionId.InteractionIdStr // hidden everywhere
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface InteractionIdStr {
+        int MAX_LENGTH = HasInteractionId.InteractionIdStr.MAX_LENGTH;
+        boolean NULLABLE = HasInteractionId.InteractionIdStr.NULLABLE;
+        String ALLOWS_NULL = HasInteractionId.InteractionIdStr.ALLOWS_NULL;
+        String NAME = HasInteractionId.InteractionIdStr.NAME;
+    }
+    @InteractionIdStr
+    public abstract String getInteractionIdStr();
+    public abstract void setInteractionIdStr(String interactionIdStr);
+
+
+
+    @Property(
+            domainEvent = Sequence.DomainEvent.class
+    )
+    @HasInteractionIdAndSequence.Sequence
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface Sequence {
+        class DomainEvent extends PropertyDomainEvent<Integer> {}
+        boolean NULLABLE = HasInteractionIdAndSequence.Sequence.NULLABLE;
+        String ALLOWS_NULL = HasInteractionIdAndSequence.Sequence.ALLOWS_NULL;
+    }
+    @Sequence
+    @Override
+    public abstract int getSequence();
+    public abstract void setSequence(int sequence);
+
+
+
+    @Property(
+            domainEvent = ExecutionType.DomainEvent.class
+    )
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface ExecutionType {
+        class DomainEvent extends PropertyDomainEvent<ExecutionLogEntryType> {}
+        boolean NULLABLE = false;
+        String ALLOWS_NULL = "false";
+    }
+    @ExecutionType
+    public abstract ExecutionLogEntryType getExecutionType();
+    public abstract void setExecutionType(ExecutionLogEntryType executionType);
+
+
+
+    @Property(
+            domainEvent = Username.DomainEvent.class
+    )
+    @DomainChangeRecord.Username
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface Username {
+        class DomainEvent extends PropertyDomainEvent<String> {}
+        int MAX_LENGTH = DomainChangeRecord.Username.MAX_LENGTH;
+        boolean NULLABLE = DomainChangeRecord.Username.NULLABLE;
+        String ALLOWS_NULL = DomainChangeRecord.Username.ALLOWS_NULL;
+    }
+    @Override
+    @Username
+    public abstract String getUsername();
+    public abstract void setUsername(String userName);
+
+
+
+    @Property(
+            domainEvent = Timestamp.DomainEvent.class
+    )
+    @DomainChangeRecord.Timestamp
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface Timestamp {
+        class DomainEvent extends PropertyDomainEvent<java.sql.Timestamp> {}
+        boolean NULLABLE = DomainChangeRecord.Timestamp.NULLABLE;
+        String ALLOWS_NULL = DomainChangeRecord.Timestamp.ALLOWS_NULL;
+    }
+    @Timestamp
+    @Override
+    public abstract java.sql.Timestamp getTimestamp();
+    public abstract void setTimestamp(java.sql.Timestamp timestamp);
+
+
+
+    @Property(
+            domainEvent = Target.DomainEvent.class
+    )
+    @DomainChangeRecord.Target
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface Target {
+        class DomainEvent extends PropertyDomainEvent<Bookmark> {}
+        int MAX_LENGTH = DomainChangeRecord.Target.MAX_LENGTH;
+        boolean NULLABLE = DomainChangeRecord.Target.NULLABLE;
+        String ALLOWS_NULL = DomainChangeRecord.Target.ALLOWS_NULL;
+    }
+    @Override
+    @Target
+    public abstract Bookmark getTarget();
+    public abstract void setTarget(Bookmark target);
+
+
+
+    @Property(
+            domainEvent = LogicalMemberIdentifier.DomainEvent.class,
+            editing = Editing.DISABLED
+    )
+    @PropertyLayout(
+            hidden = Where.ALL_TABLES
+    )
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface LogicalMemberIdentifier {
+        class DomainEvent extends PropertyDomainEvent<String> {}
+        int MAX_LENGTH = 255;
+        boolean NULLABLE = false;
+        String ALLOWS_NULL = "false";
+    }
+    @LogicalMemberIdentifier
+    public abstract String getLogicalMemberIdentifier();
+    public abstract void setLogicalMemberIdentifier(String logicalMemberIdentifier);
+
+
+
+
+
+    @Property(
+            domainEvent = InteractionDtoAnnot.DomainEvent.class
+    )
+    @HasInteractionDto.InteractionDtoAnnot
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface InteractionDtoAnnot {
+        class DomainEvent extends PropertyDomainEvent<InteractionDto> {}
+        boolean NULLABLE = HasInteractionDto.InteractionDtoAnnot.NULLABLE;
+        String ALLOWS_NULL = HasInteractionDto.InteractionDtoAnnot.ALLOWS_NULL;
+    }
+    @InteractionDtoAnnot
+    @Override
+    public abstract InteractionDto getInteractionDto();
+    public abstract void setInteractionDto(InteractionDto commandDto);
+
+
+
+    @Property(
+            domainEvent = StartedAt.DomainEvent.class,
+            editing = Editing.DISABLED,
+            optionality = Optionality.OPTIONAL
+    )
+    @Parameter(
+            optionality = Optionality.OPTIONAL
+    )
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface StartedAt {
+        class DomainEvent extends PropertyDomainEvent<java.sql.Timestamp> {}
+        boolean NULLABLE = false;
+        String ALLOWS_NULL = "false";
+    }
+    public abstract java.sql.Timestamp getStartedAt();
+    public abstract void setStartedAt(java.sql.Timestamp startedAt);
+
+
+
+    @Property(
+            domainEvent = CompletedAt.DomainEvent.class,
+            editing = Editing.DISABLED,
+            optionality = Optionality.OPTIONAL
+    )
+    @Parameter(
+            optionality = Optionality.OPTIONAL
+    )
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface CompletedAt {
+        class DomainEvent extends PropertyDomainEvent<java.sql.Timestamp> {}
+        boolean NULLABLE = false;
+        String ALLOWS_NULL = "false";
+    }
+    public abstract java.sql.Timestamp getCompletedAt();
+    public abstract void setCompletedAt(java.sql.Timestamp completedAt);
+
+
+
+    @Property(
+            domainEvent = Duration.DomainEvent.class,
+            editing = Editing.DISABLED
+    )
+    @Digits(integer=Duration.DIGITS_INTEGER, fraction=Duration.DIGITS_FRACTION)
+    @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface Duration {
+        class DomainEvent extends PropertyDomainEvent<BigDecimal> {}
+        int DIGITS_INTEGER = 5;
+        int DIGITS_FRACTION = 3;
+    }
+    /**
+     * The number of seconds (to 3 decimal places) that this execution lasted, derived from
+     * {@link #getStartedAt()} and {@link #getCompletedAt()}.
+     */
+    @Duration
+    public BigDecimal getDuration() {
+        return BigDecimalUtils.durationBetween(getStartedAt(), getCompletedAt());
+    }
+
+
+    @Override
+    public int compareTo(final ExecutionLogEntry other) {
+        return this.getTimestamp().compareTo(other.getTimestamp());
+    }
+
+
+    static final ToString<ExecutionLogEntry> stringifier = ObjectContracts
+            .toString("interactionId", ExecutionLogEntry::getInteractionId)
+            .thenToString("sequence", ExecutionLogEntry::getSequence)
+            .thenToString("username", ExecutionLogEntry::getUsername)
+            .thenToString("type", ExecutionLogEntry::getExecutionType)
+            .thenToString("timestamp", ExecutionLogEntry::getTimestamp)
+            .thenToString("target", ExecutionLogEntry::getTarget)
+            .thenToString("logicalMemberIdentifier", ExecutionLogEntry::getLogicalMemberIdentifier)
+            .thenToStringOmitIfAbsent("startedAt", ExecutionLogEntry::getStartedAt)
+            .thenToStringOmitIfAbsent("completedAt", ExecutionLogEntry::getCompletedAt);
+
+    @Override
+    public String toString() {
+        return stringifier.toString(this);
+    }
+
+    @Service
+    @Priority(PriorityPrecedence.LATE - 10) // before the framework's own default.
+    public static class TableColumnOrderDefault extends TableColumnOrderForCollectionTypeAbstract<ExecutionLogEntry> {
+
+        public TableColumnOrderDefault() { super(ExecutionLogEntry.class); }
+
+        @Override
+        protected List<String> orderParented(final Object parent, final String collectionId, final List<String> propertyIds) {
+            return ordered(propertyIds);
+        }
+
+        @Override
+        protected List<String> orderStandalone(final List<String> propertyIds) {
+            return ordered(propertyIds);
+        }
+
+        private List<String> ordered(final List<String> propertyIds) {
+            return Arrays.asList(
+                    "timestamp", "target", "logicalMemberIdentifier", "username", "duration", "interactionId", "sequence"
+            );
+        }
+    }
+
+}
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntry.layout.fallback.xml b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntry.layout.fallback.xml
new file mode 100644
index 0000000000..6a09caa6f5
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntry.layout.fallback.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<bs3:grid xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd http://isis.apache.org/applib/layout/links http://isis.apache.org/applib/layout/links/links.xsd http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd" xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3" xmlns:cpt="http://isis.apache.org/applib/layout/component" xmlns:lnk="h [...]
+    <bs3:row>
+        <bs3:col span="12" unreferencedActions="true">
+            <cpt:domainObject/>
+            <cpt:action id="links"/>
+        </bs3:col>
+    </bs3:row>
+    <bs3:row>
+        <bs3:col span="4">
+            <bs3:row>
+                <bs3:col span="12">
+                    <cpt:fieldSet name="Identifiers" id="identifiers" unreferencedProperties="true">
+                        <cpt:action id="findChangesByDate" position="PANEL_DROPDOWN"/>
+                        <cpt:action id="recentChanges" position="PANEL_DROPDOWN"/>
+                        <cpt:action id="clearHints" position="PANEL_DROPDOWN"/>
+                        <cpt:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/>
+                        <cpt:action id="downloadJdoMetadata" position="PANEL_DROPDOWN"/>
+                        <cpt:action id="rebuildMetamodel" position="PANEL_DROPDOWN"/>
+                        <cpt:action id="recentAuditEntries" position="PANEL_DROPDOWN"/>
+                        <cpt:property id="type"/>
+                        <cpt:property id="eventType"/>
+                        <cpt:property id="interactionId"/>
+                        <cpt:property id="sequence"/>
+                        <cpt:property id="logicalMemberIdentifier"/>
+                    </cpt:fieldSet>
+                    <cpt:fieldSet name="Who and When">
+                        <cpt:property id="username"/>
+                        <cpt:property id="timestamp"/>
+                    </cpt:fieldSet>
+                    <cpt:fieldSet name="Target" id="target">
+                        <cpt:property id="targetClass"/>
+                        <cpt:property id="targetStr"/>
+                    </cpt:fieldSet>
+                </bs3:col>
+            </bs3:row>
+            <bs3:row>
+                <bs3:col span="12">
+                    <bs3:tabGroup>
+                        <bs3:tab name="Target">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Target" id="target">
+                                        <cpt:property id="targetLogicalTypeName"/>
+                                        <cpt:property id="target"/>
+                                    </cpt:fieldSet>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                    </bs3:tabGroup>
+                </bs3:col>
+            </bs3:row>
+        </bs3:col>
+        <bs3:col span="8">
+            <cpt:fieldSet name="Arguments" id="arguments">
+                <cpt:property id="interactionDto" multiLine="30" labelPosition="TOP"/>
+            </cpt:fieldSet>
+        </bs3:col>
+    </bs3:row>
+    <bs3:row>
+        <bs3:col span="12">
+            <bs3:tabGroup>
+                <bs3:tab name="Related Command">
+                    <bs3:row>
+                        <bs3:col span="12">
+                            <cpt:fieldSet name="">
+                                <cpt:property id="commandLogEntry"/>
+                            </cpt:fieldSet>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+                <bs3:tab name="Related Executions">
+                    <bs3:row>
+                        <bs3:col span="12">
+                            <cpt:collection id="siblingExecutions"/>
+                        </bs3:col>
+                        <bs3:col span="0">
+                            <cpt:collection id="executionLogEntriesInInteraction"/>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+                <bs3:tab name="Related Audit Entries">
+                    <bs3:row>
+                        <bs3:col span="12">
+                            <cpt:collection id="auditLogEntriesInInteraction"/>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+            </bs3:tabGroup>
+        </bs3:col>
+    </bs3:row>
+
+    <bs3:row>
+        <bs3:col span="12" unreferencedCollections="true">
+        </bs3:col>
+    </bs3:row>
+</bs3:grid>
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntry.png b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntry.png
new file mode 100644
index 0000000000..cb3a325011
Binary files /dev/null and b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntry.png differ
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntryPK.java b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntryPK.java
new file mode 100644
index 0000000000..ab9b5d59d4
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntryPK.java
@@ -0,0 +1,71 @@
+package org.apache.isis.extensions.executionlog.applib.dom;
+
+import java.io.Serializable;
+import java.util.StringTokenizer;
+import java.util.UUID;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.val;
+
+@NoArgsConstructor
+public class ExecutionLogEntryPK implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String SEPARATOR = "_";
+
+    @Getter @Setter
+    public UUID transactionId;
+    @Getter @Setter
+    public int sequence;
+
+    public ExecutionLogEntryPK(final String value) {
+        val token = new StringTokenizer (value, SEPARATOR);
+        this.transactionId = UUID.fromString(token.nextToken());
+        this.sequence = Integer.parseInt(token.nextToken());
+    }
+
+    @Override
+    public String toString() {
+        return transactionId + SEPARATOR + sequence;
+    }
+
+
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((transactionId == null) ? 0 : transactionId.hashCode());
+        result = prime * result + sequence;
+        return result;
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o)
+            return true;
+        if (o == null)
+            return false;
+        if (getClass() != o.getClass())
+            return false;
+
+        ExecutionLogEntryPK other = (ExecutionLogEntryPK) o;
+        if (transactionId == null) {
+            if (other.transactionId != null) {
+                return false;
+            }
+        } else {
+            if (!transactionId.equals(other.transactionId)) {
+                return false;
+            }
+        }
+        if (sequence != other.sequence) {
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntryRepository.java b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntryRepository.java
new file mode 100644
index 0000000000..3c383098d9
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntryRepository.java
@@ -0,0 +1,14 @@
+package org.apache.isis.extensions.executionlog.applib.dom;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.isis.applib.services.iactn.Execution;
+import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
+
+public abstract class ExecutionLogEntryRepository<E extends ExecutionLogEntry> implements ExecutionSubscriber {
+
+    public abstract E createEntryAndPersist(Execution<?, ?> execution);
+
+    public abstract List<E> findByInteractionId(UUID interactionId);
+}
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntryType.java b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntryType.java
new file mode 100644
index 0000000000..129f6d8583
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/dom/ExecutionLogEntryType.java
@@ -0,0 +1,6 @@
+package org.apache.isis.extensions.executionlog.applib.dom;
+
+public enum ExecutionLogEntryType {
+    ACTION_INVOCATION,
+    PROPERTY_EDIT;
+}
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/spiimpl/ExecutionSubscriberForLog.java b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/spiimpl/ExecutionSubscriberForLog.java
new file mode 100644
index 0000000000..33a049ca3d
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/spiimpl/ExecutionSubscriberForLog.java
@@ -0,0 +1,24 @@
+package org.apache.isis.extensions.executionlog.applib.spiimpl;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.services.iactn.Execution;
+import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
+import org.apache.isis.extensions.executionlog.applib.dom.ExecutionLogEntryRepository;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor
+public class ExecutionSubscriberForLog implements ExecutionSubscriber {
+
+    final @Inject ExecutionLogEntryRepository repository;
+
+    @Override
+    public void onExecution(Execution<?, ?> execution) {
+        repository.createEntryAndPersist(execution);
+    }
+
+}
diff --git a/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/util/BigDecimalUtils.java b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/util/BigDecimalUtils.java
new file mode 100644
index 0000000000..df830d3451
--- /dev/null
+++ b/extensions/core/executionlog/applib/src/main/java/org/apache/isis/extensions/executionlog/applib/util/BigDecimalUtils.java
@@ -0,0 +1,27 @@
+package org.apache.isis.extensions.executionlog.applib.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.sql.Timestamp;
+
+public class BigDecimalUtils {
+    /**
+     * @return in seconds, to 3 decimal places.
+     */
+    public static BigDecimal durationBetween(Timestamp startedAt, Timestamp completedAt) {
+        if (completedAt == null) {
+            return null;
+        } else {
+            long millis = completedAt.getTime() - startedAt.getTime();
+            return toSeconds(millis);
+        }
+    }
+
+    private static final BigDecimal DIVISOR = new BigDecimal(1000);
+
+    private static BigDecimal toSeconds(long millis) {
+        return new BigDecimal(millis)
+                .divide(DIVISOR, RoundingMode.HALF_EVEN)
+                .setScale(3, RoundingMode.HALF_EVEN);
+    }
+}
diff --git a/extensions/core/commandlog/jdo/pom.xml b/extensions/core/executionlog/persistence-jdo/pom.xml
similarity index 83%
copy from extensions/core/commandlog/jdo/pom.xml
copy to extensions/core/executionlog/persistence-jdo/pom.xml
index a850ba9987..0696fc69bb 100644
--- a/extensions/core/commandlog/jdo/pom.xml
+++ b/extensions/core/executionlog/persistence-jdo/pom.xml
@@ -15,16 +15,16 @@
 
     <parent>
         <groupId>org.apache.isis.extensions</groupId>
-        <artifactId>isis-extensions-commandlog</artifactId>
+        <artifactId>isis-extensions-executionlog</artifactId>
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-extensions-commandlog-jdo</artifactId>
-    <name>Apache Isis Ext - Command Log Implementation (JDO)</name>
+    <artifactId>isis-extensions-executionlog-jdo</artifactId>
+    <name>Apache Isis Ext - Execution Log Implementation (JDO)</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.jdo</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/jdo</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.executionlog.persistence.jdo</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/executionlog/persistence-jdo</git-plugin.propertiesDir>
     </properties>
 
     <build>
@@ -37,9 +37,11 @@
                 <filtering>false</filtering>
                 <directory>src/main/java</directory>
                 <includes>
-                    <!-- we include all .java too, so that we can reference it from the descriptions -->
                     <include>**</include>
                 </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </resource>
         </resources>
     </build>
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionlog/persistence-jdo/src/main/java/org.apache.isis.extensions.executionlog.jdo/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionlog/persistence-jdo/src/main/java/org.apache.isis.extensions.executionlog.jdo/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionlog/persistence-jdo/src/test/java/org.apache.isis.extensions.executionlog.jdo/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionlog/persistence-jdo/src/test/java/org.apache.isis.extensions.executionlog.jdo/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionlog/persistence-jpa/src/main/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionlog/persistence-jpa/src/main/java/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionlog/persistence-jpa/src/test/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionlog/persistence-jpa/src/test/java/.gitkeep
diff --git a/extensions/core/commandreplay/pom.xml b/extensions/core/executionlog/pom.xml
similarity index 72%
copy from extensions/core/commandreplay/pom.xml
copy to extensions/core/executionlog/pom.xml
index 9d97273bae..600d017dda 100644
--- a/extensions/core/commandreplay/pom.xml
+++ b/extensions/core/executionlog/pom.xml
@@ -21,41 +21,38 @@
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 
-	<artifactId>isis-extensions-commandreplay</artifactId>
-	<name>Apache Isis Ext - Command Replay</name>
-	<description>Replays commands to secondary system</description>
+	<artifactId>isis-extensions-executionlog</artifactId>
+	<name>Apache Isis Ext - Execution Log</name>
+	<description>Logs executions</description>
 
 	<packaging>pom</packaging>
 
 	<dependencyManagement>
 		<dependencies>
 			<dependency>
-				<groupId>org.apache.isis.testing</groupId>
-				<artifactId>isis-testing</artifactId>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionlog-applib</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
-				<scope>import</scope>
-				<type>pom</type>
 			</dependency>
-
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions</artifactId>
+				<artifactId>isis-extensions-executionlog-persistence-jdo</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
-				<scope>import</scope>
-				<type>pom</type>
 			</dependency>
-
 			<dependency>
-		    	<groupId>org.apache.isis.viewer</groupId>
-            	<artifactId>isis-viewer-restfulobjects-client</artifactId>
-        		<version>2.0.0-SNAPSHOT</version>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionlog-persistence-jpa</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 		</dependencies>
 	</dependencyManagement>
 
 	<modules>
-		<module>primary</module>
-		<module>secondary</module>
+		<module>applib</module>
+		<module>persistence-jdo</module>
+<!--
+		<module>persistence-jpa</module>
+-->
 	</modules>
 
 </project>
diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties b/extensions/core/executionoutbox/adoc/antora.yml
similarity index 66%
copy from core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
copy to extensions/core/executionoutbox/adoc/antora.yml
index 8977db726f..448d819e20 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
+++ b/extensions/core/executionoutbox/adoc/antora.yml
@@ -6,7 +6,7 @@
 #  "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
+#    http://www.apache.org/licenses/LICENSE-2.0
 #
 #  Unless required by applicable law or agreed to in writing,
 #  software distributed under the License is distributed on an
@@ -15,7 +15,5 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-# -- framework internal transaction scoped --
-logging.level.org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceForJdo = DEBUG
-logging.level.org.apache.isis.applib.services.queryresultscache.QueryResultsCache = DEBUG
-logging.level.org.apache.isis.core.runtime.persistence.transaction.ChangedObjectsService = DEBUG
+name: userguide
+version: latest
diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties b/extensions/core/executionoutbox/adoc/modules/antora.yml
similarity index 66%
copy from core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
copy to extensions/core/executionoutbox/adoc/modules/antora.yml
index 8977db726f..448d819e20 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugTransactionScopedServices.properties
+++ b/extensions/core/executionoutbox/adoc/modules/antora.yml
@@ -6,7 +6,7 @@
 #  "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
+#    http://www.apache.org/licenses/LICENSE-2.0
 #
 #  Unless required by applicable law or agreed to in writing,
 #  software distributed under the License is distributed on an
@@ -15,7 +15,5 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-# -- framework internal transaction scoped --
-logging.level.org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceForJdo = DEBUG
-logging.level.org.apache.isis.applib.services.queryresultscache.QueryResultsCache = DEBUG
-logging.level.org.apache.isis.core.runtime.persistence.transaction.ChangedObjectsService = DEBUG
+name: userguide
+version: latest
diff --git a/extensions/core/executionoutbox/adoc/modules/executionoutbox/nav.adoc b/extensions/core/executionoutbox/adoc/modules/executionoutbox/nav.adoc
new file mode 100644
index 0000000000..35b7262129
--- /dev/null
+++ b/extensions/core/executionoutbox/adoc/modules/executionoutbox/nav.adoc
@@ -0,0 +1,4 @@
+
+: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::userguide:ROOT:partial$component-nav.adoc[]
diff --git a/extensions/core/executionoutbox/adoc/modules/executionoutbox/pages/about.adoc b/extensions/core/executionoutbox/adoc/modules/executionoutbox/pages/about.adoc
new file mode 100644
index 0000000000..4e823c6ade
--- /dev/null
+++ b/extensions/core/executionoutbox/adoc/modules/executionoutbox/pages/about.adoc
@@ -0,0 +1,16 @@
+[[executionoutbox]]
+= Execution Outbox
+
+:Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
+
+
+WARNING: TODO: v2 - to properly document.
+
+The _executionoutbox_ module provides an implementation of xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber] that persists xref:refguide:applib:index/services/iactn/Execution[Execution]s into an "outbox" (using either the xref:pjpa:ROOT:about.adoc[JPA/EclipseLink] or xref:pjdo:ROOT:about.adoc[JDO/DataNucleus] object store).
+The purpose of the "outbox" is to act as a temporary store of executions to be propogated to other "downstream" systems.
+
+The module also provides a REST API, a rest client and DTOs to represent the payloads between these two services.
+The client polls the outbox through the REST API (for example every 15 seconds), and uses it to download any new executions.
+Once processed (eg published to a message bus), the client then uses the same REST API to delete the executions.
+
+
diff --git a/extensions/core/executionoutbox/adoc/modules/executionoutbox/partials/module-nav.adoc b/extensions/core/executionoutbox/adoc/modules/executionoutbox/partials/module-nav.adoc
new file mode 100644
index 0000000000..065e1bfd73
--- /dev/null
+++ b/extensions/core/executionoutbox/adoc/modules/executionoutbox/partials/module-nav.adoc
@@ -0,0 +1,6 @@
+
+
+
+** xref:userguide:executionlog:about.adoc[Execution Log]
+
+
diff --git a/extensions/core/commandlog/applib/pom.xml b/extensions/core/executionoutbox/applib/pom.xml
similarity index 85%
copy from extensions/core/commandlog/applib/pom.xml
copy to extensions/core/executionoutbox/applib/pom.xml
index 714c146b54..b895ad1347 100644
--- a/extensions/core/commandlog/applib/pom.xml
+++ b/extensions/core/executionoutbox/applib/pom.xml
@@ -15,16 +15,16 @@
 
     <parent>
         <groupId>org.apache.isis.extensions</groupId>
-        <artifactId>isis-extensions-commandlog</artifactId>
+        <artifactId>isis-extensions-executionoutbox</artifactId>
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-extensions-commandlog-applib</artifactId>
-    <name>Apache Isis Ext - Command Log API</name>
+    <artifactId>isis-extensions-executionoutbox-applib</artifactId>
+    <name>Apache Isis Ext - Execution Outbox API</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.applib</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/applib</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.executionoutbox.applib</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/executionoutbox/applib</git-plugin.propertiesDir>
     </properties>
 
     <build>
@@ -37,9 +37,11 @@
                 <filtering>false</filtering>
                 <directory>src/main/java</directory>
                 <includes>
-                    <!-- we include all .java too, so that we can reference it from the descriptions -->
                     <include>**</include>
                 </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </resource>
         </resources>
     </build>
diff --git a/extensions/core/executionoutbox/applib/src/main/java/org/apache/isis/extensions/executionoutbox/applib/IsisModuleExtExecutionOutboxApplib.java b/extensions/core/executionoutbox/applib/src/main/java/org/apache/isis/extensions/executionoutbox/applib/IsisModuleExtExecutionOutboxApplib.java
new file mode 100644
index 0000000000..33e685c692
--- /dev/null
+++ b/extensions/core/executionoutbox/applib/src/main/java/org/apache/isis/extensions/executionoutbox/applib/IsisModuleExtExecutionOutboxApplib.java
@@ -0,0 +1,56 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.extensions.executionoutbox.applib;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures;
+
+@Configuration
+@Import({
+})
+public class IsisModuleExtExecutionOutboxApplib
+implements ModuleWithFixtures {
+
+    public static final String NAMESPACE = "isis.ext.executionLog";
+    public static final String SCHEMA = "isisExtExecutionLog";
+
+    public abstract static class TitleUiEvent<S>
+        extends org.apache.isis.applib.events.ui.TitleUiEvent<S> { }
+
+    public abstract static class IconUiEvent<S>
+        extends org.apache.isis.applib.events.ui.IconUiEvent<S> { }
+
+    public abstract static class CssClassUiEvent<S>
+        extends org.apache.isis.applib.events.ui.CssClassUiEvent<S> { }
+
+    public abstract static class LayoutUiEvent<S>
+        extends org.apache.isis.applib.events.ui.LayoutUiEvent<S> { }
+
+    public abstract static class ActionDomainEvent<S>
+        extends org.apache.isis.applib.events.domain.ActionDomainEvent<S> { }
+
+    public abstract static class CollectionDomainEvent<S,T>
+        extends org.apache.isis.applib.events.domain.CollectionDomainEvent<S,T> { }
+    public abstract static class PropertyDomainEvent<S,T>
+        extends org.apache.isis.applib.events.domain.PropertyDomainEvent<S,T> { }
+
+
+}
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/applib/src/test/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/applib/src/test/java/.gitkeep
diff --git a/extensions/core/commandlog/jdo/pom.xml b/extensions/core/executionoutbox/dto/pom.xml
similarity index 73%
copy from extensions/core/commandlog/jdo/pom.xml
copy to extensions/core/executionoutbox/dto/pom.xml
index a850ba9987..ad9b84c8bb 100644
--- a/extensions/core/commandlog/jdo/pom.xml
+++ b/extensions/core/executionoutbox/dto/pom.xml
@@ -15,16 +15,17 @@
 
     <parent>
         <groupId>org.apache.isis.extensions</groupId>
-        <artifactId>isis-extensions-commandlog</artifactId>
+        <artifactId>isis-extensions-executionoutbox</artifactId>
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-extensions-commandlog-jdo</artifactId>
-    <name>Apache Isis Ext - Command Log Implementation (JDO)</name>
+    <artifactId>isis-extensions-executionoutbox-dto</artifactId>
+    <name>Apache Isis Ext - Execution Outbox DTO</name>
+    <description>Data transfer objects representing the payloads transferred between the REST client and REST API</description>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.jdo</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/jdo</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.executionoutbox.dto</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/executionoutbox/dto</git-plugin.propertiesDir>
     </properties>
 
     <build>
@@ -37,26 +38,17 @@
                 <filtering>false</filtering>
                 <directory>src/main/java</directory>
                 <includes>
-                    <!-- we include all .java too, so that we can reference it from the descriptions -->
                     <include>**</include>
                 </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </resource>
         </resources>
     </build>
 
     <dependencies>
 
-	    <dependency>
-	        <groupId>org.apache.isis.extensions</groupId>
-	        <artifactId>isis-extensions-commandlog-applib</artifactId>
-	    </dependency>
-
-        <!-- PERSISTENCE -->
-
-		<dependency>
-            <groupId>org.apache.isis.persistence</groupId>
-			<artifactId>isis-persistence-jdo-datanucleus</artifactId>
-        </dependency>
 
         <!-- TESTING -->
 
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/dto/src/main/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/dto/src/main/java/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/dto/src/test/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/dto/src/test/java/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/persistence-jdo/src/main/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/persistence-jdo/src/main/java/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/persistence-jdo/src/test/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/persistence-jdo/src/test/java/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/persistence-jpa/src/main/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/persistence-jpa/src/main/java/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/persistence-jpa/src/test/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/persistence-jpa/src/test/java/.gitkeep
diff --git a/extensions/core/commandreplay/pom.xml b/extensions/core/executionoutbox/pom.xml
similarity index 55%
copy from extensions/core/commandreplay/pom.xml
copy to extensions/core/executionoutbox/pom.xml
index 9d97273bae..efebf18d41 100644
--- a/extensions/core/commandreplay/pom.xml
+++ b/extensions/core/executionoutbox/pom.xml
@@ -21,41 +21,56 @@
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 
-	<artifactId>isis-extensions-commandreplay</artifactId>
-	<name>Apache Isis Ext - Command Replay</name>
-	<description>Replays commands to secondary system</description>
+	<artifactId>isis-extensions-executionoutbox</artifactId>
+	<name>Apache Isis Ext - Execution Outbox</name>
+	<description>Logs executions into an outbox, REST Client to consume</description>
 
 	<packaging>pom</packaging>
 
 	<dependencyManagement>
 		<dependencies>
 			<dependency>
-				<groupId>org.apache.isis.testing</groupId>
-				<artifactId>isis-testing</artifactId>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-applib</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
-				<scope>import</scope>
-				<type>pom</type>
 			</dependency>
-
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions</artifactId>
+				<artifactId>isis-extensions-executionoutbox-dto</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
-				<scope>import</scope>
-				<type>pom</type>
 			</dependency>
-
 			<dependency>
-		    	<groupId>org.apache.isis.viewer</groupId>
-            	<artifactId>isis-viewer-restfulobjects-client</artifactId>
-        		<version>2.0.0-SNAPSHOT</version>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-persistence-jdo</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-persistence-jpa</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-restapi</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-restclient</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 		</dependencies>
 	</dependencyManagement>
 
 	<modules>
-		<module>primary</module>
-		<module>secondary</module>
+		<module>applib</module>
+		<module>dto</module>
+<!--
+		<module>persistence-jdo</module>
+		<module>persistence-jpa</module>
+-->
+		<module>restapi</module>
+		<module>restclient</module>
 	</modules>
 
 </project>
diff --git a/extensions/core/commandlog/jdo/pom.xml b/extensions/core/executionoutbox/restapi/pom.xml
similarity index 73%
copy from extensions/core/commandlog/jdo/pom.xml
copy to extensions/core/executionoutbox/restapi/pom.xml
index a850ba9987..e76827f186 100644
--- a/extensions/core/commandlog/jdo/pom.xml
+++ b/extensions/core/executionoutbox/restapi/pom.xml
@@ -15,16 +15,16 @@
 
     <parent>
         <groupId>org.apache.isis.extensions</groupId>
-        <artifactId>isis-extensions-commandlog</artifactId>
+        <artifactId>isis-extensions-executionoutbox</artifactId>
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-extensions-commandlog-jdo</artifactId>
-    <name>Apache Isis Ext - Command Log Implementation (JDO)</name>
+    <artifactId>isis-extensions-executionoutbox-restapi</artifactId>
+    <name>Apache Isis Ext - Execution Outbox REST API</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.jdo</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/jdo</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.executionoutbox.restapi</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/executionoutbox/restapi</git-plugin.propertiesDir>
     </properties>
 
     <build>
@@ -37,26 +37,17 @@
                 <filtering>false</filtering>
                 <directory>src/main/java</directory>
                 <includes>
-                    <!-- we include all .java too, so that we can reference it from the descriptions -->
                     <include>**</include>
                 </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </resource>
         </resources>
     </build>
 
     <dependencies>
 
-	    <dependency>
-	        <groupId>org.apache.isis.extensions</groupId>
-	        <artifactId>isis-extensions-commandlog-applib</artifactId>
-	    </dependency>
-
-        <!-- PERSISTENCE -->
-
-		<dependency>
-            <groupId>org.apache.isis.persistence</groupId>
-			<artifactId>isis-persistence-jdo-datanucleus</artifactId>
-        </dependency>
 
         <!-- TESTING -->
 
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/restapi/src/main/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/restapi/src/main/java/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/restapi/src/test/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/restapi/src/test/java/.gitkeep
diff --git a/extensions/core/commandlog/jdo/pom.xml b/extensions/core/executionoutbox/restclient/pom.xml
similarity index 73%
rename from extensions/core/commandlog/jdo/pom.xml
rename to extensions/core/executionoutbox/restclient/pom.xml
index a850ba9987..e72eada846 100644
--- a/extensions/core/commandlog/jdo/pom.xml
+++ b/extensions/core/executionoutbox/restclient/pom.xml
@@ -15,16 +15,16 @@
 
     <parent>
         <groupId>org.apache.isis.extensions</groupId>
-        <artifactId>isis-extensions-commandlog</artifactId>
+        <artifactId>isis-extensions-executionoutbox</artifactId>
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-extensions-commandlog-jdo</artifactId>
-    <name>Apache Isis Ext - Command Log Implementation (JDO)</name>
+    <artifactId>isis-extensions-executionoutbox-restclient</artifactId>
+    <name>Apache Isis Ext - Execution Outbox REST Client</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.extensions.commandlog.jdo</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/extensions/commandlog/jdo</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.executionoutbox.restclient</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/executionoutbox/restclient</git-plugin.propertiesDir>
     </properties>
 
     <build>
@@ -37,26 +37,17 @@
                 <filtering>false</filtering>
                 <directory>src/main/java</directory>
                 <includes>
-                    <!-- we include all .java too, so that we can reference it from the descriptions -->
                     <include>**</include>
                 </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </resource>
         </resources>
     </build>
 
     <dependencies>
 
-	    <dependency>
-	        <groupId>org.apache.isis.extensions</groupId>
-	        <artifactId>isis-extensions-commandlog-applib</artifactId>
-	    </dependency>
-
-        <!-- PERSISTENCE -->
-
-		<dependency>
-            <groupId>org.apache.isis.persistence</groupId>
-			<artifactId>isis-persistence-jdo-datanucleus</artifactId>
-        </dependency>
 
         <!-- TESTING -->
 
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/restclient/src/main/java/.gitkeep
similarity index 100%
copy from extensions/core/outbox-publisher/.gitkeep
copy to extensions/core/executionoutbox/restclient/src/main/java/.gitkeep
diff --git a/extensions/core/outbox-publisher/.gitkeep b/extensions/core/executionoutbox/restclient/src/test/java/.gitkeep
similarity index 100%
rename from extensions/core/outbox-publisher/.gitkeep
rename to extensions/core/executionoutbox/restclient/src/test/java/.gitkeep
diff --git a/extensions/core/flyway/pom.xml b/extensions/core/flyway/pom.xml
index d16f4b6156..7c42e9fe84 100644
--- a/extensions/core/flyway/pom.xml
+++ b/extensions/core/flyway/pom.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	you under the Apache License, Version 2.0 (the "License"); you may not use 
-	this file except in compliance with the License. You may obtain a copy of 
-	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
-	by applicable law or agreed to in writing, software distributed under the 
-	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
-	OF ANY KIND, either express or implied. See the License for the specific 
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
+	license agreements. See the NOTICE file distributed with this work for additional
+	information regarding copyright ownership. The ASF licenses this file to
+	you under the Apache License, Version 2.0 (the "License"); you may not use
+	this file except in compliance with the License. You may obtain a copy of
+	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
+	by applicable law or agreed to in writing, software distributed under the
+	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+	OF ANY KIND, either express or implied. See the License for the specific
 	language governing permissions and limitations under the License. -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -29,6 +29,13 @@
 
 	<dependencyManagement>
 		<dependencies>
+
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-flyway-impl</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+
 			<dependency>
 				<groupId>org.flywaydb</groupId>
 				<artifactId>flyway-core</artifactId>
diff --git a/extensions/pom.xml b/extensions/pom.xml
index f5773e1ea4..613665b665 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -67,100 +67,159 @@
 
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-excel-applib</artifactId>
+				<artifactId>isis-extensions-commandlog</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-excel-testing</artifactId>
+				<artifactId>isis-extensions-commandlog-applib</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-excel-fixtures</artifactId>
+				<artifactId>isis-extensions-commandlog-persistence-jdo</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-excel-integtests</artifactId>
+				<artifactId>isis-extensions-commandlog-persistence-jpa</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 
-
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-commandlog-applib</artifactId>
+				<artifactId>isis-extensions-commandreplay</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
 			</dependency>
-
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-commandlog-jdo</artifactId>
+				<artifactId>isis-extensions-commandreplay-primary</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
-
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-commandlog-jpa</artifactId>
+				<artifactId>isis-extensions-commandreplay-secondary</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-quartz-impl</artifactId>
+				<artifactId>isis-extensions-exceldownload</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
 			</dependency>
-
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-commandreplay-primary</artifactId>
+				<artifactId>isis-extensions-exceldownload-wicket-ui</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-commandreplay-secondary</artifactId>
+				<artifactId>isis-extensions-executionlog</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionlog-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionlog-persistence-jdo</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
-
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-exceldownload-ui</artifactId>
+				<artifactId>isis-extensions-executionlog-persistence-jpa</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-flyway-impl</artifactId>
+				<artifactId>isis-extensions-executionoutbox</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-dto</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-persistence-jdo</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-persistence-jpa</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-restapi</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-executionoutbox-restclient</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-pdfjs-applib</artifactId>
+				<artifactId>isis-extensions-excel</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-pdfjs-fixtures</artifactId>
+				<artifactId>isis-extensions-excel-applib</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-pdfjs-metamodel</artifactId>
+				<artifactId>isis-extensions-excel-testing</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-pdfjs-wicket-integration</artifactId>
+				<artifactId>isis-extensions-excel-fixtures</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-pdfjs-wicket-ui</artifactId>
+				<artifactId>isis-extensions-excel-integtests</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-flyway</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-flyway-impl</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-fullcalendar</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
 				<artifactId>isis-extensions-fullcalendar-applib</artifactId>
@@ -170,6 +229,7 @@
 				<groupId>org.apache.isis.extensions</groupId>
 				<artifactId>isis-extensions-fullcalendar-wicket</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
@@ -182,14 +242,72 @@
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-pdfjs</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-pdfjs-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-pdfjs-fixtures</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-pdfjs-metamodel</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-pdfjs-wicket</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-pdfjs-wicket-integration</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-pdfjs-wicket-ui</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-quartz</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-quartz-impl</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
 				<artifactId>isis-extensions-secman</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-secman-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
 				<artifactId>isis-extensions-secman-applib</artifactId>
+				<scope>test</scope>
+				<type>test-jar</type>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 			<dependency>
@@ -222,6 +340,13 @@
 				<artifactId>isis-extensions-secman-shiro-realm</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
+
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-shiro-realm-ldap</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
 				<artifactId>isis-extensions-shiro-realm-ldap-impl</artifactId>
@@ -230,10 +355,39 @@
 
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
-				<artifactId>isis-extensions-sessionlog-impl</artifactId>
+				<artifactId>isis-extensions-sessionlog</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-sessionlog-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-sessionlog-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<scope>test</scope>
+				<type>test-jar</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-sessionlog-persistence-jpa</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-sessionlog-persistence-jdo</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
 
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-cors</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
 				<artifactId>isis-extensions-cors-impl</artifactId>
@@ -241,7 +395,12 @@
 			</dependency>
 
 
-			<!-- testing -->
+			<dependency>
+				<groupId>org.apache.isis.testing</groupId>
+				<artifactId>isis-testing-fixtures</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+				<type>pom</type>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.testing</groupId>
 				<artifactId>isis-testing-fixtures-applib</artifactId>
@@ -265,6 +424,8 @@
 
 		<module>core/commandlog</module>
 		<module>core/commandreplay</module>
+		<module>core/executionlog</module>
+		<module>core/executionoutbox</module>
 		<module>core/flyway</module>
 		<module>core/quartz</module>
 
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/permission/dom/ApplicationPermission.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/permission/dom/ApplicationPermission.java
index af1cef47c7..75f7b31da5 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/permission/dom/ApplicationPermission.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/permission/dom/ApplicationPermission.java
@@ -32,11 +32,13 @@ import javax.jdo.annotations.Unique;
 import javax.jdo.annotations.Uniques;
 import javax.jdo.annotations.Version;
 import javax.jdo.annotations.VersionStrategy;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.Nq;
@@ -102,6 +104,7 @@ import lombok.Setter;
 @Version(
         strategy = VersionStrategy.VERSION_NUMBER,
         column = "version")
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 @Named(ApplicationPermission.LOGICAL_TYPE_NAME)
 @DomainObject()
 @DomainObjectLayout(
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/role/dom/ApplicationRole.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/role/dom/ApplicationRole.java
index c5caf5e10e..9d9ba6fc41 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/role/dom/ApplicationRole.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/role/dom/ApplicationRole.java
@@ -34,11 +34,13 @@ import javax.jdo.annotations.Queries;
 import javax.jdo.annotations.Query;
 import javax.jdo.annotations.Unique;
 import javax.jdo.annotations.Uniques;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.Nq;
 import org.apache.isis.extensions.secman.jdo.user.dom.ApplicationUser;
@@ -72,6 +74,7 @@ import lombok.Setter;
         strategy = InheritanceStrategy.NEW_TABLE)
 @DatastoreIdentity(
         strategy = IdGeneratorStrategy.NATIVE, column = "id")
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 @Named(ApplicationRole.LOGICAL_TYPE_NAME)
 @DomainObject(
         bounding = Bounding.BOUNDED,
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/tenancy/dom/ApplicationTenancy.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/tenancy/dom/ApplicationTenancy.java
index 3adceaf899..3b66f60b01 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/tenancy/dom/ApplicationTenancy.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/tenancy/dom/ApplicationTenancy.java
@@ -37,10 +37,12 @@ import javax.jdo.annotations.Unique;
 import javax.jdo.annotations.Uniques;
 import javax.jdo.annotations.Version;
 import javax.jdo.annotations.VersionStrategy;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.Nq;
 import org.apache.isis.extensions.secman.applib.tenancy.dom.HasAtPath;
@@ -73,7 +75,9 @@ import lombok.Setter;
             name = Nq.FIND_BY_NAME_OR_PATH_MATCHING,
             value = "SELECT "
                     + "FROM " + ApplicationTenancy.FQCN
-                    + " WHERE name.matches(:regex) || path.matches(:regex) ")})
+                    + " WHERE name.matches(:regex) "
+                    + "    || path.matches(:regex) ")
+})
 @Inheritance(
         strategy = InheritanceStrategy.NEW_TABLE)
 @DatastoreIdentity(
@@ -81,6 +85,7 @@ import lombok.Setter;
 @Version(
         strategy = VersionStrategy.VERSION_NUMBER,
         column = "version")
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 @Named(ApplicationTenancy.LOGICAL_TYPE_NAME)
 @DomainObject(
         autoCompleteRepository = ApplicationTenancyRepository.class,
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java
index 115446d01e..b28574c284 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java
@@ -38,10 +38,12 @@ import javax.jdo.annotations.Unique;
 import javax.jdo.annotations.Uniques;
 import javax.jdo.annotations.Version;
 import javax.jdo.annotations.VersionStrategy;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserStatus;
@@ -92,14 +94,15 @@ import lombok.Setter;
 @Version(
         strategy = VersionStrategy.VERSION_NUMBER,
         column = "version")
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 @Named(ApplicationUser.LOGICAL_TYPE_NAME)
 @DomainObject(
         autoCompleteRepository = ApplicationUserRepository.class,
         autoCompleteMethod = "findMatching"
-)
+        )
 @DomainObjectLayout(
         bookmarking = BookmarkPolicy.AS_ROOT
-)
+        )
 public class ApplicationUser
     extends org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser {
 
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermission.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermission.java
index f4a662c6d8..a50a32e360 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermission.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermission.java
@@ -33,11 +33,13 @@ import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 import javax.persistence.Version;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermissionMode;
@@ -100,6 +102,7 @@ import lombok.Setter;
                   + "   AND p.rule = :rule "
                   + "   AND p.featureSort = :featureSort "),
 })
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 @EntityListeners(IsisEntityListener.class)
 @Named(ApplicationPermission.LOGICAL_TYPE_NAME)
 @DomainObject
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/role/dom/ApplicationRole.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/role/dom/ApplicationRole.java
index 669b204a80..8dabe9b792 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/role/dom/ApplicationRole.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/role/dom/ApplicationRole.java
@@ -34,11 +34,13 @@ import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 import javax.persistence.Version;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.Nq;
 import org.apache.isis.extensions.secman.jpa.user.dom.ApplicationUser;
@@ -54,7 +56,7 @@ import lombok.Setter;
         uniqueConstraints =
             @UniqueConstraint(
                     name = "ApplicationRole_name_UNQ",
-                    columnNames={"name"})
+                    columnNames= { "name" })
 )
 @NamedQueries({
     @NamedQuery(
@@ -68,6 +70,7 @@ import lombok.Setter;
                   + "FROM ApplicationRole r "
                   + "WHERE r.name LIKE :regex"),
 })
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 @EntityListeners(IsisEntityListener.class)
 @Named(ApplicationRole.LOGICAL_TYPE_NAME)
 @DomainObject(
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/tenancy/dom/ApplicationTenancy.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/tenancy/dom/ApplicationTenancy.java
index 788b7bcf17..9fadeca0e2 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/tenancy/dom/ApplicationTenancy.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/tenancy/dom/ApplicationTenancy.java
@@ -25,6 +25,7 @@ import java.util.TreeSet;
 import javax.inject.Named;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
@@ -34,12 +35,15 @@ import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 import javax.persistence.Version;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.Nq;
+import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -72,6 +76,8 @@ import lombok.Setter;
                   + " WHERE t.name LIKE :regex "
                   + "    OR t.path LIKE :regex"),
 })
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
+@EntityListeners(IsisEntityListener.class)
 @Named(ApplicationTenancy.LOGICAL_TYPE_NAME)
 @DomainObject(
         autoCompleteRepository = ApplicationTenancyRepository.class,
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java
index 577daca6bf..0ed15047fe 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java
@@ -38,10 +38,12 @@ import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 import javax.persistence.Version;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.jaxb.PersistentEntityAdapter;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserStatus;
@@ -86,11 +88,13 @@ import lombok.Setter;
                   + "    OR u.knownAs LIKE :regex"
                   + "    OR u.emailAddress LIKE :regex")
 })
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 @EntityListeners(IsisEntityListener.class)
 @Named(ApplicationUser.LOGICAL_TYPE_NAME)
 @DomainObject(
         autoCompleteRepository = ApplicationUserRepository.class,
-        autoCompleteMethod = "findMatching")
+        autoCompleteMethod = "findMatching"
+        )
 @DomainObjectLayout(
         bookmarking = BookmarkPolicy.AS_ROOT
         )
diff --git a/extensions/security/secman/pom.xml b/extensions/security/secman/pom.xml
index 4e9737dce3..02e391ef69 100644
--- a/extensions/security/secman/pom.xml
+++ b/extensions/security/secman/pom.xml
@@ -52,11 +52,21 @@
                 <type>test-jar</type>
                 <version>2.0.0-SNAPSHOT</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-secman-integration</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.isis.extensions</groupId>
                 <artifactId>isis-extensions-secman-encryption-jbcrypt</artifactId>
                 <version>2.0.0-SNAPSHOT</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-secman-encryption-spring</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.isis.extensions</groupId>
                 <artifactId>isis-extensions-secman-persistence-jdo</artifactId>
diff --git a/extensions/security/sessionlog/pom.xml b/extensions/security/sessionlog/pom.xml
index a3bcbea4e0..48ab088f32 100644
--- a/extensions/security/sessionlog/pom.xml
+++ b/extensions/security/sessionlog/pom.xml
@@ -39,6 +39,7 @@
 
     <dependencyManagement>
         <dependencies>
+
             <dependency>
                 <groupId>org.apache.isis.extensions</groupId>
                 <artifactId>isis-extensions-sessionlog-applib</artifactId>
@@ -51,13 +52,11 @@
                 <scope>test</scope>
                 <type>test-jar</type>
             </dependency>
-
             <dependency>
                 <groupId>org.apache.isis.extensions</groupId>
                 <artifactId>isis-extensions-sessionlog-persistence-jpa</artifactId>
                 <version>2.0.0-SNAPSHOT</version>
             </dependency>
-
             <dependency>
                 <groupId>org.apache.isis.extensions</groupId>
                 <artifactId>isis-extensions-sessionlog-persistence-jdo</artifactId>
diff --git a/extensions/vro/cors/pom.xml b/extensions/vro/cors/pom.xml
index 09de723704..96c83fd10c 100644
--- a/extensions/vro/cors/pom.xml
+++ b/extensions/vro/cors/pom.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	you under the Apache License, Version 2.0 (the "License"); you may not use 
-	this file except in compliance with the License. You may obtain a copy of 
-	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
-	by applicable law or agreed to in writing, software distributed under the 
-	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
-	OF ANY KIND, either express or implied. See the License for the specific 
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
+	license agreements. See the NOTICE file distributed with this work for additional
+	information regarding copyright ownership. The ASF licenses this file to
+	you under the Apache License, Version 2.0 (the "License"); you may not use
+	this file except in compliance with the License. You may obtain a copy of
+	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
+	by applicable law or agreed to in writing, software distributed under the
+	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+	OF ANY KIND, either express or implied. See the License for the specific
 	language governing permissions and limitations under the License. -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -29,6 +29,16 @@
 
 	<packaging>pom</packaging>
 
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-cors-impl</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
 	<modules>
 		<module>impl</module>
 	</modules>
diff --git a/extensions/vw/exceldownload/pom.xml b/extensions/vw/exceldownload/pom.xml
index ffb02f1542..b17767bc3e 100644
--- a/extensions/vw/exceldownload/pom.xml
+++ b/extensions/vw/exceldownload/pom.xml
@@ -34,8 +34,18 @@
     </description>
     <packaging>pom</packaging>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-exceldownload-wicket-ui</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <modules>
-        <module>ui</module>
+        <module>wicket-ui</module>
     </modules>
 
 
diff --git a/extensions/vw/exceldownload/ui/pom.xml b/extensions/vw/exceldownload/wicket-ui/pom.xml
similarity index 95%
rename from extensions/vw/exceldownload/ui/pom.xml
rename to extensions/vw/exceldownload/wicket-ui/pom.xml
index 3c9ffbb8a6..7f9b3106a8 100644
--- a/extensions/vw/exceldownload/ui/pom.xml
+++ b/extensions/vw/exceldownload/wicket-ui/pom.xml
@@ -26,12 +26,12 @@
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-extensions-exceldownload-ui</artifactId>
+    <artifactId>isis-extensions-exceldownload-wicket-ui</artifactId>
     <name>Apache Isis Ext - Wicket Viewer - Excel Download (ui)</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.extensions.exceldownload.ui</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/extensions/exceldownload/ui</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.exceldownload.wicket.ui</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/exceldownload/wicket-ui</git-plugin.propertiesDir>
     </properties>
 
 	<build>
diff --git a/extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/IsisModuleExtExcelDownloadUi.java b/extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/IsisModuleExtExcelDownloadUi.java
similarity index 100%
rename from extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/IsisModuleExtExcelDownloadUi.java
rename to extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/IsisModuleExtExcelDownloadUi.java
diff --git a/extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/CollectionContentsAsExcelFactory.java b/extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/CollectionContentsAsExcelFactory.java
similarity index 100%
rename from extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/CollectionContentsAsExcelFactory.java
rename to extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/CollectionContentsAsExcelFactory.java
diff --git a/extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileDownloadLink.java b/extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileDownloadLink.java
similarity index 100%
rename from extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileDownloadLink.java
rename to extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileDownloadLink.java
diff --git a/extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileModel.java b/extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileModel.java
similarity index 100%
rename from extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileModel.java
rename to extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileModel.java
diff --git a/extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/_TimeConversion.java b/extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/_TimeConversion.java
similarity index 100%
rename from extensions/vw/exceldownload/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/_TimeConversion.java
rename to extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/isis/extensions/viewer/wicket/exceldownload/ui/components/_TimeConversion.java
diff --git a/extensions/vw/fullcalendar/pom.xml b/extensions/vw/fullcalendar/pom.xml
index b799cba6fa..f2f012af65 100644
--- a/extensions/vw/fullcalendar/pom.xml
+++ b/extensions/vw/fullcalendar/pom.xml
@@ -35,6 +35,32 @@
         A component for Apache Isis' Wicket viewer, displaying collections of objects that have a date on a fullcalendar.io (JavaScript widget).
     </description>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-fullcalendar-applib</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-fullcalendar-wicket</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+                <type>pom</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-fullcalendar-wicket-integration</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-fullcalendar-wicket-ui</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <modules>
         <module>applib</module>
         <module>wicket</module>
diff --git a/extensions/vw/pdfjs/pom.xml b/extensions/vw/pdfjs/pom.xml
index 9883a5844f..608a95fd00 100644
--- a/extensions/vw/pdfjs/pom.xml
+++ b/extensions/vw/pdfjs/pom.xml
@@ -35,6 +35,41 @@
         A component for Apache Isis' Wicket viewer, allowing BLOBs containing PDFs to be rendered in a panel using pdf.js.
     </description>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-pdfjs-applib</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-pdfjs-fixtures</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-pdfjs-metamodel</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-pdfjs-wicket</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+                <type>pom</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-pdfjs-wicket-integration</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.isis.extensions</groupId>
+                <artifactId>isis-extensions-pdfjs-wicket-ui</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
     <modules>
         <module>applib</module>
         <module>metamodel</module>
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/RESTFUL_DOMAIN_TYPES.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/RESTFUL_DOMAIN_TYPES.kt
index 25781d826e..6628c43db7 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/RESTFUL_DOMAIN_TYPES.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/RESTFUL_DOMAIN_TYPES.kt
@@ -101,7 +101,7 @@ object RESTFUL_DOMAIN_TYPES : Response() {
         },
         {
             "rel": "urn:org.restfulobjects:rels/domain-type",
-            "href": "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_datanucleusVersionTimestamp",
+            "href": "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus.jdosupport.mixins.Persistable_datanucleusVersionTimestamp",
             "method": "GET",
             "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
         },
@@ -527,7 +527,7 @@ object RESTFUL_DOMAIN_TYPES : Response() {
         },
         {
             "rel": "urn:org.restfulobjects:rels/domain-type",
-            "href": "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_datanucleusIdLong",
+            "href": "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus.jdosupport.mixins.Persistable_datanucleusIdLong",
             "method": "GET",
             "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
         },
@@ -593,7 +593,7 @@ object RESTFUL_DOMAIN_TYPES : Response() {
         },
         {
             "rel": "urn:org.restfulobjects:rels/domain-type",
-            "href": "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_datanucleusVersionLong",
+            "href": "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus.jdosupport.mixins.Persistable_datanucleusVersionLong",
             "method": "GET",
             "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
         },
@@ -881,7 +881,7 @@ object RESTFUL_DOMAIN_TYPES : Response() {
         },
         {
             "rel": "urn:org.restfulobjects:rels/domain-type",
-            "href": "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_downloadJdoMetadata",
+            "href": "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus.jdosupport.mixins.Persistable_downloadJdoMetadata",
             "method": "GET",
             "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
         },
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/simpleapp1_16_0/RESTFUL_DOMAIN_TYPES.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/simpleapp1_16_0/RESTFUL_DOMAIN_TYPES.kt
index 0bf1216e5d..217dc39036 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/simpleapp1_16_0/RESTFUL_DOMAIN_TYPES.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/simpleapp1_16_0/RESTFUL_DOMAIN_TYPES.kt
@@ -1032,7 +1032,7 @@ object RESTFUL_DOMAIN_TYPES : Response() {
     "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
   }, {
     "rel" : "urn:org.restfulobjects:rels/domain-type",
-    "href" : "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceForJdo",
+    "href" : "http://localhost:8080/restful/domain-types/org.apache.isis.persistence.jdo.datanucleus.metrics.MetricsServiceForJdo",
     "method" : "GET",
     "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
   }, {
diff --git a/persistence/jdo/datanucleus/src/main/resources/META-INF/MANIFEST.MF b/persistence/jdo/datanucleus/src/main/resources/META-INF/MANIFEST.MF
index b5d4a7608c..eb4db64715 100644
--- a/persistence/jdo/datanucleus/src/main/resources/META-INF/MANIFEST.MF
+++ b/persistence/jdo/datanucleus/src/main/resources/META-INF/MANIFEST.MF
@@ -1,6 +1,6 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: Apache Isis JDO Persistence DataNucleus 5 Implementation
-Bundle-SymbolicName: org.apache.isis.persistence.jdo.datanucleus5
+Bundle-Name: Apache Isis JDO Persistence DataNucleus Implementation
+Bundle-SymbolicName: org.apache.isis.persistence.jdo.datanucleus
 Bundle-Version: 2.0.0
 Bundle-Vendor: Apache Isis
diff --git a/persistence/jdo/datanucleus/src/main/resources/plugin.xml b/persistence/jdo/datanucleus/src/main/resources/plugin.xml
index 01183264fa..5492224bb5 100644
--- a/persistence/jdo/datanucleus/src/main/resources/plugin.xml
+++ b/persistence/jdo/datanucleus/src/main/resources/plugin.xml
@@ -1,25 +1,25 @@
 <?xml version="1.0"?>
 <!--
-    Licensed to the Apache Software Foundation (ASF) under one 
-    or more contributor license agreements. See the NOTICE file 
-    distributed with this work for additional information 
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements. See the NOTICE file
+    distributed with this work for additional information
     regarding copyright ownership. The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the 
-    "License"); you may not use this file except in compliance 
-    with the License. You may obtain a copy of the License at 
-    
-        http://www.apache.org/licenses/LICENSE-2.0 
-        
-    Unless required by applicable law or agreed to in writing, 
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License. You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
-    KIND, either express or implied. See the License for the 
-    specific language governing permissions and limitations 
-    under the License. 
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied. See the License for the
+    specific language governing permissions and limitations
+    under the License.
 -->
 <plugin
-   id="org.apache.isis.persistence.jdo.datanucleus5"
-   name="Apache Isis Persistence JDO DataNucleus 5 Implementation"
+   id="org.apache.isis.persistence.jdo.datanucleus"
+   name="Apache Isis Persistence JDO DataNucleus Implementation"
    provider-name="Apache Isis">
 
     <!--
@@ -32,7 +32,7 @@
         <mapping
             java-type="org.apache.isis.applib.value.Clob"
             mapping-class="org.apache.isis.persistence.jdo.datanucleus.valuetypes.applib.IsisClobMapping"/>
-        
+
     </extension>
 
 
@@ -59,7 +59,7 @@
     <!--
     http://www.datanucleus.org/extensions/java_types.html
     -->
-    
+
     <extension point="org.datanucleus.java_type">
         <java-type
                 name="java.time.ZonedDateTime"
@@ -73,14 +73,14 @@
                 dfg="true" priority="10"
                 converter-name="iso.offsettime-string" />
     </extension>
-    
+
     <extension point="org.datanucleus.java_type">
         <java-type
                 name="java.awt.image.BufferedImage"
                 dfg="true" priority="10"
                 converter-name="isis.bufferedimage-bytearray" />
     </extension>
-    
+
     <extension point="org.datanucleus.java_type">
         <java-type
                 name="org.apache.isis.applib.value.Password"
@@ -140,7 +140,7 @@
     <!--
     http://www.datanucleus.org/extensions/type_converter.html
     -->
-    
+
     <extension point="org.datanucleus.type_converter">
         <type-converter
                 name="iso.zoneddatetime-string"
@@ -148,7 +148,7 @@
                 datastore-type="java.lang.String"
                 converter-class="org.apache.isis.persistence.jdo.datanucleus.typeconverters.time.IsoZonedDateTimeConverter"/>
     </extension>
-    
+
     <extension point="org.datanucleus.type_converter">
         <type-converter
                 name="iso.offsettime-string"
@@ -156,7 +156,7 @@
                 datastore-type="java.lang.String"
                 converter-class="org.apache.isis.persistence.jdo.datanucleus.typeconverters.time.IsoOffsetTimeConverter"/>
     </extension>
-    
+
     <extension point="org.datanucleus.type_converter">
         <type-converter
                 name="isis.bufferedimage-bytearray"
@@ -164,7 +164,7 @@
                 datastore-type="[B"
                 converter-class="org.apache.isis.persistence.jdo.datanucleus.typeconverters.image.JavaAwtBufferedImageByteArrayConverter"/>
     </extension>
-    
+
     <extension point="org.datanucleus.type_converter">
         <type-converter
                 name="isis.password-string"
diff --git a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/IsisModulePersistenceJpaIntegration.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/IsisModulePersistenceJpaIntegration.java
index bde750acb4..2aa325d788 100644
--- a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/IsisModulePersistenceJpaIntegration.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/IsisModulePersistenceJpaIntegration.java
@@ -26,7 +26,7 @@ import org.apache.isis.core.runtime.IsisModuleCoreRuntime;
 import org.apache.isis.persistence.jpa.integration.changetracking.PersistenceMetricsServiceJpa;
 import org.apache.isis.persistence.jpa.integration.entity.JpaEntityIntegration;
 import org.apache.isis.persistence.jpa.integration.services.JpaSupportServiceUsingSpring;
-import org.apache.isis.persistence.jpa.integration.typeconverters.JavaAwtBufferedImageByteArrayConverter;
+import org.apache.isis.persistence.jpa.integration.typeconverters.image.JavaAwtBufferedImageByteArrayConverter;
 import org.apache.isis.persistence.jpa.metamodel.IsisModulePersistenceJpaMetamodel;
 
 @Configuration
diff --git a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisBookmarkConverter.java
similarity index 62%
copy from valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisBookmarkConverter.java
index ae57e8bec7..b18659509d 100644
--- a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisBookmarkConverter.java
@@ -16,31 +16,32 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.applib;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
 
-import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
+import org.apache.isis.applib.services.bookmark.Bookmark;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisAsciiDocConverter implements TypeConverter<AsciiDoc, String>{
+@Converter(autoApply = true)
+public class IsisBookmarkConverter implements AttributeConverter<Bookmark, String> {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final AsciiDoc memberValue) {
-        return memberValue != null
-                ? memberValue.getAdoc()
-                : null;
+    public String convertToDatabaseColumn(Bookmark bookmark) {
+        return bookmark != null
+                ? bookmark.toString()
+                        : null;
     }
 
     @Override
-    public AsciiDoc toMemberType(final String datastoreValue) {
+    public Bookmark convertToEntityAttribute(String datastoreValue) {
         return datastoreValue != null
-                ? AsciiDoc.valueOf(datastoreValue)
+                ? Bookmark.parse(datastoreValue).orElse(null)
                 : null;
     }
-
 }
diff --git a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisLocalResourcePathConverter.java
similarity index 64%
copy from valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisLocalResourcePathConverter.java
index 7798477c3a..6df09615b0 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisLocalResourcePathConverter.java
@@ -16,30 +16,33 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.markdown.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.applib;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
 
-import org.apache.isis.valuetypes.markdown.applib.value.Markdown;
+import org.apache.isis.applib.value.LocalResourcePath;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisMarkdownConverter implements TypeConverter<Markdown, String>{
+@Converter(autoApply = true)
+public class IsisLocalResourcePathConverter
+        implements AttributeConverter<LocalResourcePath, String> {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final Markdown memberValue) {
+    public String convertToDatabaseColumn(LocalResourcePath memberValue) {
         return memberValue != null
-                ? memberValue.getMarkdown()
+                ? memberValue.getValue()
                 : null;
     }
 
     @Override
-    public Markdown toMemberType(final String datastoreValue) {
+    public LocalResourcePath convertToEntityAttribute(String datastoreValue) {
         return datastoreValue != null
-                ? Markdown.valueOf(datastoreValue)
+                ? new LocalResourcePath(datastoreValue)
                 : null;
     }
 
diff --git a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisMarkupConverter.java
similarity index 64%
copy from valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisMarkupConverter.java
index 7798477c3a..61b998b68e 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisMarkupConverter.java
@@ -16,30 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.markdown.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.applib;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
 
-import org.apache.isis.valuetypes.markdown.applib.value.Markdown;
+
+import org.apache.isis.applib.value.LocalResourcePath;
+import org.apache.isis.applib.value.Markup;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisMarkdownConverter implements TypeConverter<Markdown, String>{
+@Converter(autoApply = true)
+public class IsisMarkupConverter implements AttributeConverter<Markup, String> {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final Markdown memberValue) {
+    public String convertToDatabaseColumn(final Markup memberValue) {
         return memberValue != null
-                ? memberValue.getMarkdown()
+                ? memberValue.asHtml()
                 : null;
     }
 
     @Override
-    public Markdown toMemberType(final String datastoreValue) {
+    public Markup convertToEntityAttribute(final String datastoreValue) {
         return datastoreValue != null
-                ? Markdown.valueOf(datastoreValue)
+                ? new Markup(datastoreValue)
                 : null;
     }
 
diff --git a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisPasswordConverter.java
similarity index 66%
copy from valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisPasswordConverter.java
index ae57e8bec7..984242ed82 100644
--- a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/applib/IsisPasswordConverter.java
@@ -16,30 +16,32 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.applib;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
 
-import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
+import org.apache.isis.applib.value.Password;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisAsciiDocConverter implements TypeConverter<AsciiDoc, String>{
+@Converter(autoApply = true)
+public class IsisPasswordConverter implements AttributeConverter<Password, String> {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final AsciiDoc memberValue) {
+    public String convertToDatabaseColumn(final Password memberValue) {
         return memberValue != null
-                ? memberValue.getAdoc()
+                ? memberValue.getPassword()
                 : null;
     }
 
     @Override
-    public AsciiDoc toMemberType(final String datastoreValue) {
+    public Password convertToEntityAttribute(final String datastoreValue) {
         return datastoreValue != null
-                ? AsciiDoc.valueOf(datastoreValue)
+                ? new Password(datastoreValue)
                 : null;
     }
 
diff --git a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/JavaAwtBufferedImageByteArrayConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/image/JavaAwtBufferedImageByteArrayConverter.java
similarity index 99%
rename from persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/JavaAwtBufferedImageByteArrayConverter.java
rename to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/image/JavaAwtBufferedImageByteArrayConverter.java
index 9245281eea..5a466c9f77 100644
--- a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/JavaAwtBufferedImageByteArrayConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/image/JavaAwtBufferedImageByteArrayConverter.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jpa.integration.typeconverters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.image;
 
 import java.awt.image.BufferedImage;
 
diff --git a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisChangesDtoConverter.java
similarity index 59%
copy from valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisChangesDtoConverter.java
index ae57e8bec7..58804169e8 100644
--- a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisChangesDtoConverter.java
@@ -16,31 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.schema.v2;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
 
-import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
+import org.apache.isis.applib.util.schema.ChangesDtoUtils;
+import org.apache.isis.schema.chg.v2.ChangesDto;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisAsciiDocConverter implements TypeConverter<AsciiDoc, String>{
+@Converter(autoApply = true)
+public class IsisChangesDtoConverter implements AttributeConverter<ChangesDto, String> {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final AsciiDoc memberValue) {
+    public String convertToDatabaseColumn(final ChangesDto memberValue) {
         return memberValue != null
-                ? memberValue.getAdoc()
-                : null;
+                ? ChangesDtoUtils.toXml(memberValue)
+                        : null;
     }
 
     @Override
-    public AsciiDoc toMemberType(final String datastoreValue) {
+    public ChangesDto convertToEntityAttribute(final String datastoreValue) {
         return datastoreValue != null
-                ? AsciiDoc.valueOf(datastoreValue)
-                : null;
+                ? ChangesDtoUtils.fromXml(datastoreValue)
+                        : null;
     }
 
 }
diff --git a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisCommandDtoConverter.java
similarity index 59%
copy from valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisCommandDtoConverter.java
index ae57e8bec7..34b44caf77 100644
--- a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisCommandDtoConverter.java
@@ -16,31 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.schema.v2;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
 
-import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
+import org.apache.isis.applib.util.schema.CommandDtoUtils;
+import org.apache.isis.schema.cmd.v2.CommandDto;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisAsciiDocConverter implements TypeConverter<AsciiDoc, String>{
+@Converter(autoApply = true)
+public class IsisCommandDtoConverter implements AttributeConverter<CommandDto, String> {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final AsciiDoc memberValue) {
+    public String convertToDatabaseColumn(final CommandDto memberValue) {
         return memberValue != null
-                ? memberValue.getAdoc()
-                : null;
+                ? CommandDtoUtils.toXml(memberValue)
+                        : null;
     }
 
     @Override
-    public AsciiDoc toMemberType(final String datastoreValue) {
+    public CommandDto convertToEntityAttribute(final String datastoreValue) {
         return datastoreValue != null
-                ? AsciiDoc.valueOf(datastoreValue)
-                : null;
+                ? CommandDtoUtils.fromXml(datastoreValue)
+                        : null;
     }
 
 }
diff --git a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisInteractionDtoConverter.java
similarity index 58%
copy from valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisInteractionDtoConverter.java
index 7798477c3a..bbb2c77e29 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisInteractionDtoConverter.java
@@ -16,31 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.markdown.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.schema.v2;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
 
-import org.apache.isis.valuetypes.markdown.applib.value.Markdown;
+import org.apache.isis.applib.util.schema.InteractionDtoUtils;
+import org.apache.isis.schema.ixn.v2.InteractionDto;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisMarkdownConverter implements TypeConverter<Markdown, String>{
+@Converter(autoApply = true)
+public class IsisInteractionDtoConverter implements AttributeConverter<InteractionDto, String> {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final Markdown memberValue) {
+    public String convertToDatabaseColumn(final InteractionDto memberValue) {
         return memberValue != null
-                ? memberValue.getMarkdown()
-                : null;
+                ? InteractionDtoUtils.toXml(memberValue)
+                        : null;
     }
 
     @Override
-    public Markdown toMemberType(final String datastoreValue) {
+    public InteractionDto convertToEntityAttribute(final String datastoreValue) {
         return datastoreValue != null
-                ? Markdown.valueOf(datastoreValue)
-                : null;
+                ? InteractionDtoUtils.fromXml(datastoreValue)
+                        : null;
     }
 
 }
diff --git a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisOidDtoConverter.java
similarity index 60%
copy from valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisOidDtoConverter.java
index 7798477c3a..802998812f 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/schema/v2/IsisOidDtoConverter.java
@@ -16,30 +16,35 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.markdown.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.schema.v2;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
 
-import org.apache.isis.valuetypes.markdown.applib.value.Markdown;
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.schema.common.v2.OidDto;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisMarkdownConverter implements TypeConverter<Markdown, String>{
+@Converter(autoApply = true)
+public class IsisOidDtoConverter implements AttributeConverter<OidDto, String> {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final Markdown memberValue) {
+    public String convertToDatabaseColumn(final OidDto memberValue) {
         return memberValue != null
-                ? memberValue.getMarkdown()
+                ? Bookmark.forOidDto(memberValue).toString()
                 : null;
     }
 
     @Override
-    public Markdown toMemberType(final String datastoreValue) {
+    public OidDto convertToEntityAttribute(final String datastoreValue) {
         return datastoreValue != null
-                ? Markdown.valueOf(datastoreValue)
+                ? Bookmark.parse(datastoreValue)
+                    .map(Bookmark::toOidDto)
+                    .orElse(null)
                 : null;
     }
 
diff --git a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/time/IsoOffsetTimeConverter.java
similarity index 62%
copy from valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/time/IsoOffsetTimeConverter.java
index 7798477c3a..437e24695e 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/time/IsoOffsetTimeConverter.java
@@ -16,30 +16,31 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.markdown.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.time;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import java.time.OffsetTime;
+import java.time.format.DateTimeFormatter;
 
-import org.apache.isis.valuetypes.markdown.applib.value.Markdown;
+import javax.persistence.AttributeConverter;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisMarkdownConverter implements TypeConverter<Markdown, String>{
+public class IsoOffsetTimeConverter implements AttributeConverter<OffsetTime, String>{
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final Markdown memberValue) {
-        return memberValue != null
-                ? memberValue.getMarkdown()
+    public String convertToDatabaseColumn(final OffsetTime offsetTime) {
+        return offsetTime != null
+                ? offsetTime.format(DateTimeFormatter.ISO_OFFSET_TIME)
                 : null;
     }
 
     @Override
-    public Markdown toMemberType(final String datastoreValue) {
+    public OffsetTime convertToEntityAttribute(final String datastoreValue) {
         return datastoreValue != null
-                ? Markdown.valueOf(datastoreValue)
+                ? OffsetTime.parse(datastoreValue, DateTimeFormatter.ISO_OFFSET_TIME)
                 : null;
     }
 
diff --git a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/time/IsoZonedDateTimeConverter.java
similarity index 60%
copy from valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
copy to persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/time/IsoZonedDateTimeConverter.java
index 7798477c3a..a1ba29edcf 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/typeconverters/time/IsoZonedDateTimeConverter.java
@@ -16,30 +16,32 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.markdown.persistence.jdo.dn5.converters;
+package org.apache.isis.persistence.jpa.integration.typeconverters.time;
 
-import org.datanucleus.store.types.converters.TypeConverter;
+import java.time.OffsetTime;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 
-import org.apache.isis.valuetypes.markdown.applib.value.Markdown;
+import javax.persistence.AttributeConverter;
 
 /**
  * @since 2.0 {@index}
  */
-public class IsisMarkdownConverter implements TypeConverter<Markdown, String>{
+public class IsoZonedDateTimeConverter implements AttributeConverter<ZonedDateTime, String> {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public String toDatastoreType(final Markdown memberValue) {
-        return memberValue != null
-                ? memberValue.getMarkdown()
+    public String convertToDatabaseColumn(final ZonedDateTime offsetTime) {
+        return offsetTime != null
+                ? offsetTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME)
                 : null;
     }
 
     @Override
-    public Markdown toMemberType(final String datastoreValue) {
+    public ZonedDateTime convertToEntityAttribute(final String datastoreValue) {
         return datastoreValue != null
-                ? Markdown.valueOf(datastoreValue)
+                ? ZonedDateTime.parse(datastoreValue, DateTimeFormatter.ISO_ZONED_DATE_TIME)
                 : null;
     }
 
diff --git a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/entitychangetracking/jdo/JdoEntityChangePublishingTest.java b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/entitychangetracking/jdo/JdoEntityChangePublishingTest.java
index 1207c87a29..43aa7093c2 100644
--- a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/entitychangetracking/jdo/JdoEntityChangePublishingTest.java
+++ b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/entitychangetracking/jdo/JdoEntityChangePublishingTest.java
@@ -49,7 +49,7 @@ import lombok.val;
         },
         properties = {
                 "logging.level.org.apache.isis.testdomain.util.rest.KVStoreForTesting=DEBUG",
-                "logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisTransactionJdo=DEBUG"
+                "logging.level.org.apache.isis.persistence.jdo.datanucleus.persistence.IsisTransactionJdo=DEBUG"
         })
 @TestPropertySource({
     IsisPresets.SilenceWicket
diff --git a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoCommandPublishingTest.java b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoCommandPublishingTest.java
index 6b734f3f83..60b2518dda 100644
--- a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoCommandPublishingTest.java
+++ b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoCommandPublishingTest.java
@@ -40,9 +40,9 @@ import org.apache.isis.testdomain.publishing.stubs.CommandPublishingTestAbstract
         },
         properties = {
                 "logging.level.org.apache.isis.applib.services.publishing.log.CommandLogger=DEBUG",
-                "logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisTransactionJdo=DEBUG",
+                "logging.level.org.apache.isis.persistence.jdo.datanucleus.persistence.IsisTransactionJdo=DEBUG",
                 "logging.level.org.apache.isis.core.runtimeservices.session.IsisInteractionFactoryDefault=DEBUG",
-                "logging.level.org.apache.isis.persistence.jdo.datanucleus5.datanucleus.service.JdoPersistenceLifecycleService=DEBUG"
+                "logging.level.org.apache.isis.persistence.jdo.datanucleus.datanucleus.service.JdoPersistenceLifecycleService=DEBUG"
         })
 @TestPropertySource({
     IsisPresets.UseLog4j2Test
diff --git a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoEntityPublishingTest.java b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoEntityPublishingTest.java
index 65551908a8..d1d20b1a25 100644
--- a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoEntityPublishingTest.java
+++ b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoEntityPublishingTest.java
@@ -40,7 +40,7 @@ import org.apache.isis.testdomain.publishing.stubs.EntityPublishingTestAbstract;
         },
         properties = {
                 "logging.level.org.apache.isis.applib.services.publishing.log.EntityChangesLogger=DEBUG",
-                "logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisTransactionJdo=DEBUG",
+                "logging.level.org.apache.isis.persistence.jdo.datanucleus.persistence.IsisTransactionJdo=DEBUG",
                 "logging.level.org.apache.isis.core.runtimeservices.session.IsisInteractionFactoryDefault=DEBUG",
                 "logging.level.org.apache.isis.persistence.jdo.integration.changetracking.JdoLifecycleListener=DEBUG",
                 "logging.level.org.apache.isis.testdomain.util.kv.KVStoreForTesting=DEBUG",
diff --git a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoExecutionPublishingTest.java b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoExecutionPublishingTest.java
index 4a41c56963..205fd105cd 100644
--- a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoExecutionPublishingTest.java
+++ b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/publishing/jdo/JdoExecutionPublishingTest.java
@@ -40,9 +40,9 @@ import org.apache.isis.testdomain.publishing.stubs.ExecutionPublishingTestAbstra
         },
         properties = {
                 "logging.level.org.apache.isis.applib.services.publishing.log.ExecutionLogger=DEBUG",
-                "logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisTransactionJdo=DEBUG",
+                "logging.level.org.apache.isis.persistence.jdo.datanucleus.persistence.IsisTransactionJdo=DEBUG",
                 "logging.level.org.apache.isis.core.runtimeservices.session.IsisInteractionFactoryDefault=DEBUG",
-                "logging.level.org.apache.isis.persistence.jdo.datanucleus5.datanucleus.service.JdoPersistenceLifecycleService=DEBUG"
+                "logging.level.org.apache.isis.persistence.jdo.datanucleus.datanucleus.service.JdoPersistenceLifecycleService=DEBUG"
         })
 @TestPropertySource({
     IsisPresets.UseLog4j2Test
diff --git a/regressiontests/stable-bootstrapping/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list b/regressiontests/stable-bootstrapping/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
index 20b36a5241..ef32ff36c6 100644
--- a/regressiontests/stable-bootstrapping/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
+++ b/regressiontests/stable-bootstrapping/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
@@ -29,7 +29,7 @@ org.apache.isis.core.runtimeservices.urlencoding.UrlEncodingServiceWithCompressi
 org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts
 ServiceRegistryDefault
 UserServiceDefault$SudoServiceSpi
-org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceForJdo
+org.apache.isis.persistence.jdo.datanucleus.metrics.MetricsServiceForJdo
 CommandDtoFactoryDefault
 org.apache.isis.core.runtimeservices.confmenu.ConfigurationViewServiceDefault
 org.apache.isis.core.runtimeservices.email.EmailServiceDefault
diff --git a/regressiontests/stable-rest/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list b/regressiontests/stable-rest/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
index 20b36a5241..ef32ff36c6 100644
--- a/regressiontests/stable-rest/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
+++ b/regressiontests/stable-rest/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
@@ -29,7 +29,7 @@ org.apache.isis.core.runtimeservices.urlencoding.UrlEncodingServiceWithCompressi
 org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts
 ServiceRegistryDefault
 UserServiceDefault$SudoServiceSpi
-org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceForJdo
+org.apache.isis.persistence.jdo.datanucleus.metrics.MetricsServiceForJdo
 CommandDtoFactoryDefault
 org.apache.isis.core.runtimeservices.confmenu.ConfigurationViewServiceDefault
 org.apache.isis.core.runtimeservices.email.EmailServiceDefault
diff --git a/testing/fixtures/pom.xml b/testing/fixtures/pom.xml
index 1c6885ecf1..e4c450f772 100644
--- a/testing/fixtures/pom.xml
+++ b/testing/fixtures/pom.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	you under the Apache License, Version 2.0 (the "License"); you may not use 
-	this file except in compliance with the License. You may obtain a copy of 
-	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
-	by applicable law or agreed to in writing, software distributed under the 
-	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
-	OF ANY KIND, either express or implied. See the License for the specific 
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
+	license agreements. See the NOTICE file distributed with this work for additional
+	information regarding copyright ownership. The ASF licenses this file to
+	you under the Apache License, Version 2.0 (the "License"); you may not use
+	this file except in compliance with the License. You may obtain a copy of
+	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
+	by applicable law or agreed to in writing, software distributed under the
+	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+	OF ANY KIND, either express or implied. See the License for the specific
 	language governing permissions and limitations under the License. -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -28,6 +28,16 @@
 
 	<packaging>pom</packaging>
 
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.apache.isis.testing</groupId>
+				<artifactId>isis-testing-fixtures-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
 	<modules>
 		<module>applib</module>
 	</modules>
diff --git a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/IsisModuleValAsciidocPersistenceJdoDn5.java b/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn/IsisModuleValAsciidocPersistenceJdoDn.java
similarity index 90%
rename from valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/IsisModuleValAsciidocPersistenceJdoDn5.java
rename to valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn/IsisModuleValAsciidocPersistenceJdoDn.java
index 4f5d4baf06..03630a3957 100644
--- a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/IsisModuleValAsciidocPersistenceJdoDn5.java
+++ b/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn/IsisModuleValAsciidocPersistenceJdoDn.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5;
+package org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn;
 
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
@@ -30,5 +30,5 @@ import org.apache.isis.valuetypes.asciidoc.applib.IsisModuleValAsciidocApplib;
 @Import({
     IsisModuleValAsciidocApplib.class
 })
-public class IsisModuleValAsciidocPersistenceJdoDn5 {
+public class IsisModuleValAsciidocPersistenceJdoDn {
 }
diff --git a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java b/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn/converters/IsisAsciiDocConverter.java
similarity index 95%
rename from valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
rename to valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn/converters/IsisAsciiDocConverter.java
index ae57e8bec7..c87cca2d2c 100644
--- a/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn5/converters/IsisAsciiDocConverter.java
+++ b/valuetypes/asciidoc/persistence/jdo/src/main/java/org/apache/isis/valuetypes/asciidoc/persistence/jdo/dn/converters/IsisAsciiDocConverter.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5.converters;
+package org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn.converters;
 
 import org.datanucleus.store.types.converters.TypeConverter;
 
diff --git a/valuetypes/asciidoc/persistence/jdo/src/main/resources/META-INF/MANIFEST.MF b/valuetypes/asciidoc/persistence/jdo/src/main/resources/META-INF/MANIFEST.MF
index 8dc36ab09d..90ecf82986 100644
--- a/valuetypes/asciidoc/persistence/jdo/src/main/resources/META-INF/MANIFEST.MF
+++ b/valuetypes/asciidoc/persistence/jdo/src/main/resources/META-INF/MANIFEST.MF
@@ -1,6 +1,6 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: Apache Isis Value Types AsciiDoc Persistence JDO DataNucleus 5.2 Implementation
-Bundle-SymbolicName: org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5
+Bundle-Name: Apache Isis Value Types AsciiDoc Persistence JDO DataNucleus Implementation
+Bundle-SymbolicName: org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn
 Bundle-Version: 2.0.0
 Bundle-Vendor: Apache Isis
diff --git a/valuetypes/asciidoc/persistence/jdo/src/main/resources/plugin.xml b/valuetypes/asciidoc/persistence/jdo/src/main/resources/plugin.xml
index e1f9b5dc28..5bcd57c09b 100644
--- a/valuetypes/asciidoc/persistence/jdo/src/main/resources/plugin.xml
+++ b/valuetypes/asciidoc/persistence/jdo/src/main/resources/plugin.xml
@@ -1,25 +1,25 @@
 <?xml version="1.0"?>
 <!--
-    Licensed to the Apache Software Foundation (ASF) under one 
-    or more contributor license agreements. See the NOTICE file 
-    distributed with this work for additional information 
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements. See the NOTICE file
+    distributed with this work for additional information
     regarding copyright ownership. The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the 
-    "License"); you may not use this file except in compliance 
-    with the License. You may obtain a copy of the License at 
-    
-        http://www.apache.org/licenses/LICENSE-2.0 
-        
-    Unless required by applicable law or agreed to in writing, 
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License. You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
-    KIND, either express or implied. See the License for the 
-    specific language governing permissions and limitations 
-    under the License. 
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied. See the License for the
+    specific language governing permissions and limitations
+    under the License.
 -->
 <plugin
-   id="org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5"
-   name="Apache Isis Value Types AsciiDoc Persistence JDO DataNucleus 5 Implementation"
+   id="org.apache.isis.valuetypes.asciidoc.persistence.jdo"
+   name="Apache Isis Value Types AsciiDoc Persistence JDO DataNucleus Implementation"
    provider-name="Apache Isis">
 
 
@@ -42,7 +42,7 @@
                 name="isis.ext.asciidoc-string"
                 member-type="org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc"
                 datastore-type="java.lang.String"
-                converter-class="org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn5.converters.IsisAsciiDocConverter"/>
+                converter-class="org.apache.isis.valuetypes.asciidoc.persistence.jdo.dn.converters.IsisAsciiDocConverter"/>
     </extension>
 
 
diff --git a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/IsisModuleValMarkdownPersistenceJdoDn5.java b/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn/IsisModuleValMarkdownPersistenceJdoDn.java
similarity index 90%
rename from valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/IsisModuleValMarkdownPersistenceJdoDn5.java
rename to valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn/IsisModuleValMarkdownPersistenceJdoDn.java
index 84b524aa16..c8a97fe612 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/IsisModuleValMarkdownPersistenceJdoDn5.java
+++ b/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn/IsisModuleValMarkdownPersistenceJdoDn.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.markdown.persistence.jdo.dn5;
+package org.apache.isis.valuetypes.markdown.persistence.jdo.dn;
 
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
@@ -30,5 +30,5 @@ import org.apache.isis.valuetypes.markdown.applib.IsisModuleValMarkdownApplib;
 @Import({
     IsisModuleValMarkdownApplib.class
 })
-public class IsisModuleValMarkdownPersistenceJdoDn5 {
+public class IsisModuleValMarkdownPersistenceJdoDn {
 }
diff --git a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java b/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn/converters/IsisMarkdownConverter.java
similarity index 95%
rename from valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
rename to valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn/converters/IsisMarkdownConverter.java
index 7798477c3a..34e1266c3c 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn5/converters/IsisMarkdownConverter.java
+++ b/valuetypes/markdown/persistence/jdo/src/main/java/org/apache/isis/valuetypes/markdown/persistence/jdo/dn/converters/IsisMarkdownConverter.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.valuetypes.markdown.persistence.jdo.dn5.converters;
+package org.apache.isis.valuetypes.markdown.persistence.jdo.dn.converters;
 
 import org.datanucleus.store.types.converters.TypeConverter;
 
diff --git a/valuetypes/markdown/persistence/jdo/src/main/resources/META-INF/MANIFEST.MF b/valuetypes/markdown/persistence/jdo/src/main/resources/META-INF/MANIFEST.MF
index 847a5a3028..6a1b68d9ca 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/resources/META-INF/MANIFEST.MF
+++ b/valuetypes/markdown/persistence/jdo/src/main/resources/META-INF/MANIFEST.MF
@@ -1,6 +1,6 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: Apache Isis Value Types Markdown Persistence JDO DataNucleus 5.2 Implementation
-Bundle-SymbolicName: org.apache.isis.valuetypes.markdown.persistence.jdo.dn5
+Bundle-Name: Apache Isis Value Types Markdown Persistence JDO DataNucleus Implementation
+Bundle-SymbolicName: org.apache.isis.valuetypes.markdown.persistence.jdo.dn
 Bundle-Version: 2.0.0
 Bundle-Vendor: Apache Isis
diff --git a/valuetypes/markdown/persistence/jdo/src/main/resources/plugin.xml b/valuetypes/markdown/persistence/jdo/src/main/resources/plugin.xml
index eca7cb8180..fb15ec1366 100644
--- a/valuetypes/markdown/persistence/jdo/src/main/resources/plugin.xml
+++ b/valuetypes/markdown/persistence/jdo/src/main/resources/plugin.xml
@@ -1,25 +1,25 @@
 <?xml version="1.0"?>
 <!--
-    Licensed to the Apache Software Foundation (ASF) under one 
-    or more contributor license agreements. See the NOTICE file 
-    distributed with this work for additional information 
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements. See the NOTICE file
+    distributed with this work for additional information
     regarding copyright ownership. The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the 
-    "License"); you may not use this file except in compliance 
-    with the License. You may obtain a copy of the License at 
-    
-        http://www.apache.org/licenses/LICENSE-2.0 
-        
-    Unless required by applicable law or agreed to in writing, 
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License. You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
-    KIND, either express or implied. See the License for the 
-    specific language governing permissions and limitations 
-    under the License. 
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied. See the License for the
+    specific language governing permissions and limitations
+    under the License.
 -->
 <plugin
-   id="org.apache.isis.valuetypes.markdown.persistence.jdo.dn5"
-   name="Apache Isis Value Types Markdown Persistence JDO DataNucleus 5 Implementation"
+   id="org.apache.isis.valuetypes.markdown.persistence.jdo.dn"
+   name="Apache Isis Value Types Markdown Persistence JDO DataNucleus Implementation"
    provider-name="Apache Isis">
 
 
@@ -42,7 +42,7 @@
                 name="isis.ext.markdown-string"
                 member-type="org.apache.isis.valuetypes.markdown.applib.value.Markdown"
                 datastore-type="java.lang.String"
-                converter-class="org.apache.isis.valuetypes.markdown.persistence.jdo.dn5.converters.IsisMarkdownConverter"/>
+                converter-class="org.apache.isis.valuetypes.markdown.persistence.jdo.dn.converters.IsisMarkdownConverter"/>
     </extension>
 
 </plugin>