You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/09/08 22:04:47 UTC

[isis] branch ISIS-2735-command-log created (now 66c5cb9)

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

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


      at 66c5cb9  ISIS-2735: wip

This branch includes the following new commits:

     new 890ae8d  ISIS-2735: wip, bringing in Command as abstract class
     new 66c5cb9  ISIS-2735: wip

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


[isis] 02/02: ISIS-2735: wip

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

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

commit 66c5cb94e0a365101ebc449a9313afcb71d1c3f0
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Sep 8 23:04:15 2021 +0100

    ISIS-2735: wip
---
 .../extensions/commandlog/applib/dom/Command.java  | 30 +++++++++++++++-------
 1 file changed, 21 insertions(+), 9 deletions(-)

diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/Command.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/Command.java
index 5dc6c8c..8f73798 100644
--- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/Command.java
+++ b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/Command.java
@@ -238,20 +238,31 @@ public abstract class Command implements DomainChangeRecord {
 
 
 
-    // UP TO HERE...
-
-    public static class ReplayStateFailureReasonDomainEvent extends PropertyDomainEvent<ReplayState> { }
-    /**
-     * For a {@link org.apache.isis.extensions.commandlog.applib.dom.ReplayState#FAILED failed} replayed command,
-     * what the reason was for the failure.
-     */
     @Property(
-            domainEvent = ReplayStateFailureReasonDomainEvent.class
+            domainEvent = ReplayStateFailureReason.DomainEvent.class
     )
     @PropertyLayout(
             hidden = Where.ALL_TABLES,
-            multiLine = 5
+            multiLine = ReplayStateFailureReason.MULTILINE
     )
+    @Parameter(
+    )
+    @ParameterLayout(
+            multiLine = ReplayStateFailureReason.MULTILINE
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface ReplayStateFailureReason {
+
+        int MULTILINE = 5;
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+
+    /**
+     * 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);
 
@@ -260,6 +271,7 @@ public abstract class Command implements DomainChangeRecord {
     }
 
 
+
     public static class ParentDomainEvent extends PropertyDomainEvent<org.apache.isis.applib.services.command.Command> { }
     @Property(
             domainEvent = ParentDomainEvent.class

[isis] 01/02: ISIS-2735: wip, bringing in Command as abstract class

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

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

commit 890ae8dfd6527f645ae98049de51607c2371514d
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Sep 7 07:24:13 2021 +0100

    ISIS-2735: wip, bringing in Command as abstract class
---
 .../applib/mixins/system/DomainChangeRecord.java   | 136 +++++-
 .../domain/_commands/ExposePersistedCommands.java  |   2 +-
 .../ExposePersistedCommands_commands.java          |   2 +-
 .../IsisModuleExtCommandLogApplib.java             |  18 +-
 .../extensions/commandlog/applib/dom/Command.java  | 527 +++++++++++++++++++++
 .../command => applib/dom}/CommandModel.java       |  11 +-
 .../dom}/CommandModelRepository.java               |   2 +-
 .../{model/command => applib/dom}/ReplayState.java |   2 +-
 .../{model => applib}/util/BigDecimalUtils.java    |   2 +-
 .../{model => applib}/util/StringUtils.java        |   2 +-
 .../util/StringUtils_trimmed_Test.java             |   4 +-
 .../commandlog/jdo/IsisModuleExtCommandLogJdo.java |   4 +-
 .../commandlog/jdo/entities/CommandJdo.java        |   8 +-
 .../jdo/entities/CommandJdoRepository.java         |   6 +-
 .../jdo/entities/CommandJdo_childCommands.java     |   2 +-
 .../commandlog/jdo/entities/CommandJdo_retry.java  |   2 +-
 .../commandlog/jpa/entities/CommandJpa.java        |   8 +-
 .../jpa/entities/CommandJpaRepository.java         |   6 +-
 .../primary/IsisModuleExtCommandReplayPrimary.java |   2 +-
 .../primary/restapi/CommandRetrievalService.java   |   4 +-
 .../primary/spiimpl/CaptureResultOfCommand.java    |   2 +-
 .../primary/ui/CommandReplayOnPrimaryService.java  |   4 +-
 .../IsisModuleExtCommandReplaySecondary.java       |   2 +-
 .../secondary/analyser/CommandReplayAnalyser.java  |   2 +-
 .../analyser/CommandReplayAnalyserException.java   |   2 +-
 .../analyser/CommandReplayAnalyserResult.java      |   2 +-
 .../analysis/CommandReplayAnalysisService.java     |   2 +-
 .../secondary/fetch/CommandFetcher.java            |   2 +-
 .../jobcallables/ReplicateAndRunCommands.java      |   6 +-
 .../secondary/mixins/CommandJdo_replayQueue.java   |   4 +-
 .../secondary/mixins/CommandModel_exclude.java     |   6 +-
 .../ui/CommandReplayOnSecondaryService.java        |   4 +-
 32 files changed, 707 insertions(+), 81 deletions(-)

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 944b004..c1dfe15 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
@@ -18,13 +18,20 @@
  */
 package org.apache.isis.applib.mixins.system;
 
-import java.sql.Timestamp;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 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.ParameterLayout;
 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.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.mixins.security.HasUsername;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 
@@ -38,6 +45,33 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
  */
 public interface DomainChangeRecord extends HasInteractionId, HasUsername {
 
+    @Property(
+            domainEvent = ChangeTypeMeta.DomainEvent.class,
+            editing = Editing.DISABLED,
+            maxLength = ChangeTypeMeta.MAX_LENGTH
+    )
+    @PropertyLayout(
+            hidden = Where.ALL_EXCEPT_STANDALONE_TABLES,
+            fieldSetId = "Identifiers",
+            sequence = "1",
+            typicalLength = ChangeTypeMeta.TYPICAL_LENGTH
+    )
+    @Parameter(
+            maxLength = ChangeTypeMeta.MAX_LENGTH
+    )
+    @ParameterLayout(
+            named = "Change Type",
+            typicalLength = ChangeTypeMeta.TYPICAL_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface ChangeTypeMeta {
+        int MAX_LENGTH = 24;
+        int TYPICAL_LENGTH = 24;
+
+        class DomainEvent extends PropertyDomainEvent<DomainChangeRecord, DomainChangeRecord.ChangeType> {}
+    }
+
     /**
      * Enumerates the different types of changes recognised.
      *
@@ -56,40 +90,114 @@ public interface DomainChangeRecord extends HasInteractionId, HasUsername {
     /**
      * Distinguishes commands from audit entries from published events/interactions (when these are shown mixed together in a (standalone) table).
      */
-    @Property
-    @PropertyLayout(
-            hidden = Where.ALL_EXCEPT_STANDALONE_TABLES,
-            fieldSetId="Identifiers",
-            sequence = "1")
+    @ChangeTypeMeta
     ChangeType getType();
 
 
+
+    @Property(
+            domainEvent = InteractionId.DomainEvent.class,
+            editing = Editing.DISABLED,
+            maxLength = InteractionId.MAX_LENGTH
+    )
+    @PropertyLayout(
+            fieldSetId = "Identifiers",
+            sequence = "50",
+            typicalLength = InteractionId.TYPICAL_LENGTH
+    )
+    @Parameter(
+            maxLength = InteractionId.MAX_LENGTH
+    )
+    @ParameterLayout(
+            typicalLength = InteractionId.TYPICAL_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface InteractionId {
+        int MAX_LENGTH = 36;
+        int TYPICAL_LENGTH = 36;
+
+        class DomainEvent extends PropertyDomainEvent<DomainChangeRecord, UUID> { }
+    }
+
+
     /**
      * The unique identifier (a GUID) of the
      * {@link org.apache.isis.applib.services.iactn.Interaction} within which
      * this change occurred.
      */
+    @InteractionId
     @Override
-    @Property
-    @PropertyLayout(fieldSetId="Identifiers",sequence = "50")
     UUID getInteractionId();
 
 
+
+    @Property(
+            domainEvent = Username.DomainEvent.class,
+            editing = Editing.DISABLED,
+            maxLength = Username.MAX_LENGTH
+    )
+    @PropertyLayout(
+            fieldSetId="Identifiers",
+            sequence = "10",
+            typicalLength = Username.TYPICAL_LENGTH,
+            hidden = Where.PARENTED_TABLES
+    )
+    @Parameter(
+            maxLength = Username.MAX_LENGTH
+    )
+    @ParameterLayout(
+            named = "Username",
+            typicalLength = Username.TYPICAL_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface Username {
+        int MAX_LENGTH = 120;
+        int TYPICAL_LENGTH = 40;
+
+        class DomainEvent extends PropertyDomainEvent<DomainChangeRecord, String> {}
+    }
+
     /**
      * The user that caused the change.
      */
-    @Override
-    @Property
-    @PropertyLayout(fieldSetId="Identifiers", sequence = "10")
+    @Username
     String getUsername();
 
 
+
+    @Property(
+            domainEvent = DomainChangeRecord.Timestamp.DomainEvent.class,
+            editing = Editing.DISABLED,
+            maxLength = Timestamp.MAX_LENGTH
+    )
+    @PropertyLayout(
+            fieldSetId="Identifiers",
+            sequence = "20",
+            typicalLength = Timestamp.TYPICAL_LENGTH
+    )
+    @Parameter(
+            maxLength = Timestamp.MAX_LENGTH
+    )
+    @ParameterLayout(
+            named = "Timestamp",
+            typicalLength = Timestamp.TYPICAL_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface Timestamp {
+        int MAX_LENGTH = 32;
+        int TYPICAL_LENGTH = 32;
+
+        class DomainEvent extends PropertyDomainEvent<DomainChangeRecord, java.sql.Timestamp> {}
+    }
+
     /**
      * The time that the change occurred.
      */
-    @Property
-    @PropertyLayout(fieldSetId="Identifiers", sequence = "20")
-    Timestamp getTimestamp();
+    @DomainChangeRecord.Timestamp
+    java.sql.Timestamp getTimestamp();
 
 
     /**
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands.java
index 106899d..51254d5 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands.java
@@ -25,7 +25,7 @@ import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.tablecol.TableColumnOrderForCollectionTypeAbstract;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 
 /**
  * Marker interface for mixins to contribute to.
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands_commands.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands_commands.java
index d857ee6..767f8f9 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands_commands.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands_commands.java
@@ -25,7 +25,7 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdoRepository;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 
 import lombok.RequiredArgsConstructor;
 
diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/IsisModuleExtCommandLogApplib.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java
similarity index 78%
rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/IsisModuleExtCommandLogApplib.java
rename to extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java
index f6a9576..2206d1f 100644
--- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/IsisModuleExtCommandLogApplib.java
+++ b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java
@@ -16,32 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.commandlog.model;
+package org.apache.isis.extensions.commandlog.applib;
 
 import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures;
 
 public interface IsisModuleExtCommandLogApplib
 extends ModuleWithFixtures {
 
-    public abstract static class TitleUiEvent<S>
+    String NAMESPACE = "isis.ext.commandLog";
+
+    abstract class TitleUiEvent<S>
         extends org.apache.isis.applib.events.ui.TitleUiEvent<S> { }
 
-    public abstract static class IconUiEvent<S>
+    abstract class IconUiEvent<S>
         extends org.apache.isis.applib.events.ui.IconUiEvent<S> { }
 
-    public abstract static class CssClassUiEvent<S>
+    abstract class CssClassUiEvent<S>
         extends org.apache.isis.applib.events.ui.CssClassUiEvent<S> { }
 
-    public abstract static class LayoutUiEvent<S>
+    abstract class LayoutUiEvent<S>
         extends org.apache.isis.applib.events.ui.LayoutUiEvent<S> { }
 
-    public abstract static class ActionDomainEvent<S>
+    abstract class ActionDomainEvent<S>
         extends org.apache.isis.applib.events.domain.ActionDomainEvent<S> { }
 
-    public abstract static class CollectionDomainEvent<S,T>
+    abstract class CollectionDomainEvent<S,T>
         extends org.apache.isis.applib.events.domain.CollectionDomainEvent<S,T> { }
 
-    public abstract static class PropertyDomainEvent<S,T>
+    abstract class PropertyDomainEvent<S,T>
         extends org.apache.isis.applib.events.domain.PropertyDomainEvent<S,T> { }
 
 }
diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/Command.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/Command.java
new file mode 100644
index 0000000..5dc6c8c
--- /dev/null
+++ b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/Command.java
@@ -0,0 +1,527 @@
+/*
+ *  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.commandlog.applib.dom;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.math.BigDecimal;
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+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;
+
+import org.springframework.context.event.EventListener;
+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.MemberSupport;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.ParameterLayout;
+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.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
+import org.apache.isis.applib.mixins.system.DomainChangeRecord;
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.command.CommandOutcomeHandler;
+import org.apache.isis.applib.services.commanddto.conmap.UserDataKeys;
+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.commons.functional.Result;
+import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib;
+import org.apache.isis.extensions.commandlog.applib.util.BigDecimalUtils;
+import org.apache.isis.extensions.commandlog.applib.util.StringUtils;
+import org.apache.isis.schema.cmd.v2.CommandDto;
+import org.apache.isis.schema.cmd.v2.MapDto;
+
+import lombok.val;
+
+@DomainObject(
+        logicalTypeName = Command.LOGICAL_TYPE_NAME,
+        editing = Editing.DISABLED
+)
+@DomainObjectLayout(
+        titleUiEvent = Command.TitleUiEvent.class,
+        iconUiEvent = Command.IconUiEvent.class,
+        cssClassUiEvent = Command.CssClassUiEvent.class,
+        layoutUiEvent = Command.LayoutUiEvent.class
+)
+public abstract class Command implements DomainChangeRecord {
+
+    public final static String LOGICAL_TYPE_NAME = IsisModuleExtCommandLogApplib.NAMESPACE + ".Command";
+
+    public static class TitleUiEvent extends IsisModuleExtCommandLogApplib.TitleUiEvent<CommandModel> { }
+    public static class IconUiEvent extends IsisModuleExtCommandLogApplib.IconUiEvent<CommandModel> { }
+    public static class CssClassUiEvent extends IsisModuleExtCommandLogApplib.CssClassUiEvent<CommandModel> { }
+    public static class LayoutUiEvent extends IsisModuleExtCommandLogApplib.LayoutUiEvent<CommandModel> { }
+
+    public static abstract class PropertyDomainEvent<T> extends IsisModuleExtCommandLogApplib.PropertyDomainEvent<CommandModel, T> { }
+    public static abstract class CollectionDomainEvent<T> extends IsisModuleExtCommandLogApplib.CollectionDomainEvent<CommandModel, T> { }
+
+
+    public Command(final org.apache.isis.applib.services.command.Command command) {
+
+        setInteractionIdStr(command.getInteractionId().toString());
+        setUsername(command.getUsername());
+        setTimestamp(command.getTimestamp());
+
+        setCommandDto(command.getCommandDto());
+        setTarget(command.getTarget());
+        setLogicalMemberIdentifier(command.getLogicalMemberIdentifier());
+
+        setStartedAt(command.getStartedAt());
+        setCompletedAt(command.getCompletedAt());
+
+        setResult(command.getResult());
+        setException(command.getException());
+
+        setReplayState(ReplayState.UNDEFINED);
+    }
+
+
+    /**
+     * Intended for use on secondary (replay) system.
+     *
+     * @param commandDto - obtained from the primary system as a representation of a command invocation
+     * @param replayState - controls whether this is to be replayed
+     * @param targetIndex - if the command represents a bulk action, then it is flattened out when replayed; this indicates which target to execute against.
+     */
+    public Command(
+            final CommandDto commandDto,
+            final ReplayState replayState,
+            final int targetIndex) {
+
+        setInteractionIdStr(commandDto.getInteractionId());
+        setUsername(commandDto.getUser());
+        setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimestamp()));
+
+        setCommandDto(commandDto);
+        setTarget(Bookmark.forOidDto(commandDto.getTargets().getOid().get(targetIndex)));
+        setLogicalMemberIdentifier(commandDto.getMember().getLogicalMemberIdentifier());
+
+        // the hierarchy of commands calling other commands is only available on the primary system, and is
+        setParent(null);
+
+        setStartedAt(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimings().getStartedAt()));
+        setCompletedAt(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimings().getCompletedAt()));
+
+        copyOver(commandDto, UserDataKeys.RESULT, value -> this.setResult(Bookmark.parse(value).orElse(null)));
+        copyOver(commandDto, UserDataKeys.EXCEPTION, this::setException);
+
+        setReplayState(replayState);
+    }
+
+    static void copyOver(
+            final CommandDto commandDto,
+            final String key, final Consumer<String> consume) {
+        commandDto.getUserData().getEntry()
+                .stream()
+                .filter(x -> Objects.equals(x.getKey(), key))
+                .map(MapDto.Entry::getValue)
+                .filter(Objects::nonNull)
+                .filter(x -> x.length() > 0)
+                .findFirst()
+                .ifPresent(consume);
+    }
+
+    @Service
+    public static class TitleProvider {
+
+        @EventListener(TitleUiEvent.class)
+        public void on(final TitleUiEvent ev) {
+            if(!Objects.equals(ev.getTitle(), "Command Jdo") || ev.getTranslatableTitle() != null) {
+                return;
+            }
+            ev.setTitle(title((Command)ev.getSource()));
+        }
+
+        private static String title(final Command source) {
+            // nb: not thread-safe
+            // formats defined in https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
+            val format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+
+            val buf = new TitleBuffer();
+            buf.append(format.format(source.getTimestamp()));
+            buf.append(" ").append(source.getLogicalMemberIdentifier());
+            return buf.toString();
+        }
+    }
+
+
+    @DomainChangeRecord.ChangeTypeMeta
+    @Override
+    public DomainChangeRecord.ChangeType getType() {
+        return ChangeType.COMMAND;
+    }
+
+
+    @DomainChangeRecord.InteractionId
+    @Override
+    public abstract UUID getInteractionId();
+    public abstract void setInteractionId(UUID interactionId);
+
+
+    @DomainChangeRecord.Username
+    @Override
+    public abstract String getUsername();
+    public abstract void setUsername(String username);
+
+
+    @DomainChangeRecord.Timestamp
+    @Override
+    public abstract java.sql.Timestamp getTimestamp();
+    public abstract void setTimestamp(java.sql.Timestamp timestamp);
+
+
+
+    @Property(
+            domainEvent = ReplayState.DomainEvent.class,
+            editing = Editing.DISABLED,
+            maxLength = ReplayState.MAX_LENGTH
+    )
+    @PropertyLayout(
+            // fieldSetId = "XXX",  // TODO: fix
+            // sequence = "XXX",
+            typicalLength = ReplayState.TYPICAL_LENGTH
+    )
+    @Parameter(
+            maxLength = ReplayState.MAX_LENGTH
+    )
+    @ParameterLayout(
+            named = "Replay State",
+            typicalLength = ReplayState.TYPICAL_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface ReplayState {
+        int MAX_LENGTH = 12;
+        int TYPICAL_LENGTH = 12;
+
+        class DomainEvent extends PropertyDomainEvent<org.apache.isis.extensions.commandlog.applib.dom.ReplayState> {}
+    }
+
+
+    /**
+     * For a replayed command, what the outcome was.
+     */
+    @Command.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);
+
+
+
+    // UP TO HERE...
+
+    public static class ReplayStateFailureReasonDomainEvent extends PropertyDomainEvent<ReplayState> { }
+    /**
+     * For a {@link org.apache.isis.extensions.commandlog.applib.dom.ReplayState#FAILED failed} replayed command,
+     * what the reason was for the failure.
+     */
+    @Property(
+            domainEvent = ReplayStateFailureReasonDomainEvent.class
+    )
+    @PropertyLayout(
+            hidden = Where.ALL_TABLES,
+            multiLine = 5
+    )
+    public abstract String getReplayStateFailureReason();
+    public abstract void setReplayStateFailureReason(String replayStateFailureReason);
+
+    @MemberSupport public boolean hideReplayStateFailureReason() {
+        return getReplayState() == null || !getReplayState().isFailed();
+    }
+
+
+    public static class ParentDomainEvent extends PropertyDomainEvent<org.apache.isis.applib.services.command.Command> { }
+    @Property(
+            domainEvent = ParentDomainEvent.class
+    )
+    @PropertyLayout(
+            hidden = Where.ALL_TABLES
+    )
+    public abstract Command getParent();
+    public abstract void setParent(Command parent);
+
+
+
+    public static class TargetDomainEvent extends PropertyDomainEvent<Bookmark> { }
+    @Property(
+            domainEvent = TargetDomainEvent.class
+    )
+    @PropertyLayout(
+            named = "Object"
+    )
+    public abstract Bookmark getTarget();
+    public abstract void setTarget(Bookmark target);
+
+    public String getTargetStr() {
+        return Optional.ofNullable(getTarget()).map(Bookmark::toString).orElse(null);
+    }
+
+    @Override
+    public String getTargetMember() {
+        return getCommandDto().getMember().getLogicalMemberIdentifier();
+    }
+
+
+    public static class LocalMemberEvent extends PropertyDomainEvent<String> { }
+    @Property(
+            domainEvent = LocalMemberEvent.class
+    )
+    @PropertyLayout(
+            named = "Member"
+    )
+    public String getLocalMember() {
+        val targetMember = getTargetMember();
+        return targetMember.substring(targetMember.indexOf("#") + 1);
+    }
+
+
+    public static class LogicalMemberIdentifierDomainEvent extends PropertyDomainEvent<String> { }
+    @Property(
+            domainEvent = LogicalMemberIdentifierDomainEvent.class
+    )
+    @PropertyLayout(
+            hidden = Where.ALL_TABLES
+    )
+    public abstract String getLogicalMemberIdentifier();
+    public abstract void setLogicalMemberIdentifier(String logicalMemberIdentifier);
+
+
+    public static class CommandDtoDomainEvent extends PropertyDomainEvent<CommandDto> { }
+    @Property(
+            domainEvent = CommandDtoDomainEvent.class
+    )
+    @PropertyLayout(
+            multiLine = 9
+    )
+    public abstract CommandDto getCommandDto();
+    public abstract void setCommandDto(CommandDto commandDto);
+
+
+
+    public static class StartedAtDomainEvent extends PropertyDomainEvent<Timestamp> { }
+    @Property(
+            domainEvent = StartedAtDomainEvent.class
+    )
+    public abstract Timestamp getStartedAt();
+    public abstract void setStartedAt(Timestamp startedAt);
+
+
+    public static class CompletedAtDomainEvent extends PropertyDomainEvent<Timestamp> { }
+    @Property(
+            domainEvent = CompletedAtDomainEvent.class
+    )
+    public abstract Timestamp getCompletedAt();
+    public abstract void setCompletedAt(Timestamp completedAt);
+
+
+    public static class DurationDomainEvent extends PropertyDomainEvent<BigDecimal> { }
+    /**
+     * The number of seconds (to 3 decimal places) that this interaction lasted.
+     *
+     * <p>
+     * Populated only if it has {@link #getCompletedAt() completed}.
+     */
+    @javax.validation.constraints.Digits(integer=5, fraction=3)
+    @Property(
+            domainEvent = DurationDomainEvent.class
+    )
+    public BigDecimal getDuration() {
+        return BigDecimalUtils.durationBetween(getStartedAt(), getCompletedAt());
+    }
+
+
+    public static class IsCompleteDomainEvent extends PropertyDomainEvent<Boolean> { }
+    @Property(
+            domainEvent = IsCompleteDomainEvent.class
+    )
+    @PropertyLayout(
+            hidden = Where.OBJECT_FORMS
+    )
+    public boolean isComplete() {
+        return getCompletedAt() != null;
+    }
+
+
+
+    public static class ResultSummaryDomainEvent extends PropertyDomainEvent<String> { }
+    @Property(domainEvent = ResultSummaryDomainEvent.class)
+    @PropertyLayout(hidden = Where.OBJECT_FORMS, named = "Result")
+    public String getResultSummary() {
+        if(getCompletedAt() == null) {
+            return "";
+        }
+        if(!_Strings.isNullOrEmpty(getException())) {
+            return "EXCEPTION";
+        }
+        if(getResult() != null) {
+            return "OK";
+        } else {
+            return "OK (VOID)";
+        }
+    }
+
+
+    public static class ResultDomainEvent extends PropertyDomainEvent<String> { }
+    @Property(
+            domainEvent = ResultDomainEvent.class
+    )
+    @PropertyLayout(
+            hidden = Where.ALL_TABLES,
+            named = "Result Bookmark"
+    )
+    public abstract Bookmark getResult();
+    public abstract void setResult(Bookmark result);
+
+
+    public static class ExceptionDomainEvent extends PropertyDomainEvent<String> { }
+    /**
+     * Stack trace of any exception that might have occurred if this interaction/transaction aborted.
+     *
+     * <p>
+     * Not part of the applib API, because the default implementation is not persistent
+     * and so there's no object that can be accessed to be annotated.
+     */
+    @Property(
+            domainEvent = ExceptionDomainEvent.class
+    )
+    @PropertyLayout(
+            hidden = Where.ALL_TABLES,
+            multiLine = 5, named = "Exception (if any)"
+    )
+    public abstract String getException();
+    public abstract void setException(final String exception);
+
+    public void setException(final Throwable exception) {
+        setException(_Exceptions.asStacktrace(exception));
+    }
+
+
+    public static class IsCausedExceptionDomainEvent extends PropertyDomainEvent<Boolean> { }
+    @Property(
+            domainEvent = IsCausedExceptionDomainEvent.class
+    )
+    @PropertyLayout(
+            hidden = Where.OBJECT_FORMS
+    )
+    public boolean isCausedException() {
+        return getException() != null;
+    }
+
+
+    @Override
+    public String getPreValue() {
+        return null;
+    }
+
+    @Override
+    public String getPostValue() {
+        return null;
+    }
+
+
+    public void saveAnalysis(final String analysis) {
+        if (analysis == null) {
+            setReplayState(ReplayState.OK);
+        } else {
+            setReplayState(ReplayState.FAILED);
+            setReplayStateFailureReason(StringUtils.trimmed(analysis, 255));
+        }
+    }
+
+    @Override
+    public String toString() {
+        return toFriendlyString();
+    }
+
+    String toFriendlyString() {
+        return ObjectContracts
+                .toString("interactionId", Command::getInteractionId)
+                .thenToString("username", Command::getUsername)
+                .thenToString("timestamp", Command::getTimestamp)
+                .thenToString("target", Command::getTarget)
+                .thenToString("logicalMemberIdentifier", Command::getLogicalMemberIdentifier)
+                .thenToStringOmitIfAbsent("startedAt", Command::getStartedAt)
+                .thenToStringOmitIfAbsent("completedAt", Command::getCompletedAt)
+                .toString(this);
+    }
+
+    public CommandOutcomeHandler outcomeHandler() {
+        return new CommandOutcomeHandler() {
+            @Override
+            public Timestamp getStartedAt() {
+                return Command.this.getStartedAt();
+            }
+
+            @Override
+            public void setStartedAt(final Timestamp startedAt) {
+                Command.this.setStartedAt(startedAt);
+            }
+
+            @Override
+            public void setCompletedAt(final Timestamp completedAt) {
+                Command.this.setCompletedAt(completedAt);
+            }
+
+            @Override
+            public void setResult(final Result<Bookmark> resultBookmark) {
+                Command.this.setResult(resultBookmark.getValue().orElse(null));
+                Command.this.setException(resultBookmark.getFailure().orElse(null));
+            }
+
+        };
+    }
+
+    @Service
+    @javax.annotation.Priority(PriorityPrecedence.LATE - 10)
+    public static class TableColumnOrderDefault extends TableColumnOrderForCollectionTypeAbstract<Command> {
+
+        public TableColumnOrderDefault() { super(Command.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", "targetMember", "username", "complete", "resultSummary", "interactionIdStr"
+            );
+        }
+    }
+}
+
diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/command/CommandModel.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandModel.java
similarity index 71%
rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/command/CommandModel.java
rename to extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandModel.java
index daad926..de23ac8 100644
--- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/command/CommandModel.java
+++ b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandModel.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.commandlog.model.command;
+package org.apache.isis.extensions.commandlog.applib.dom;
 
 import java.sql.Timestamp;
 import java.util.UUID;
@@ -25,21 +25,12 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.CommandOutcomeHandler;
 import org.apache.isis.applib.services.commanddto.HasCommandDto;
 import org.apache.isis.applib.util.ObjectContracts;
-import org.apache.isis.extensions.commandlog.model.IsisModuleExtCommandLogApplib;
 
 public interface CommandModel
 extends
     HasCommandDto,
     Comparable<CommandModel> {
 
-    public static class TitleUiEvent extends IsisModuleExtCommandLogApplib.TitleUiEvent<CommandModel> { }
-    public static class IconUiEvent extends IsisModuleExtCommandLogApplib.IconUiEvent<CommandModel> { }
-    public static class CssClassUiEvent extends IsisModuleExtCommandLogApplib.CssClassUiEvent<CommandModel> { }
-    public static class LayoutUiEvent extends IsisModuleExtCommandLogApplib.LayoutUiEvent<CommandModel> { }
-
-    public static abstract class PropertyDomainEvent<T> extends IsisModuleExtCommandLogApplib.PropertyDomainEvent<CommandModel, T> { }
-    public static abstract class CollectionDomainEvent<T> extends IsisModuleExtCommandLogApplib.CollectionDomainEvent<CommandModel, T> { }
-    public static abstract class ActionDomainEvent extends IsisModuleExtCommandLogApplib.ActionDomainEvent<CommandModel> { }
 
 
     Bookmark getResult();
diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/command/CommandModelRepository.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandModelRepository.java
similarity index 98%
rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/command/CommandModelRepository.java
rename to extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandModelRepository.java
index 668e8a2..cc65c64 100644
--- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/command/CommandModelRepository.java
+++ b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandModelRepository.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.commandlog.model.command;
+package org.apache.isis.extensions.commandlog.applib.dom;
 
 import java.time.LocalDate;
 import java.util.List;
diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/command/ReplayState.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/ReplayState.java
similarity index 95%
rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/command/ReplayState.java
rename to extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/ReplayState.java
index 75d99e6..07d0e7e 100644
--- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/command/ReplayState.java
+++ b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/ReplayState.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.commandlog.model.command;
+package org.apache.isis.extensions.commandlog.applib.dom;
 
 public enum ReplayState {
     /**
diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/util/BigDecimalUtils.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java
similarity index 96%
rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/util/BigDecimalUtils.java
rename to extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java
index 7d27553..813227f 100644
--- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/util/BigDecimalUtils.java
+++ b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.commandlog.model.util;
+package org.apache.isis.extensions.commandlog.applib.util;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/util/StringUtils.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java
similarity index 95%
rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/util/StringUtils.java
rename to extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java
index 9e613c6..21cb229 100644
--- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/model/util/StringUtils.java
+++ b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.commandlog.model.util;
+package org.apache.isis.extensions.commandlog.applib.util;
 
 import lombok.experimental.UtilityClass;
 
diff --git a/extensions/core/command-log/applib/src/test/java/org/apache/isis/extensions/commandlog/model/util/StringUtils_trimmed_Test.java b/extensions/core/command-log/applib/src/test/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils_trimmed_Test.java
similarity index 91%
rename from extensions/core/command-log/applib/src/test/java/org/apache/isis/extensions/commandlog/model/util/StringUtils_trimmed_Test.java
rename to extensions/core/command-log/applib/src/test/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils_trimmed_Test.java
index 2c2d6b3..6931a82 100644
--- a/extensions/core/command-log/applib/src/test/java/org/apache/isis/extensions/commandlog/model/util/StringUtils_trimmed_Test.java
+++ b/extensions/core/command-log/applib/src/test/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils_trimmed_Test.java
@@ -16,13 +16,11 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.commandlog.model.util;
+package org.apache.isis.extensions.commandlog.applib.util;
 
 import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import org.apache.isis.extensions.commandlog.model.util.StringUtils;
-
 public class StringUtils_trimmed_Test {
 
     @Test
diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java
index d4044cb..cad004a 100644
--- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java
+++ b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java
@@ -25,8 +25,8 @@ import org.springframework.context.annotation.Import;
 import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdo;
 import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdoRepository;
 import org.apache.isis.extensions.commandlog.jdo.ui.CommandServiceMenu;
-import org.apache.isis.extensions.commandlog.model.IsisModuleExtCommandLogApplib;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.teardown.jdo.TeardownFixtureJdoAbstract;
 
diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java
index 08bbc73..3042c5d 100644
--- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java
+++ b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java
@@ -55,10 +55,10 @@ import org.apache.isis.commons.functional.Result;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.extensions.commandlog.jdo.IsisModuleExtCommandLogJdo;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.ReplayState;
-import org.apache.isis.extensions.commandlog.model.util.BigDecimalUtils;
-import org.apache.isis.extensions.commandlog.model.util.StringUtils;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.ReplayState;
+import org.apache.isis.extensions.commandlog.applib.util.BigDecimalUtils;
+import org.apache.isis.extensions.commandlog.applib.util.StringUtils;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.cmd.v2.MapDto;
 
diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java
index 4f476d2..ae47780 100644
--- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java
+++ b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java
@@ -45,9 +45,9 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.CommandModelRepository;
-import org.apache.isis.extensions.commandlog.model.command.ReplayState;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModelRepository;
+import org.apache.isis.extensions.commandlog.applib.dom.ReplayState;
 import org.apache.isis.persistence.jdo.applib.services.JdoSupportService;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.cmd.v2.CommandsDto;
diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo_childCommands.java b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo_childCommands.java
index 8636b34..d55341c 100644
--- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo_childCommands.java
+++ b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo_childCommands.java
@@ -23,7 +23,7 @@ import java.util.List;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.extensions.commandlog.jdo.IsisModuleExtCommandLogJdo;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 
 import lombok.RequiredArgsConstructor;
 
diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo_retry.java b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo_retry.java
index 4d1b9d1..b58cfa2 100644
--- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo_retry.java
+++ b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo_retry.java
@@ -31,7 +31,7 @@ import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.extensions.commandlog.jdo.IsisModuleExtCommandLogJdo;
-import org.apache.isis.extensions.commandlog.model.command.ReplayState;
+import org.apache.isis.extensions.commandlog.applib.dom.ReplayState;
 
 import lombok.RequiredArgsConstructor;
 
diff --git a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java b/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java
index 973060a..f1d7538 100644
--- a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java
+++ b/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java
@@ -54,10 +54,10 @@ import org.apache.isis.commons.functional.Result;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.extensions.commandlog.jpa.IsisModuleExtCommandLogJpa;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.ReplayState;
-import org.apache.isis.extensions.commandlog.model.util.BigDecimalUtils;
-import org.apache.isis.extensions.commandlog.model.util.StringUtils;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.ReplayState;
+import org.apache.isis.extensions.commandlog.applib.util.BigDecimalUtils;
+import org.apache.isis.extensions.commandlog.applib.util.StringUtils;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.cmd.v2.MapDto;
 
diff --git a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java b/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java
index 877aa49..8309ed3 100644
--- a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java
+++ b/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java
@@ -45,9 +45,9 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.CommandModelRepository;
-import org.apache.isis.extensions.commandlog.model.command.ReplayState;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModelRepository;
+import org.apache.isis.extensions.commandlog.applib.dom.ReplayState;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.cmd.v2.CommandsDto;
 import org.apache.isis.schema.cmd.v2.MapDto;
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java
index 3b78177..9fc6e4b 100644
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java
@@ -22,7 +22,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 import org.springframework.context.annotation.Profile;
 
-import org.apache.isis.extensions.commandlog.model.IsisModuleExtCommandLogApplib;
+import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib;
 import org.apache.isis.extensions.commandreplay.primary.config.PrimaryConfig;
 import org.apache.isis.extensions.commandreplay.primary.mixins.Object_openOnSecondary;
 import org.apache.isis.extensions.commandreplay.primary.restapi.CommandRetrievalService;
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java
index dd0bcef..1f2de45 100644
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java
@@ -28,8 +28,8 @@ import javax.inject.Named;
 import org.apache.isis.applib.annotation.*;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.exceptions.RecoverableException;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.CommandModelRepository;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModelRepository;
 import org.apache.isis.extensions.commandreplay.primary.IsisModuleExtCommandReplayPrimary;
 
 import lombok.Getter;
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java
index 7365f2f..4e433d2 100644
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java
@@ -29,7 +29,7 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.commanddto.conmap.UserDataKeys;
 import org.apache.isis.applib.services.commanddto.processor.spi.CommandDtoProcessorService;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 
 import lombok.val;
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java
index fb56ee0..b9b37ca 100644
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java
@@ -40,8 +40,8 @@ import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceFo
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.value.Clob;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.CommandModelRepository;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModelRepository;
 import org.apache.isis.extensions.commandreplay.primary.IsisModuleExtCommandReplayPrimary;
 import org.apache.isis.extensions.commandreplay.primary.restapi.CommandRetrievalService;
 import org.apache.isis.schema.cmd.v2.CommandDto;
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java
index f8e5245..6033409 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java
@@ -38,7 +38,7 @@ import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
 import org.springframework.scheduling.quartz.SpringBeanJobFactory;
 
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.extensions.commandlog.model.IsisModuleExtCommandLogApplib;
+import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib;
 import org.apache.isis.extensions.commandreplay.secondary.analyser.CommandReplayAnalyserException;
 import org.apache.isis.extensions.commandreplay.secondary.analyser.CommandReplayAnalyserResult;
 import org.apache.isis.extensions.commandreplay.secondary.analysis.CommandReplayAnalysisService;
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java
index 4264739..b86172d 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.extensions.commandreplay.secondary.analyser;
 
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 
 /**
  * @since 2.0 {@index}
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java
index 1bbd919..abb0252 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java
@@ -30,7 +30,7 @@ import org.apache.isis.applib.services.commanddto.conmap.UserDataKeys;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 import org.apache.isis.schema.common.v2.InteractionType;
 
 import lombok.RequiredArgsConstructor;
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java
index c5380e3..5f7695f 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.services.commanddto.conmap.UserDataKeys;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 import org.apache.isis.schema.common.v2.InteractionType;
 
 import lombok.RequiredArgsConstructor;
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java
index 5a08e07..c2fe4e3 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java
@@ -26,7 +26,7 @@ import javax.inject.Named;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 import org.apache.isis.extensions.commandreplay.secondary.analyser.CommandReplayAnalyser;
 
 import lombok.extern.log4j.Log4j2;
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java
index 7b1ec09..472d291 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java
@@ -34,7 +34,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.jaxb.JaxbService.Simple;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
 import org.apache.isis.extensions.commandreplay.secondary.SecondaryStatus;
 import org.apache.isis.extensions.commandreplay.secondary.StatusException;
 import org.apache.isis.extensions.commandreplay.secondary.config.SecondaryConfig;
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java
index 2d36807..c4b7c1f 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java
@@ -28,9 +28,9 @@ import javax.inject.Inject;
 
 import org.apache.isis.applib.services.command.CommandExecutorService;
 import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.CommandModelRepository;
-import org.apache.isis.extensions.commandlog.model.command.ReplayState;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModelRepository;
+import org.apache.isis.extensions.commandlog.applib.dom.ReplayState;
 import org.apache.isis.extensions.commandreplay.secondary.SecondaryStatus;
 import org.apache.isis.extensions.commandreplay.secondary.StatusException;
 import org.apache.isis.extensions.commandreplay.secondary.analysis.CommandReplayAnalysisService;
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_replayQueue.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_replayQueue.java
index 81e34a1..b148baf 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_replayQueue.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_replayQueue.java
@@ -24,8 +24,8 @@ import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.CommandModelRepository;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModelRepository;
 import org.apache.isis.extensions.commandreplay.secondary.IsisModuleExtCommandReplaySecondary;
 import org.apache.isis.extensions.commandreplay.secondary.config.SecondaryConfig;
 
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandModel_exclude.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandModel_exclude.java
index deadccc..ec04041 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandModel_exclude.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandModel_exclude.java
@@ -25,9 +25,9 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.extensions.commandlog.model.IsisModuleExtCommandLogApplib;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.ReplayState;
+import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.ReplayState;
 import org.apache.isis.extensions.commandreplay.secondary.config.SecondaryConfig;
 
 import lombok.RequiredArgsConstructor;
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
index 6c3bf0a..f80aa46 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
@@ -28,8 +28,8 @@ import org.apache.isis.applib.annotation.*;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.value.Clob;
-import org.apache.isis.extensions.commandlog.model.command.CommandModel;
-import org.apache.isis.extensions.commandlog.model.command.CommandModelRepository;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModel;
+import org.apache.isis.extensions.commandlog.applib.dom.CommandModelRepository;
 import org.apache.isis.extensions.commandreplay.secondary.IsisModuleExtCommandReplaySecondary;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.cmd.v2.CommandsDto;