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 2020/09/22 23:29:23 UTC

[isis] branch ISIS-2222 updated (821a1fc -> 66a478c)

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

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


    from 821a1fc   ISIS-2222: improving command docs for demo for action invocation
     add fc70dbf  ISIS-2437: model for LOCAL vs EXTERNAL dependencies
     add 5747e18  ISIS-2341: CI: disable gradle build (until ISIS-2437 is resolved)
     add b9184a2  ISIS-2341: CI: disable gradle build (fix syntax)
     add 0704ba6  Bump annotations from 2.0.1 to 3.0.1u2
     add 846b6c5  Merge pull request #204 from apache/dependabot/maven/com.google.code.findbugs-annotations-3.0.1u2
     add 21822cc  Bump asciidoctorj from 2.1.0 to 2.4.1
     add 91fb9ef  Merge pull request #205 from apache/dependabot/maven/org.asciidoctor-asciidoctorj-2.4.1
     add 53fdaa7  Bump pdfbox from 2.0.15 to 2.0.21
     add 7fd6170  Merge pull request #206 from apache/dependabot/maven/org.apache.pdfbox-pdfbox-2.0.21
     add 9868305  ISIS-2437: Tooling: some housekeeping
     add df53908  ISIS-2437: Tooling: add new CLI project (just stubs)
     add fe92b1c  ISIS-2222: renaming isis-extensions-command-log-impl -> ...-jdo
     add fc59bed  ISIS-2437: Commons: add _Yaml for YAML parsing
     add e323500  Bump surefire.version from 2.22.0 to 2.22.2
     add 2dd471b  Merge pull request #209 from apache/dependabot/maven/surefire.version-2.22.2
     add de545cd  ISIS-2437: fix test resources not found
     add 6aeb07d  Bump select2 from 4.0.10 to 4.0.13
     add 9b57feb  Merge pull request #207 from apache/dependabot/maven/org.webjars-select2-4.0.13
     add 0298450  ISIS-2437: Tooling: adds ProjectDoc model generator (CLI)
     add 39d55e5  ISIS-2437: Tooling: disable picocli annotation processing
     add c386d5b  ISIS-2437: update System Overview (adoc) using new tooling cli
     new 3fdb851  ISIS-2222: adds property command to demo
     new 66a478c  ISIS-2222: moves CommandService to runtimeservices, makes internal

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


Summary of changes:
 .github/workflows/ci-build-core-no-push-gradle.yml |  16 +-
 .github/workflows/ci-build-core-no-push-maven.yml  |   6 +-
 .../system/modules/ROOT/pages/about.adoc           |  41 ++--
 .../modules/btb/pages/headless-access.adoc         |  33 ++-
 .../AbstractIsisSessionTemplate.adoc               |  55 -----
 .../BackgroundCommandExecution.adoc                |  48 -----
 .../apache-isis-vs-cqrs-and-event-sourcing.adoc    |   2 +-
 .../modules/fun/pages/overview/identifiers.adoc    |   2 +-
 .../applib-ant/examples/annotation/Action.java     |   2 +-
 .../modules/applib-ant/pages/Property/command.adoc |   1 +
 .../command/spi/CommandServiceListener.java        |   4 +-
 .../modules/applib-svc/pages/AuditerService.adoc   |   4 +-
 .../modules/applib-svc/pages/BookmarkService.adoc  |   2 +-
 .../pages/CommandDtoProcessorService.adoc          |  22 +-
 .../applib-svc/pages/ContentMappingService.adoc    |  13 +-
 .../modules/applib-svc/pages/PublisherService.adoc |   4 +-
 .../main/adoc/modules/applib-svc/pages/about.adoc  |   2 +-
 .../partials/_application-layer-spi.adoc           |   2 +-
 .../modules/applib-svc/partials/module-nav.adoc    |   2 +-
 .../org/apache/isis/applib/IsisModuleApplib.java   |   3 +-
 .../org/apache/isis/applib/annotation/Action.java  |   4 +-
 .../isis/applib/services/command/Command.java      |  22 ++
 ...andService.java => CommandServiceInternal.java} |   9 +-
 .../command/spi/CommandServiceListener.java        |   5 +-
 commons/pom.xml                                    |   5 +
 .../isis/commons/internal/resources/_Yaml.java     |  72 +++++++
 .../internal/resources/JsonYamlReaderTest.java     |  73 +++++++
 .../commons/internal/resources/ResourcesTest.java  |   2 -
 .../isis/commons/internal/resources/customer.json  |   5 +
 .../isis/commons/internal/resources/customer.yml   |   3 +
 .../modules/config/pages/sections/isis.applib.adoc |   4 +-
 .../isis.persistence.jdo-datanucleus.impl.adoc     | 178 ----------------
 .../config/pages/sections/isis.value-types.adoc    |   9 -
 .../modules/config/pages/sections/resteasy.adoc    |  12 +-
 .../apache/isis/core/config/IsisConfiguration.java |  19 +-
 ...ctionInvocationFacetForDomainEventAbstract.java |   9 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java |  10 +-
 core/pom.xml                                       |   6 +-
 .../pages/CommandServiceInternal.adoc              |   2 +-
 .../IsisModuleCoreRuntimeServices.java             |   2 +
 examples/demo/domain/pom.xml                       |   2 +-
 .../demoapp/dom/annotDomain/Action/ActionMenu.java |  19 +-
 .../ActionCommandDisabledMetaAnnotation.java       |   3 +-
 .../ActionCommandEnabledMetaAnnotation.java        |   3 +-
 .../command/ActionCommandJdo-description.adoc      |  13 +-
 .../Action/command/ActionCommandJdo.layout.xml     |   6 +-
 .../dom/annotDomain/Collection/CollectionMenu.java |   2 +
 .../annotDomain/DomainObject/DomainObjectMenu.java |   4 +
 .../dom/annotDomain/Property/PropertyMenu.java     |  22 +-
 .../PropertyCommandDisabledMetaAnnotation.java}    |  10 +-
 .../PropertyCommandEnabledMetaAnnotation.java}     |  10 +-
 .../command/PropertyCommandJdo-description.adoc}   |  72 ++-----
 .../Property/command/PropertyCommandJdo.java       | 117 ++++++++++
 .../command/PropertyCommandJdo.layout.xml}         |   6 +-
 .../command/PropertyCommandJdoEntities.java        |  34 +++
 .../command/PropertyCommandJdoSeedService.java}    |   8 +-
 .../PropertyDomainEventControlService.java         |   7 +-
 .../PropertyPublishingJdoSeedService.java          |   9 +-
 .../PropertyLayout/PropertyLayoutMenu.java         |  10 +-
 .../navigable/FileTreeNodeService.java             |   8 +-
 .../src/main/java/demoapp/dom/error/ErrorMenu.java |   4 +-
 .../demoapp/dom/events/DemoEventSubscriber.java    |   6 +-
 .../demoapp/dom/events/EventLogRepository.java     |   9 +-
 .../java/demoapp/dom/events/EventsDemoMenu.java    |   4 +-
 .../apptenancy/entities/TenantedJdoEntities.java   |   7 +-
 .../entities/seed/TenantedJdoSeedService.java      |   8 +-
 .../src/main/java/demoapp/dom/jee/JeeMenu.java     |   4 +-
 .../src/main/java/demoapp/dom/menubars.layout.xml  |   1 +
 .../main/java/demoapp/dom/mixins/MixinMenu.java    |   4 +-
 .../demoapp/dom/mixins/legacy/MixinLegacyMenu.java |   4 +-
 .../WrapperFactoryJdoSeedService.java              |   7 +-
 .../src/main/java/demoapp/dom/tabs/TabMenu.java    |   7 +-
 .../main/java/demoapp/dom/tooltip/TooltipMenu.java |   4 +-
 .../types/isis/blobs/jdo/IsisBlobJdoEntities.java  |   7 +-
 .../isis/blobs/jdo/IsisBlobJdoSeedService.java     |   7 +-
 .../types/isis/clobs/jdo/IsisClobJdoEntities.java  |   7 +-
 .../isis/clobs/jdo/IsisClobJdoSeedService.java     |   7 +-
 .../isis/images/jdo/IsisImageJdoEntities.java      |   8 +-
 .../isis/images/jdo/IsisImageJdoSeedService.java   |   7 +-
 .../jdo/IsisLocalResourcePathJdoEntities.java      |   7 +-
 .../jdo/IsisLocalResourcePathJdoSeedService.java   |   7 +-
 .../isis/markups/jdo/IsisMarkupJdoEntities.java    |   7 +-
 .../isis/markups/jdo/IsisMarkupJdoSeedService.java |   6 +-
 .../command => types/isisschema/chg}/.gitkeep      |   0
 .../xxxUiEvent => types/isisschema/cmd}/.gitkeep   |   0
 .../xxxUiEvent => types/isisschema/ixn}/.gitkeep   |   0
 .../demo/domain/src/main/resources/application.yml |   3 +
 .../java/demoapp/web}/linebreaker/LineBreaker.java |  12 +-
 .../adoc/modules/command-log/pages/about.adoc      |   6 +-
 extensions/core/command-log/impl/pom.xml           |   8 +-
 extensions/core/command-replay/primary/pom.xml     |   2 +-
 extensions/core/command-replay/secondary/pom.xml   |   4 +-
 extensions/core/quartz/impl/pom.xml                |   2 +-
 extensions/pom.xml                                 |   2 +-
 .../adoc/modules/audit-trail/pages/about.adoc      |   2 +-
 isis-parent/pom.xml                                |   2 +-
 isis-tooling.yml                                   |  30 +++
 .../persistence/IsisPersistenceSessionJdoBase.java |   7 +-
 .../persistence/PersistenceSession5.java           |   2 +-
 security/adoc/modules/ROOT/pages/about.adoc        |   2 +-
 tooling/cli/README.adoc                            |  47 +++++
 {valuetypes/asciidoc => tooling/cli}/pom.xml       |  63 ++++--
 .../main/java/org/apache/isis/tooling/cli/Cli.java | 126 +++++++++++
 .../isis/tooling/cli/CliCommandAbstract.java}      |  19 +-
 .../org/apache/isis/tooling/cli/CliConfig.java     |  56 +++++
 .../isis/tooling/cli/projdoc/ProjectDocModel.java  | 235 +++++++++++++++++++++
 .../org/apache/isis/tooling/cli/CliConfigTest.java |  59 ++++++
 .../org/apache/isis/tooling/cli/isis-tooling.yml   |  30 +++
 tooling/pom.xml                                    |  58 +++--
 .../tooling/projectmodel/ArtifactCoordinates.java  |  20 +-
 .../projectmodel/ArtifactShortNameFactory.java     |   2 +-
 .../isis/tooling/projectmodel/Dependency.java      |  10 +
 .../projectmodel/ProjectNodeFactory_maven.java     |  55 ++++-
 .../gradle/GradleDependenciesFactory.java          |   6 +-
 .../gradle/GradleDependenciesWriter.java           |   7 +-
 valuetypes/asciidoc/pom.xml                        |   2 +-
 .../ROOT/partials/security/user-registration.adoc  |   2 +-
 117 files changed, 1446 insertions(+), 654 deletions(-)
 delete mode 100644 api/adoc/userguide/modules/btb/pages/headless-access/AbstractIsisSessionTemplate.adoc
 delete mode 100644 api/adoc/userguide/modules/btb/pages/headless-access/BackgroundCommandExecution.adoc
 rename api/applib/src/main/java/org/apache/isis/applib/services/command/{CommandService.java => CommandServiceInternal.java} (93%)
 create mode 100644 commons/src/main/java/org/apache/isis/commons/internal/resources/_Yaml.java
 create mode 100644 commons/src/test/java/org/apache/isis/commons/internal/resources/JsonYamlReaderTest.java
 create mode 100644 commons/src/test/resources/org/apache/isis/commons/internal/resources/customer.json
 create mode 100644 commons/src/test/resources/org/apache/isis/commons/internal/resources/customer.yml
 rename api/applib/src/main/adoc/modules/applib-svc/pages/CommandService.adoc => core/runtimeservices/src/main/adoc/modules/runtime-services/pages/CommandServiceInternal.adoc (78%)
 copy examples/demo/domain/src/main/java/demoapp/dom/annotDomain/{Action/command/ActionCommandDisabledMetaAnnotation.java => Property/command/PropertyCommandDisabledMetaAnnotation.java} (50%)
 copy examples/demo/domain/src/main/java/demoapp/dom/annotDomain/{Action/command/ActionCommandEnabledMetaAnnotation.java => Property/command/PropertyCommandEnabledMetaAnnotation.java} (54%)
 copy examples/demo/domain/src/main/java/demoapp/dom/annotDomain/{Action/command/ActionCommandJdo-description.adoc => Property/command/PropertyCommandJdo-description.adoc} (68%)
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo.java
 copy examples/demo/domain/src/main/java/demoapp/dom/annotDomain/{Action/command/ActionCommandJdo.layout.xml => Property/command/PropertyCommandJdo.layout.xml} (96%)
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdoEntities.java
 copy examples/demo/domain/src/main/java/demoapp/dom/{services/wrapperFactory/WrapperFactoryJdoSeedService.java => annotDomain/Property/command/PropertyCommandJdoSeedService.java} (80%)
 rename examples/demo/domain/src/main/java/demoapp/dom/{annotDomain/Property/command => types/isisschema/chg}/.gitkeep (100%)
 copy examples/demo/domain/src/main/java/demoapp/dom/{annotLayout/DomainObjectLayout/xxxUiEvent => types/isisschema/cmd}/.gitkeep (100%)
 copy examples/demo/domain/src/main/java/demoapp/dom/{annotLayout/DomainObjectLayout/xxxUiEvent => types/isisschema/ixn}/.gitkeep (100%)
 rename examples/demo/{domain/src/main/java/demoapp/dom => web/src/main/java/demoapp/web}/linebreaker/LineBreaker.java (82%)
 create mode 100644 isis-tooling.yml
 create mode 100644 tooling/cli/README.adoc
 copy {valuetypes/asciidoc => tooling/cli}/pom.xml (54%)
 create mode 100644 tooling/cli/src/main/java/org/apache/isis/tooling/cli/Cli.java
 copy tooling/{projectmodel/src/main/java/org/apache/isis/tooling/projectmodel/ArtifactShortNameFactory.java => cli/src/main/java/org/apache/isis/tooling/cli/CliCommandAbstract.java} (66%)
 create mode 100644 tooling/cli/src/main/java/org/apache/isis/tooling/cli/CliConfig.java
 create mode 100644 tooling/cli/src/main/java/org/apache/isis/tooling/cli/projdoc/ProjectDocModel.java
 create mode 100644 tooling/cli/src/test/java/org/apache/isis/tooling/cli/CliConfigTest.java
 create mode 100644 tooling/cli/src/test/resources/org/apache/isis/tooling/cli/isis-tooling.yml


[isis] 01/02: ISIS-2222: adds property command to demo

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

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

commit 3fdb8511dcf57cf5482c7ef3255dd6cbe7545efc
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Sep 22 23:11:00 2020 +0100

    ISIS-2222: adds property command to demo
    
    and updates some docs on headless access.
---
 .../modules/btb/pages/headless-access.adoc         |  33 ++++--
 .../AbstractIsisSessionTemplate.adoc               |  55 ----------
 .../BackgroundCommandExecution.adoc                |  48 ---------
 .../demoapp/dom/annotDomain/Action/ActionMenu.java |  19 ++--
 .../ActionCommandDisabledMetaAnnotation.java       |   3 +-
 .../ActionCommandEnabledMetaAnnotation.java        |   3 +-
 .../command/ActionCommandJdo-description.adoc      |  13 +--
 .../Action/command/ActionCommandJdo.layout.xml     |   6 +-
 .../dom/annotDomain/Collection/CollectionMenu.java |   2 +
 .../annotDomain/DomainObject/DomainObjectMenu.java |   4 +
 .../dom/annotDomain/Property/PropertyMenu.java     |  22 ++--
 .../PropertyCommandDisabledMetaAnnotation.java}    |  10 +-
 .../PropertyCommandEnabledMetaAnnotation.java}     |  10 +-
 .../command/PropertyCommandJdo-description.adoc}   |  72 +++----------
 .../Property/command/PropertyCommandJdo.java       | 117 +++++++++++++++++++++
 .../command/PropertyCommandJdo.layout.xml}         |   6 +-
 .../command/PropertyCommandJdoEntities.java        |  34 ++++++
 .../command/PropertyCommandJdoSeedService.java}    |   8 +-
 .../PropertyDomainEventControlService.java         |   7 +-
 .../PropertyPublishingJdoSeedService.java          |   9 +-
 .../PropertyLayout/PropertyLayoutMenu.java         |  10 +-
 .../navigable/FileTreeNodeService.java             |   8 +-
 .../src/main/java/demoapp/dom/error/ErrorMenu.java |   4 +-
 .../demoapp/dom/events/DemoEventSubscriber.java    |   6 +-
 .../demoapp/dom/events/EventLogRepository.java     |   9 +-
 .../java/demoapp/dom/events/EventsDemoMenu.java    |   4 +-
 .../apptenancy/entities/TenantedJdoEntities.java   |   7 +-
 .../entities/seed/TenantedJdoSeedService.java      |   8 +-
 .../src/main/java/demoapp/dom/jee/JeeMenu.java     |   4 +-
 .../src/main/java/demoapp/dom/menubars.layout.xml  |   1 +
 .../main/java/demoapp/dom/mixins/MixinMenu.java    |   4 +-
 .../demoapp/dom/mixins/legacy/MixinLegacyMenu.java |   4 +-
 .../WrapperFactoryJdoSeedService.java              |   7 +-
 .../src/main/java/demoapp/dom/tabs/TabMenu.java    |   7 +-
 .../main/java/demoapp/dom/tooltip/TooltipMenu.java |   4 +-
 .../types/isis/blobs/jdo/IsisBlobJdoEntities.java  |   7 +-
 .../isis/blobs/jdo/IsisBlobJdoSeedService.java     |   7 +-
 .../types/isis/clobs/jdo/IsisClobJdoEntities.java  |   7 +-
 .../isis/clobs/jdo/IsisClobJdoSeedService.java     |   7 +-
 .../isis/images/jdo/IsisImageJdoEntities.java      |   8 +-
 .../isis/images/jdo/IsisImageJdoSeedService.java   |   7 +-
 .../jdo/IsisLocalResourcePathJdoEntities.java      |   7 +-
 .../jdo/IsisLocalResourcePathJdoSeedService.java   |   7 +-
 .../isis/markups/jdo/IsisMarkupJdoEntities.java    |   7 +-
 .../isis/markups/jdo/IsisMarkupJdoSeedService.java |   6 +-
 .../command => types/isisschema/chg}/.gitkeep      |   0
 .../command => types/isisschema/cmd}/.gitkeep      |   0
 .../command => types/isisschema/ixn}/.gitkeep      |   0
 .../demo/domain/src/main/resources/application.yml |   3 +
 .../java/demoapp/web}/linebreaker/LineBreaker.java |  12 ++-
 extensions/core/command-replay/secondary/pom.xml   |   2 +
 .../ROOT/partials/security/user-registration.adoc  |   2 +-
 52 files changed, 360 insertions(+), 297 deletions(-)

diff --git a/api/adoc/userguide/modules/btb/pages/headless-access.adoc b/api/adoc/userguide/modules/btb/pages/headless-access.adoc
index 05b31f2..37b1586 100644
--- a/api/adoc/userguide/modules/btb/pages/headless-access.adoc
+++ b/api/adoc/userguide/modules/btb/pages/headless-access.adoc
@@ -6,19 +6,38 @@
 
 This section tackles the topic of enabling access to an Apache Isis application directly, or at least, not through either the xref:vw:ROOT:about.adoc[Wicket] or xref:vro:ROOT:about.adoc[Restful] viewers.
 
-There are several main use-cases:
-
-* enabling background execution, eg of a thread managed by Quartz scheduler and running within the webapp
+There are a number of use-cases:
 
 * integration from other systems, eg for a subscriber on a pub/sub mechanism such as Camel, pushing changes through an Apache Isis domain model.
 
 * leveraging an Apache Isis application within a batch process
 
-Note that the calling thread runs in the same process space as the Apache Isis domain object model (must be physically linked to the JAR files containing the domain classes).  For use cases where the calling thread runs in some other process space (eg migrating data from a legacy system), then the xref:vro:ROOT:about.adoc[Restful Objects viewer] is usually the way to go.
+Note that the calling thread runs in the same process space as the Apache Isis domain object model (must be physically linked to the JAR files containing the domain classes).
+For use cases where the calling thread runs in some other process space (eg migrating data from a legacy system), then the xref:vro:ROOT:about.adoc[Restful Objects viewer] is usually the way to go.
+
+The key to headless access is the `IsisInteractionFactory` service, a singleton managed by Spring.
+Use it as follows:
+
+[source,java]
+----
+@Service
+@lombok.RequiredArgsConstructor(onConstructor_ = { @Inject })
+private static class HeadlessAccess {
 
-The API described in this chapter is reasonably low-level, allowing code to interact very directly with the Apache Isis metamodel and runtime.  Such callers should be considered trusted: they do not (by default) honour any business rules eg implicit in the Isis annotations or hide/disable/validate methods.  However the xref:refguide:applib-svc:WrapperFactory.adoc[`WrapperFactory`] service could be used to enforce such business rules if required.
+    final IsisInteractionFactory isisInteractionFactory;
+    final TransactionService transactionService;
 
+    @Override
+    public R call(AuthenticationSession session, Supplier<R> supplier) {
+        return isisInteractionFactory.callAuthenticated(session, () -> {
+            return transactionService.executeWithinTransaction(() -> {
+                    return supplier.get();
+                });
+        });
+    }
+}
+----
 
+The API described here is reasonably low-level, allowing code to interact very directly with the Apache Isis metamodel and runtime.
+Such callers should be considered trusted: they do not (by default) honour any business rules eg implicit in the Isis annotations or hide/disable/validate methods.
 
-include::headless-access/AbstractIsisSessionTemplate.adoc[leveloffset=+1]
-//include::headless-access/BackgroundCommandExecution.adoc[leveloffset=+1]
diff --git a/api/adoc/userguide/modules/btb/pages/headless-access/AbstractIsisSessionTemplate.adoc b/api/adoc/userguide/modules/btb/pages/headless-access/AbstractIsisSessionTemplate.adoc
deleted file mode 100644
index 57d443b..0000000
--- a/api/adoc/userguide/modules/btb/pages/headless-access/AbstractIsisSessionTemplate.adoc
+++ /dev/null
@@ -1,55 +0,0 @@
-[[AbstractIsisSessionTemplate]]
-= AbstractIsisSessionTemplate
-
-: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 [...]
-:page-partial:
-
-
-The `AbstractIsisSessionTemplate` class (whose name is inspired by the Spring framework's naming convention for similar classes that query http://docs.spring.io/spring/docs/2.5.x/reference/jdbc.html#jdbc-JdbcTemplate[JDBC], http://docs.spring.io/spring/docs/2.5.x/reference/jms.html#jms-jmstemplate[JMS], http://docs.spring.io/spring/docs/2.5.x/reference/orm.html#orm-jpa-template[JPA] etc.) provides the mechanism to open up a 'session' within the Apache Isis framework, in order to resolve  [...]
-
-The class itself is intended to be subclassed:
-
-[source,java]
-.AbstractIsisSessionTemplate.java
-----
-public abstract class AbstractIsisSessionTemplate {
-
-    public void execute(                                              // <.>
-            final AuthenticationSession authSession,
-            final Object context) {
-        // ...
-    }
-
-    protected void doExecute(final Object context) {                  // <.>
-        transactionService.executeWithinTransaction(()->{
-            doExecuteWithTransaction(context);
-        });
-    }
-
-    protected void doExecuteWithTransaction(final Object context) {}  // <.>
-}
-----
-<.> `execute(...)` sets up the `IsisSession` and delegates to ...
-<.> `doExecute(...)`, a hook method for subclasses to implement.
-The passed object represents passes a context from the caller (eg the scheduler, cron job, JMS etc) that instantiated and executed the class.
-<.> Alternatively, override the `doExecuteWithTransaction()`.
-
-In fact, the initial `execute(...)` method implementation is simply:
-
-[source,java]
-----
-public void execute(final AuthenticationSession authSession, final Object context) {
-    isisSessionFactory.runAuthenticated(authSession, ()->{
-        serviceInjector.injectServicesInto(this);
-        doExecute(context);
-    });
-}
-----
-
-So, as an alternative to using `AbstractIsisSessionTemplate`, you could instead just use `IsisSessionFactory`.
-
-If you _do_ use `AbstractIsisSessionTemplate`, note that it automatically inject any domain services into itself.
-Thus, it is relatively easy for the subclass to "reach into" the domain, through injected services.
-
-
-
diff --git a/api/adoc/userguide/modules/btb/pages/headless-access/BackgroundCommandExecution.adoc b/api/adoc/userguide/modules/btb/pages/headless-access/BackgroundCommandExecution.adoc
deleted file mode 100644
index d683232..0000000
--- a/api/adoc/userguide/modules/btb/pages/headless-access/BackgroundCommandExecution.adoc
+++ /dev/null
@@ -1,48 +0,0 @@
-= BackgroundCommandExecution
-
-: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 [...]
-:page-partial:
-
-
-WARNING: TODO: v2 - this functionality has been temporarily removed, will be reinstated for v2.0
-
-
-The `BackgroundCommandExecution` class (a subclass of xref:userguide:btb:about.adoc#BackgroundCommandService[`BackgroundCommandService`].
-
-Its signature is:
-
-[source,java]
-----
-public abstract class BackgroundCommandExecution extends AbstractIsisSessionTemplate {
-    protected void doExecute(Object context) { /* ... */ }
-    protected abstract List<? extends Command> findBackgroundCommandsToExecute(); // <1>
-}
-----
-<1> `findBackgroundCommandsToExecute()` is a mandatory hook method for subclasses to implement.
-
-This allows for different implementations of the `CommandService` and `BackgroundCommandService` to persist to wherever.
-
-The diagram below (http://yuml.me/edit/363b335f[yuml.me/363b335f]) shows the dependencies between these various classes:
-
-.Inheritance Hierarchy for `BackgroundCommandExecution`
-image::headless-access/BackgroundCommandExecution.png[width="400px",link="{imagesdir}/headless-access/BackgroundCommandExecution.png"]
-
-
-
-
-
-
-
-== Background Execution
-
-The `BackgroundCommandExecutionFromBackgroundCommandServiceJdo` is a concrete subclass of `BackgroundCommandExecution` (see the xref:refguide:applib-svc:BackgroundService.adoc[`BackgroundCommandService`]), the intended use being for the class to be instantiated regularly (eg every 10 seconds) by a scheduler such as http://quartz-scheduler.org[Quartz]) to poll for ``Command``s to be executed, and then execute them.
-
-This implementation queries for ``Command``s persisted by thexref:extensions:command-log:about.adoc[Command Log] extension's implementations of xref:refguide:applib-svc:CommandService.adoc[`CommandService`].
-
-//and xref:refguide:applib-svc:BackgroundCommandService.adoc[`BackgroundCommandService`] using the `BackgroundCommandServiceJdoRepository`.
-
-The diagram below (link:http://yuml.me/edit/25343da1[yuml.me/25343da1]) shows the inheritance hierarchy for this class:
-
-.Inheritance Hierarchy for `BackgroundCommandExecutionFromBackgroundCommandServiceJdo`
-image::headless-access/BackgroundCommandExecutionFromBackgroundCommandServiceJdo.png[width="500px",link="{imagesdir}/headless-access/BackgroundCommandExecutionFromBackgroundCommandServiceJdo.png"]
-
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
index 14c7cde..616d770 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
@@ -18,9 +18,6 @@
  */
 package demoapp.dom.annotDomain.Action;
 
-import java.util.List;
-import java.util.stream.Collectors;
-
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Action;
@@ -29,6 +26,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -43,13 +41,16 @@ import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdo;
 import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdoEntities;
 import demoapp.dom.annotDomain.Action.typeOf.ActionTypeOfVm;
 import demoapp.dom.annotDomain.Action.typeOf.child.ActionTypeOfChildVm;
-import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdo;
-import demoapp.dom.types.Samples;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.ActionMenu")
 @Log4j2
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class ActionMenu {
 
+    final ActionCommandJdoEntities actionCommandJdoEntities;
+    final ActionPublishingJdoEntities actionPublishingJdoEntities;
+    final NameSamples samples;
+
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-ring", describedAs = "Semantic relationship between actions and other properties or collections")
     public ActionAssociateWithVm associateWith(){
@@ -106,13 +107,5 @@ public class ActionMenu {
         return typeOfVm;
     }
 
-    @Inject
-    ActionPublishingJdoEntities actionPublishingJdoEntities;
-
-    @Inject
-    ActionCommandJdoEntities actionCommandJdoEntities;
-
-    @Inject
-    NameSamples samples;
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java
index fd271ba..6b89389 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java
@@ -7,9 +7,10 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.CommandReification;
 
 //tag::class[]
-@Action()                                       // <.>
+@Action(command = CommandReification.DISABLED)  // <.>
 @Inherited
 @Target({
         ElementType.TYPE, ElementType.METHOD    // <.>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java
index 62e0d52..b62542f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java
@@ -7,10 +7,11 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.CommandReification;
 import org.apache.isis.applib.annotation.Publishing;
 
 //tag::class[]
-@Action(publishing = Publishing.ENABLED)        // <.>
+@Action(command = CommandReification.ENABLED)   // <.>
 @Inherited
 @Target({
         ElementType.TYPE, ElementType.METHOD    // <.>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc
index e3f3ad6..cfbff5f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc
@@ -1,17 +1,18 @@
-The `command` semantic is used to allow or suppress the reification of an action invocation or property edit into a `Command`.
+The `command` semantic is used to allow or suppress the reification of an action invocation into a `Command`.
 
 When allowed (the default), then the `Command` is sent to registered implementation(s) of https://isis.apache.org/refguide/2.0.0-M3/applib-svc/CommandServiceListener.html#section-top[`CommandServiceListener`] SPI, _after_ the interaction has completed.
 One use case is to replicate and replay commands to a secondary system, for example for regression testing.
-For more on this, see "Command Replay" section below.
+For more on this, see the "Command Replay" section below.
 
-Commands are also used under the covers to allow actions/edits to be called asynchronously using the link:https://isis.apache.org/refguide/2.0.0-M3/applib-svc/WrapperFactory.html[`WrapperFactory`].
+Commands are also used under the covers to allow actions invocations to be made asynchronously using the link:https://isis.apache.org/refguide/2.0.0-M3/applib-svc/WrapperFactory.html[`WrapperFactory`].
+This can be useful for long-running actions.
 
 [NOTE]
 ====
-The list of persisted ``Command``s can be viewed in a collection at the bottom of the page.
+The list of persisted ``Command``s can be viewed in a collection on the left bottom of this page.
 ``Command``s are persisted after the page rendering phase, so to view a just-persisted command, refresh the page.
 
-(If running in prototype mode), the list of persisted ``Command``s can also be truncated from the activity menu.
+If running in prototype mode, the list of persisted ``Command``s can also be truncated from the activity menu.
 ====
 
 == Annotated
@@ -109,7 +110,7 @@ include::ActionCommandJdo_mixinUpdatePropertyMetaAnnotationOverridden.java[tags=
 == CommandServiceListener
 
 The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension, so every command is persisted.
-These can be viewed in the collection at the bottom of the page.
+These can be viewed in the collection at the left bottom of the page.
 ``Command``s are persisted after the page rendering phase, so to view a just-persisted command, refresh the page.
 
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.layout.xml
index 9207772..70a6544 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.layout.xml
@@ -21,6 +21,7 @@
 			<cpt:fieldSet name="Meta-annotated" id="meta-annotated"/>
 			<cpt:fieldSet name="Meta-annotated Overridden" id="meta-annotated-overridden"/>
 			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+			<cpt:collection id="commands"/>
 		</bs3:col>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
@@ -36,11 +37,6 @@
 		</bs3:col>
 	</bs3:row>
 	<bs3:row>
-		<bs3:col span="12">
-			<cpt:collection id="commands"/>
-		</bs3:col>
-	</bs3:row>
-	<bs3:row>
 		<bs3:col span="12" unreferencedCollections="true"/>
 	</bs3:row>
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Collection/CollectionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Collection/CollectionMenu.java
index 7ff4865..5b37063 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Collection/CollectionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Collection/CollectionMenu.java
@@ -25,12 +25,14 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.value.Blob;
 
+import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
 import demoapp.dom.types.Samples;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.CollectionMenu")
 @Log4j2
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class CollectionMenu {
 
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
index 48b91b3..9640227 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
@@ -18,18 +18,22 @@
  */
 package demoapp.dom.annotDomain.DomainObject;
 
+import javax.inject.Inject;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
+import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
 import demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingVm;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.DomainObjectMenu")
 @Log4j2
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class DomainObjectMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
index b97d5c3..32d20f1 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
@@ -30,9 +30,12 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
+import demoapp.dom.annotDomain.Property.command.PropertyCommandJdo;
+import demoapp.dom.annotDomain.Property.command.PropertyCommandJdoEntities;
 import demoapp.dom.annotDomain.Property.domainEvent.PropertyDomainEventVm;
 import demoapp.dom.annotDomain.Property.editing.PropertyEditingVm;
 import demoapp.dom.annotDomain.Property.fileAccept.PropertyFileAcceptVm;
@@ -48,8 +51,21 @@ import demoapp.dom.types.Samples;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.PropertyMenu")
 @Log4j2
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class PropertyMenu {
 
+    final PropertyCommandJdoEntities propertyCommandJdoEntities;
+    final PropertyPublishingJdoEntities propertyPublishingJdoEntities;
+    final Samples<Blob> blobSamples;
+    final Samples<Clob> clobSamples;
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-terminal", describedAs = "Action invocation intentions as XML")
+    public PropertyCommandJdo command(){
+        return propertyCommandJdoEntities.first();
+    }
+
+
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Decouples interaction of properties")
     public PropertyDomainEventVm domainEvent(){
@@ -158,11 +174,5 @@ public class PropertyMenu {
                 .ifPresent(clobConsumer);
     }
 
-    @Inject
-    Samples<Blob> blobSamples;
-    @Inject
-    Samples<Clob> clobSamples;
-    @Inject
-    PropertyPublishingJdoEntities propertyPublishingJdoEntities;
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandDisabledMetaAnnotation.java
similarity index 50%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java
copy to examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandDisabledMetaAnnotation.java
index fd271ba..3ef1f74 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandDisabledMetaAnnotation.java
@@ -1,4 +1,4 @@
-package demoapp.dom.annotDomain.Action.command;
+package demoapp.dom.annotDomain.Property.command;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
@@ -7,15 +7,17 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.CommandReification;
+import org.apache.isis.applib.annotation.Property;
 
 //tag::class[]
-@Action()                                       // <.>
+@Property(command = CommandReification.DISABLED)    // <.>
 @Inherited
 @Target({
-        ElementType.TYPE, ElementType.METHOD    // <.>
+        ElementType.FIELD, ElementType.METHOD       // <.>
 })
 @Retention(RetentionPolicy.RUNTIME)
-public @interface ActionCommandDisabledMetaAnnotation {
+public @interface PropertyCommandDisabledMetaAnnotation {
 
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandEnabledMetaAnnotation.java
similarity index 54%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java
copy to examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandEnabledMetaAnnotation.java
index 62e0d52..392b2fb 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandEnabledMetaAnnotation.java
@@ -1,4 +1,4 @@
-package demoapp.dom.annotDomain.Action.command;
+package demoapp.dom.annotDomain.Property.command;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
@@ -7,16 +7,18 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.CommandReification;
+import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Publishing;
 
 //tag::class[]
-@Action(publishing = Publishing.ENABLED)        // <.>
+@Property(command = CommandReification.ENABLED) // <.>
 @Inherited
 @Target({
-        ElementType.TYPE, ElementType.METHOD    // <.>
+        ElementType.FIELD, ElementType.METHOD   // <.>
 })
 @Retention(RetentionPolicy.RUNTIME)
-public @interface ActionCommandEnabledMetaAnnotation {
+public @interface PropertyCommandEnabledMetaAnnotation {
 
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo-description.adoc
similarity index 68%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc
copy to examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo-description.adoc
index e3f3ad6..9db4777 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo-description.adoc
@@ -1,57 +1,37 @@
-The `command` semantic is used to allow or suppress the reification of an action invocation or property edit into a `Command`.
+The `command` semantic is used to allow or suppress the reification of an property edit into a `Command`.
 
 When allowed (the default), then the `Command` is sent to registered implementation(s) of https://isis.apache.org/refguide/2.0.0-M3/applib-svc/CommandServiceListener.html#section-top[`CommandServiceListener`] SPI, _after_ the interaction has completed.
 One use case is to replicate and replay commands to a secondary system, for example for regression testing.
-For more on this, see "Command Replay" section below.
+For more on this, see the "Command Replay" section below.
 
-Commands are also used under the covers to allow actions/edits to be called asynchronously using the link:https://isis.apache.org/refguide/2.0.0-M3/applib-svc/WrapperFactory.html[`WrapperFactory`].
+Commands are also used under the covers to allow property edits to be made asynchronously using the link:https://isis.apache.org/refguide/2.0.0-M3/applib-svc/WrapperFactory.html[`WrapperFactory`].
 
 [NOTE]
 ====
-The list of persisted ``Command``s can be viewed in a collection at the bottom of the page.
+The list of persisted ``Command``s can be viewed in a collection at the left bottom of the page.
 ``Command``s are persisted after the page rendering phase, so to view a just-persisted command, refresh the page.
 
-(If running in prototype mode), the list of persisted ``Command``s can also be truncated from the activity menu.
+If running in prototype mode, the list of persisted ``Command``s can also be truncated from the activity menu.
 ====
 
 == Annotated
 
-The `command` semantic can be specified explicitly using an annotation through `@Action#command()`:
+The `command` semantic can be specified explicitly using an annotation through `@Property#command()`:
 
-* it can be applied to an action:
-+
 [source,java,indent=0]
 ----
-include::ActionCommandJdo.java[tags=annotation]
+include::PropertyCommandJdo.java[tags=annotation]
 ----
 <.> explicitly specifies that invoking the action should be reified .
 
-* or to a mixin:
-+
-[source,java,indent=0]
-----
-include::ActionCommandJdo_mixinUpdateProperty.java[tags=class]
-----
-<.> explicitly specifies that invoking the mixin action should be reified.
-
 The command reification can also be disabled:
 
-* for an action:
-+
 [source,java,indent=0]
 ----
-include::ActionCommandJdo.java[tags=annotation-2]
+include::PropertyCommandJdo.java[tags=annotation-2]
 ----
 <.> explicitly specifies that invoking the action should not be reified.
 
-* or to a mixin:
-+
-[source,java,indent=0]
-----
-include::ActionCommandJdo_mixinUpdatePropertyCommandDisabled.java[tags=class]
-----
-<.> explicitly specifies that invoking the mixin action should not be reified.
-
 
 == Meta-annotated
 
@@ -61,24 +41,16 @@ The `command` semantic can also be specified using a custom meta-annotation:
 +
 [source,java,indent=0]
 ----
-include::ActionCommandEnabledMetaAnnotation.java[tags=class]
+include::PropertyCommandEnabledMetaAnnotation.java[tags=class]
 ----
-<.> annotated for an action
-<.> annotation can be applied to an action method or to a mixin
+<.> annotated for a property
+<.> annotation can be applied to a property field or getter method
 
-* and can be applied to an action:
+* and can be applied to a property:
 +
 [source,java,indent=0]
 ----
-include::ActionCommandJdo.java[tags=meta-annotation]
-----
-<.> semantic is inherited from the meta-annotation
-
-* or to a mixin:
-+
-[source,java,indent=0]
-----
-include::ActionCommandJdo_mixinUpdatePropertyMetaAnnotation.java[tags=class]
+include::PropertyCommandJdo.java[tags=meta-annotation]
 ----
 <.> semantic is inherited from the meta-annotation
 
@@ -87,29 +59,19 @@ include::ActionCommandJdo_mixinUpdatePropertyMetaAnnotation.java[tags=class]
 
 The meta-annotation can itself be overridden:
 
-* for an action:
-+
 [source,java,indent=0]
 ----
-include::ActionCommandJdo.java[tags=meta-annotation-overridden]
+include::PropertyCommandJdo.java[tags=meta-annotation-overridden]
 ----
 <.> semantic from meta-annotation ...
-<.> \... is overridden by the `@Action` annotation
+<.> \... is overridden by the `@Property` annotation
 
-* or on a mixin:
-+
-[source,java,indent=0]
-----
-include::ActionCommandJdo_mixinUpdatePropertyMetaAnnotationOverridden.java[tags=class]
-----
-<.> semantic from meta-annotation ...
-<.> \... is overridden by the `@Action` annotation
 
 
 == CommandServiceListener
 
 The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension, so every command is persisted.
-These can be viewed in the collection at the bottom of the page.
+These can be viewed in the collection at the bottom of the left page.
 ``Command``s are persisted after the page rendering phase, so to view a just-persisted command, refresh the page.
 
 
@@ -124,7 +86,7 @@ This can be configured globally:
 isis:
   applib:
     annotation:
-      action:
+      property:
         command: none   # or 'all', or 'ignore_safe'
 ----
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo.java
new file mode 100644
index 0000000..466dab3
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo.java
@@ -0,0 +1,117 @@
+/*
+ *  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 demoapp.dom.annotDomain.Property.command;
+
+import javax.jdo.annotations.DatastoreIdentity;
+import javax.jdo.annotations.IdGeneratorStrategy;
+import javax.jdo.annotations.IdentityType;
+import javax.jdo.annotations.PersistenceCapable;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.CommandReification;
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import demoapp.dom.annotDomain._commands.ExposePersistedCommands;
+
+//tag::class[]
+@PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo")
+@DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id")
+@DomainObject(
+        nature=Nature.JDO_ENTITY
+        , objectType = "demo.PropertyCommandJdo"
+        , editing = Editing.ENABLED
+)
+public class PropertyCommandJdo
+        implements HasAsciiDocDescription, ExposePersistedCommands {
+    // ...
+//end::class[]
+
+    public PropertyCommandJdo(String initialValue) {
+        this.property = initialValue;
+        this.propertyCommandDisabled = initialValue;
+        this.propertyMetaAnnotated = initialValue;
+        this.propertyMetaAnnotatedOverridden = initialValue;
+    }
+
+    public String title() {
+        return "Property#command";
+    }
+
+//tag::annotation[]
+    @Property(
+        command = CommandReification.ENABLED             // <.>
+    )
+    @PropertyLayout(
+        describedAs = "@Property(command = ENABLED)"
+    )
+    @MemberOrder(name = "annotation", sequence = "1")
+    @Getter @Setter
+    private String property;
+//end::annotation[]
+
+//tag::annotation-2[]
+    @Property(
+        command = CommandReification.DISABLED           // <.>
+    )
+    @PropertyLayout(
+        describedAs = "@Property(command = DISABLED)"
+    )
+    @MemberOrder(name = "annotation", sequence = "2")
+    @Getter @Setter
+    private String propertyCommandDisabled;
+//end::annotation-2[]
+
+//tag::meta-annotation[]
+    @PropertyCommandEnabledMetaAnnotation               // <.>
+    @PropertyLayout(
+            describedAs = "@PropertyCommandEnabledMetaAnnotation"
+    )
+    @MemberOrder(name = "meta-annotated", sequence = "1")
+    @Getter @Setter
+    private String propertyMetaAnnotated;
+//end::meta-annotation[]
+
+//tag::meta-annotation-overridden[]
+    @PropertyCommandDisabledMetaAnnotation              // <.>
+    @Property(command = CommandReification.ENABLED)     // <.>
+    @PropertyLayout(
+        describedAs =
+            "@PropertyCommandDisabledMetaAnnotation " +
+            "@Property(command = ENABLED)"
+    )
+    @MemberOrder(name = "meta-annotated-overridden", sequence = "1")
+    @Getter @Setter
+    private String propertyMetaAnnotatedOverridden;
+//end::meta-annotation-overridden[]
+
+//tag::class[]
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo.layout.xml
similarity index 96%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.layout.xml
copy to examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo.layout.xml
index 9207772..70a6544 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdo.layout.xml
@@ -21,6 +21,7 @@
 			<cpt:fieldSet name="Meta-annotated" id="meta-annotated"/>
 			<cpt:fieldSet name="Meta-annotated Overridden" id="meta-annotated-overridden"/>
 			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+			<cpt:collection id="commands"/>
 		</bs3:col>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
@@ -36,11 +37,6 @@
 		</bs3:col>
 	</bs3:row>
 	<bs3:row>
-		<bs3:col span="12">
-			<cpt:collection id="commands"/>
-		</bs3:col>
-	</bs3:row>
-	<bs3:row>
 		<bs3:col span="12" unreferencedCollections="true"/>
 	</bs3:row>
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdoEntities.java
new file mode 100644
index 0000000..edf1d9a
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdoEntities.java
@@ -0,0 +1,34 @@
+package demoapp.dom.annotDomain.Property.command;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.services.repository.RepositoryService;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
+public class PropertyCommandJdoEntities {
+
+    final RepositoryService repositoryService;
+
+    public Optional<PropertyCommandJdo> find(final String value) {
+        return repositoryService.firstMatch(PropertyCommandJdo.class, x -> Objects.equals(x.getProperty(), value));
+    }
+
+    public List<PropertyCommandJdo> all() {
+        return repositoryService.allInstances(PropertyCommandJdo.class);
+    }
+
+    public PropertyCommandJdo first() {
+        return all().stream().findFirst().get();
+    }
+
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/wrapperFactory/WrapperFactoryJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdoSeedService.java
similarity index 80%
copy from examples/demo/domain/src/main/java/demoapp/dom/services/wrapperFactory/WrapperFactoryJdoSeedService.java
copy to examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdoSeedService.java
index 3389e0e..a521785 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/services/wrapperFactory/WrapperFactoryJdoSeedService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/PropertyCommandJdoSeedService.java
@@ -1,4 +1,4 @@
-package demoapp.dom.services.wrapperFactory;
+package demoapp.dom.annotDomain.Property.command;
 
 import javax.inject.Inject;
 
@@ -11,9 +11,9 @@ import demoapp.dom._infra.seed.SeedServiceAbstract;
 import demoapp.dom.types.Samples;
 
 @Service
-public class WrapperFactoryJdoSeedService extends SeedServiceAbstract {
+public class PropertyCommandJdoSeedService extends SeedServiceAbstract {
 
-    public WrapperFactoryJdoSeedService() {
+    public PropertyCommandJdoSeedService() {
         super(PropertyPublishingJdoEntityFixture::new);
     }
 
@@ -22,7 +22,7 @@ public class WrapperFactoryJdoSeedService extends SeedServiceAbstract {
         @Override
         protected void execute(ExecutionContext executionContext) {
             samples.stream()
-                    .map(WrapperFactoryJdo::new)
+                    .map(PropertyCommandJdo::new)
                     .forEach(domainObject -> {
                         repositoryService.persist(domainObject);
                         executionContext.addResult(this, domainObject);
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/domainEvent/subscribers/PropertyDomainEventControlService.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/domainEvent/subscribers/PropertyDomainEventControlService.java
index cbaa14c..977d29d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/domainEvent/subscribers/PropertyDomainEventControlService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/domainEvent/subscribers/PropertyDomainEventControlService.java
@@ -8,12 +8,17 @@ import org.springframework.context.event.EventListener;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 
+import lombok.RequiredArgsConstructor;
+
 import demoapp.dom.annotDomain.Property.domainEvent.PropertyDomainEventVm;
 
 // tag::class[]
 @DomainService(objectType = "demo.PropertyDomainEventControlService")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 class PropertyDomainEventControlService {
 
+    final ServiceRegistry serviceRegistry;
+
     PropertyDomainEventControlStrategy controlStrategy = PropertyDomainEventControlStrategy.DO_NOTHING;   // <.>
 
     @EventListener(PropertyDomainEventVm.TextDomainEvent.class)     // <.>
@@ -21,7 +26,5 @@ class PropertyDomainEventControlService {
         controlStrategy.on(ev, serviceRegistry);
     }
 
-    @Inject
-    ServiceRegistry serviceRegistry;
 }
 // end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdoSeedService.java
index c45cd79..18679ee 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdoSeedService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdoSeedService.java
@@ -7,6 +7,8 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 
+import lombok.RequiredArgsConstructor;
+
 import demoapp.dom._infra.seed.SeedServiceAbstract;
 import demoapp.dom.types.Samples;
 
@@ -30,10 +32,7 @@ public class PropertyPublishingJdoSeedService extends SeedServiceAbstract {
 
         }
 
-        @Inject
-        RepositoryService repositoryService;
-
-        @Inject
-        Samples<String> samples;
+        @Inject RepositoryService repositoryService;
+        @Inject Samples<String> samples;
     }
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/PropertyLayout/PropertyLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/PropertyLayout/PropertyLayoutMenu.java
index da4204f..6587c80 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/PropertyLayout/PropertyLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/PropertyLayout/PropertyLayoutMenu.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.value.Blob;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -46,8 +47,12 @@ import demoapp.dom.types.Samples;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.PropertyLayoutMenu")
 @Log4j2
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class PropertyLayoutMenu {
 
+    final ClockService clockService;
+    final Samples<Blob> samples;
+
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-file-code", describedAs = "HTML styling")
     public PropertyLayoutCssClassVm cssClass(){
@@ -148,10 +153,5 @@ public class PropertyLayoutMenu {
         return vm;
     }
 
-    @Inject
-    ClockService clockService;
-
-    @Inject
-    Samples<Blob> samples;
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/PropertyLayout/navigable/FileTreeNodeService.java b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/PropertyLayout/navigable/FileTreeNodeService.java
index f79a317..68a6018 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/PropertyLayout/navigable/FileTreeNodeService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/PropertyLayout/navigable/FileTreeNodeService.java
@@ -30,13 +30,17 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.graph.tree.TreeNode;
 import org.apache.isis.applib.graph.tree.TreePath;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 //tag::sessionTree[]
 @Service
 @Named("demo.FileTreeNodeService")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class FileTreeNodeService {
 
+    final Provider<HttpSession> httpSessionProvider;
+
     public TreeNode<FileNodeVm> sessionTree() {
         TreeNode<FileNodeVm> tree = (TreeNode<FileNodeVm>) httpSessionProvider.get().getAttribute(TreeNode.class.getName());
         if(tree == null) {
@@ -60,10 +64,6 @@ public class FileTreeNodeService {
 
 
 //tag::sessionTree[]
-
     // ...
-
-    @Inject
-    private Provider<HttpSession> httpSessionProvider;
 }
 //end::sessionTree[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/error/ErrorMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/error/ErrorMenu.java
index 07d6b71..48204ed 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/error/ErrorMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/error/ErrorMenu.java
@@ -27,13 +27,15 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.factory.FactoryService;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.ErrorMenu")
 @DomainObjectLayout(named="Error Handling")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class ErrorMenu {
 
-    @Inject private FactoryService factoryService;
+    final FactoryService factoryService;
 
     @Action
     @ActionLayout(cssClassFa="fa-bolt")
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/events/DemoEventSubscriber.java b/examples/demo/domain/src/main/java/demoapp/dom/events/DemoEventSubscriber.java
index 7b84a69..bbba2e07 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/events/DemoEventSubscriber.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/events/DemoEventSubscriber.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.wrapper.control.AsyncControl;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -43,10 +44,11 @@ import static demoapp.dom._infra.utils.LogUtils.emphasize;
 @Named("demoapp.eventSubscriber")
 @Qualifier("demo")
 @Log4j2
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class DemoEventSubscriber {
 
-    @Inject private WrapperFactory wrapper;
-    @Inject private FactoryService factoryService;
+    final WrapperFactory wrapper;
+    final FactoryService factoryService;
     
     @EventListener(UiButtonEvent.class) // <-- listen on the event, triggered by button in the UI 
     public void on(UiButtonEvent event) {
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/events/EventLogRepository.java b/examples/demo/domain/src/main/java/demoapp/dom/events/EventLogRepository.java
index 8041580..dd50986 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/events/EventLogRepository.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/events/EventLogRepository.java
@@ -27,18 +27,21 @@ import org.springframework.stereotype.Repository;
 
 import org.apache.isis.applib.services.repository.RepositoryService;
 
+import lombok.RequiredArgsConstructor;
+
 @Repository
 @Named("demoapp.eventLogRepository")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class EventLogRepository {
 
-    @Inject private RepositoryService repository;
+    final RepositoryService repositoryService;
 
     public List<EventLogEntry> listAll(){
-        return repository.allInstances(EventLogEntry.class);
+        return repositoryService.allInstances(EventLogEntry.class);
     }
 
     public void add(EventLogEntry entry) {
-        repository.persist(entry);
+        repositoryService.persist(entry);
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/events/EventsDemoMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/events/EventsDemoMenu.java
index 1729fe7..08ce9d6 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/events/EventsDemoMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/events/EventsDemoMenu.java
@@ -27,13 +27,15 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.factory.FactoryService;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.EventsDemoMenu")
 @DomainObjectLayout(named="Events Demo")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class EventsDemoMenu {
 
-    @Inject private FactoryService factoryService;
+    final FactoryService factoryService;
 
     @Action
     @ActionLayout(cssClassFa="fa-bolt")
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/extensions/secman/apptenancy/entities/TenantedJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/extensions/secman/apptenancy/entities/TenantedJdoEntities.java
index ce07ac8..be21d86 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/extensions/secman/apptenancy/entities/TenantedJdoEntities.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/extensions/secman/apptenancy/entities/TenantedJdoEntities.java
@@ -8,14 +8,17 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.repository.RepositoryService;
 
+import lombok.RequiredArgsConstructor;
+
 @Service
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class TenantedJdoEntities {
 
+    final RepositoryService repositoryService;
+
     public List<TenantedJdo> all() {
         return repositoryService.allInstances(TenantedJdo.class);
     }
 
-    @Inject
-    RepositoryService repositoryService;
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/extensions/secman/apptenancy/entities/seed/TenantedJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/extensions/secman/apptenancy/entities/seed/TenantedJdoSeedService.java
index 5819ebd..2673e6d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/extensions/secman/apptenancy/entities/seed/TenantedJdoSeedService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/extensions/secman/apptenancy/entities/seed/TenantedJdoSeedService.java
@@ -30,12 +30,8 @@ public class TenantedJdoSeedService extends SeedServiceAbstract {
                     });
         }
 
-        @Inject
-        RepositoryService repositoryService;
-
-        @Inject
-        NameSamples secManNameSamples;
+        @Inject RepositoryService repositoryService;
+        @Inject NameSamples secManNameSamples;
     }
 
-
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/jee/JeeMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/jee/JeeMenu.java
index 0a5afe9..96578b5 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/jee/JeeMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/jee/JeeMenu.java
@@ -26,12 +26,14 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.factory.FactoryService;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.JeeMenu")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class JeeMenu {
 
-    @Inject private FactoryService factoryService;
+    final FactoryService factoryService;
 
     @Action
     @ActionLayout(cssClassFa="fa-bolt")
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
index 2a04eaa..b6924a7 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
@@ -122,6 +122,7 @@ as a replacement for
             </mb3:section>
             <mb3:section>
                 <mb3:named>@Property</mb3:named>
+                <mb3:serviceAction objectType="demo.PropertyMenu" id="command"/>
                 <mb3:serviceAction objectType="demo.PropertyMenu" id="domainEvent"/>
                 <mb3:serviceAction objectType="demo.PropertyMenu" id="editing"/>
                 <mb3:serviceAction objectType="demo.PropertyMenu" id="fileAccept"/>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/mixins/MixinMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/mixins/MixinMenu.java
index e80b99d..18c14b8 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/mixins/MixinMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/mixins/MixinMenu.java
@@ -28,12 +28,14 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.factory.FactoryService;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.MixinMenu")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class MixinMenu {
 
-    @Inject private FactoryService factoryService;
+    final FactoryService factoryService;
 
     @Action
     @ActionLayout(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/mixins/legacy/MixinLegacyMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/mixins/legacy/MixinLegacyMenu.java
index 10fb747..f895555 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/mixins/legacy/MixinLegacyMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/mixins/legacy/MixinLegacyMenu.java
@@ -28,14 +28,16 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.factory.FactoryService;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 import demoapp.dom.mixins.DemoItem;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.MixinLegacyMenu")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class MixinLegacyMenu {
 
-    @Inject private FactoryService factoryService;
+    final FactoryService factoryService;
 
     @Action
     @ActionLayout(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/wrapperFactory/WrapperFactoryJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/services/wrapperFactory/WrapperFactoryJdoSeedService.java
index 3389e0e..4de0efe 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/services/wrapperFactory/WrapperFactoryJdoSeedService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/services/wrapperFactory/WrapperFactoryJdoSeedService.java
@@ -30,10 +30,7 @@ public class WrapperFactoryJdoSeedService extends SeedServiceAbstract {
 
         }
 
-        @Inject
-        RepositoryService repositoryService;
-
-        @Inject
-        Samples<String> samples;
+        @Inject RepositoryService repositoryService;
+        @Inject Samples<String> samples;
     }
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/tabs/TabMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/tabs/TabMenu.java
index 2abab10..f3035bc 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/tabs/TabMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/tabs/TabMenu.java
@@ -26,17 +26,20 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.factory.FactoryService;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.TabMenu")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class TabMenu {
 
-    @Inject private FactoryService factoryService;
+    final FactoryService factoryService;
 
     @Action
     @ActionLayout(
             cssClassFa="fa-bolt",
-            describedAs="Opens the Tabs-Demo page.")
+            describedAs="Opens the Tabs-Demo page."
+    )
     public TabDemo tabDemo(){
         return factoryService.viewModel(TabDemo.class);
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/tooltip/TooltipMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/tooltip/TooltipMenu.java
index 9f54912..425ba99 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/tooltip/TooltipMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/tooltip/TooltipMenu.java
@@ -28,14 +28,16 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.factory.FactoryService;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 import demoapp.dom.actions.assoc.DemoItem;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.TooltipMenu")
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class TooltipMenu {
 
-    @Inject private FactoryService factoryService;
+    final FactoryService factoryService;
 
     @Action
     @ActionLayout(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdoEntities.java
index 0afdd80..d475904 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdoEntities.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdoEntities.java
@@ -10,9 +10,14 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.value.Blob;
 
+import lombok.RequiredArgsConstructor;
+
 @Service
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class IsisBlobJdoEntities {
 
+    final RepositoryService repositoryService;
+
     public Optional<IsisBlobJdo> find(final Blob readOnlyProperty) {
         return repositoryService.firstMatch(IsisBlobJdo.class, x -> x.getReadOnlyProperty() == readOnlyProperty);
     }
@@ -21,7 +26,5 @@ public class IsisBlobJdoEntities {
         return repositoryService.allInstances(IsisBlobJdo.class);
     }
 
-    @Inject
-    RepositoryService repositoryService;
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdoSeedService.java
index 1726c47..d9696b7 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdoSeedService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdoSeedService.java
@@ -31,10 +31,7 @@ public class IsisBlobJdoSeedService extends SeedServiceAbstract {
                     });
         }
 
-        @Inject
-        RepositoryService repositoryService;
-
-        @Inject
-        Samples<Blob> samples;
+        @Inject RepositoryService repositoryService;
+        @Inject Samples<Blob> samples;
     }
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdoEntities.java
index d970bda..35c1056 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdoEntities.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdoEntities.java
@@ -10,9 +10,14 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.value.Clob;
 
+import lombok.RequiredArgsConstructor;
+
 @Service
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class IsisClobJdoEntities {
 
+    final RepositoryService repositoryService;
+
     public Optional<IsisClobJdo> find(final Clob readOnlyProperty) {
         return repositoryService.firstMatch(IsisClobJdo.class, x -> x.getReadOnlyProperty() == readOnlyProperty);
     }
@@ -21,7 +26,5 @@ public class IsisClobJdoEntities {
         return repositoryService.allInstances(IsisClobJdo.class);
     }
 
-    @Inject
-    RepositoryService repositoryService;
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdoSeedService.java
index 158bacc..f056b81 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdoSeedService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdoSeedService.java
@@ -30,10 +30,7 @@ public class IsisClobJdoSeedService extends SeedServiceAbstract {
                     });
         }
 
-        @Inject
-        RepositoryService repositoryService;
-
-        @Inject
-        Samples<Clob> samples;
+        @Inject RepositoryService repositoryService;
+        @Inject Samples<Clob> samples;
     }
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/images/jdo/IsisImageJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/images/jdo/IsisImageJdoEntities.java
index 143a771..542efc9 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/images/jdo/IsisImageJdoEntities.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/images/jdo/IsisImageJdoEntities.java
@@ -10,9 +10,14 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.value.Image;
 
+import lombok.RequiredArgsConstructor;
+
 @Service
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class IsisImageJdoEntities {
 
+    final RepositoryService repositoryService;
+
     public Optional<IsisImageJdo> find(final Image readOnlyProperty) {
         return repositoryService.firstMatch(IsisImageJdo.class, x -> x.getReadOnlyProperty() == readOnlyProperty);
     }
@@ -21,7 +26,4 @@ public class IsisImageJdoEntities {
         return repositoryService.allInstances(IsisImageJdo.class);
     }
 
-    @Inject
-    RepositoryService repositoryService;
-
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/images/jdo/IsisImageJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/images/jdo/IsisImageJdoSeedService.java
index 4c4833b..1c8969d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/images/jdo/IsisImageJdoSeedService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/images/jdo/IsisImageJdoSeedService.java
@@ -30,10 +30,7 @@ public class IsisImageJdoSeedService extends SeedServiceAbstract {
                     });
         }
 
-        @Inject
-        RepositoryService repositoryService;
-
-        @Inject
-        Samples<Image> samples;
+        @Inject RepositoryService repositoryService;
+        @Inject Samples<Image> samples;
     }
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdoEntities.java
index d7dbe13..ac19925 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdoEntities.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdoEntities.java
@@ -10,9 +10,14 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.value.LocalResourcePath;
 
+import lombok.RequiredArgsConstructor;
+
 @Service
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class IsisLocalResourcePathJdoEntities {
 
+    final RepositoryService repositoryService;
+
     public Optional<IsisLocalResourcePathJdo> find(final LocalResourcePath readOnlyProperty) {
         return repositoryService.firstMatch(IsisLocalResourcePathJdo.class, x -> x.getReadOnlyProperty() == readOnlyProperty);
     }
@@ -21,7 +26,5 @@ public class IsisLocalResourcePathJdoEntities {
         return repositoryService.allInstances(IsisLocalResourcePathJdo.class);
     }
 
-    @Inject
-    RepositoryService repositoryService;
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdoSeedService.java
index 131e0ac..5472819 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdoSeedService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdoSeedService.java
@@ -30,10 +30,7 @@ public class IsisLocalResourcePathJdoSeedService extends SeedServiceAbstract {
                     });
         }
 
-        @Inject
-        RepositoryService repositoryService;
-
-        @Inject
-        Samples<LocalResourcePath> samples;
+        @Inject RepositoryService repositoryService;
+        @Inject Samples<LocalResourcePath> samples;
     }
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdoEntities.java
index b79076d..b5552fc 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdoEntities.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdoEntities.java
@@ -10,9 +10,14 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.value.Markup;
 
+import lombok.RequiredArgsConstructor;
+
 @Service
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class IsisMarkupJdoEntities {
 
+    final RepositoryService repositoryService;
+
     public Optional<IsisMarkupJdo> find(final Markup readOnlyProperty) {
         return repositoryService.firstMatch(IsisMarkupJdo.class, x -> x.getReadOnlyProperty() == readOnlyProperty);
     }
@@ -21,7 +26,5 @@ public class IsisMarkupJdoEntities {
         return repositoryService.allInstances(IsisMarkupJdo.class);
     }
 
-    @Inject
-    RepositoryService repositoryService;
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdoSeedService.java
index d1e971a..d56bceb 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdoSeedService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdoSeedService.java
@@ -30,10 +30,8 @@ public class IsisMarkupJdoSeedService extends SeedServiceAbstract {
                     });
         }
 
-        @Inject
-        RepositoryService repositoryService;
+        @Inject RepositoryService repositoryService;
+        @Inject Samples<Markup> samples;
 
-        @Inject
-        Samples<Markup> samples;
     }
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/types/isisschema/chg/.gitkeep
similarity index 100%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/.gitkeep
copy to examples/demo/domain/src/main/java/demoapp/dom/types/isisschema/chg/.gitkeep
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/types/isisschema/cmd/.gitkeep
similarity index 100%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/.gitkeep
copy to examples/demo/domain/src/main/java/demoapp/dom/types/isisschema/cmd/.gitkeep
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/types/isisschema/ixn/.gitkeep
similarity index 100%
rename from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/command/.gitkeep
rename to examples/demo/domain/src/main/java/demoapp/dom/types/isisschema/ixn/.gitkeep
diff --git a/examples/demo/domain/src/main/resources/application.yml b/examples/demo/domain/src/main/resources/application.yml
index 2134d0c..6f8678b 100644
--- a/examples/demo/domain/src/main/resources/application.yml
+++ b/examples/demo/domain/src/main/resources/application.yml
@@ -19,9 +19,11 @@
 #
 isis:
 
+
   applib:
     annotation:
       action:
+        command: ignore_safe
         explicit: true
         publishing: none
       action-layout:
@@ -41,6 +43,7 @@ isis:
         editing: false
         publishing: none
       property:
+        command: all
         publishing: none
       property-layout:
         label-position: LEFT
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/linebreaker/LineBreaker.java b/examples/demo/web/src/main/java/demoapp/web/linebreaker/LineBreaker.java
similarity index 82%
rename from examples/demo/domain/src/main/java/demoapp/dom/linebreaker/LineBreaker.java
rename to examples/demo/web/src/main/java/demoapp/web/linebreaker/LineBreaker.java
index ea02f5f..5ca588c 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/linebreaker/LineBreaker.java
+++ b/examples/demo/web/src/main/java/demoapp/web/linebreaker/LineBreaker.java
@@ -1,4 +1,4 @@
-package demoapp.dom.linebreaker;
+package demoapp.web.linebreaker;
 
 import javax.inject.Inject;
 
@@ -8,6 +8,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.core.runtime.iactn.IsisInteractionTracker;
 
+import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
 /**
@@ -17,8 +18,11 @@ import lombok.extern.log4j.Log4j2;
  */
 @DomainService(nature = NatureOfService.REST, objectType = "demo.LineBreaker")
 @Log4j2
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class LineBreaker {
-    
+
+    final IsisInteractionTracker isisInteractionTracker;
+
     @Action(semantics = SemanticsOf.SAFE)
     public void shutdown() {
         log.info("about to shutdown the JVM");
@@ -30,7 +34,5 @@ public class LineBreaker {
         });
     }
 
-    @Inject
-    IsisInteractionTracker isisInteractionTracker;
-    
+
 }
diff --git a/extensions/core/command-replay/secondary/pom.xml b/extensions/core/command-replay/secondary/pom.xml
index 5bafd00..a321a5f 100644
--- a/extensions/core/command-replay/secondary/pom.xml
+++ b/extensions/core/command-replay/secondary/pom.xml
@@ -65,10 +65,12 @@
             <artifactId>isis-mappings-jaxrsclient-impl</artifactId>
         </dependency>
 
+<!--
         <dependency>
             <groupId>org.apache.isis.extensions</groupId>
             <artifactId>isis-extensions-command-log-jdo</artifactId>
         </dependency>
+-->
 
         <dependency>
             <groupId>org.apache.isis.extensions</groupId>
diff --git a/viewers/wicket/adoc/modules/ROOT/partials/security/user-registration.adoc b/viewers/wicket/adoc/modules/ROOT/partials/security/user-registration.adoc
index 6f7443f..a576bdd 100644
--- a/viewers/wicket/adoc/modules/ROOT/partials/security/user-registration.adoc
+++ b/viewers/wicket/adoc/modules/ROOT/partials/security/user-registration.adoc
@@ -7,7 +7,7 @@
 
 As well as providing a sign-in screen, the Wicket viewer also provides the ability for users to self-register.
 By and large this operates outside of Apache Isis' security mechanisms; indeed the various pages (sign-up, sign-up verification, password reset) are all rendered _without_ there being any current user session.
-These pages all "reach inside" Apache Isis framework using a mechanism similar to xref:userguide:btb:headless-access.adoc[Headless access] in order to actually do their stuff.
+These pages all "reach inside" Apache Isis framework in order to actually do their stuff.
 
 [TIP]
 ====


[isis] 02/02: ISIS-2222: moves CommandService to runtimeservices, makes internal

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

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

commit 66a478c4f32be8d277e7c880cffba31ec5a2270b
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Sep 23 00:28:12 2020 +0100

    ISIS-2222: moves CommandService to runtimeservices, makes internal
---
 .../system/modules/ROOT/pages/about.adoc           |   1 -
 .../apache-isis-vs-cqrs-and-event-sourcing.adoc    |   2 +-
 .../modules/fun/pages/overview/identifiers.adoc    |   2 +-
 .../applib-ant/examples/annotation/Action.java     |   2 +-
 .../modules/applib-ant/pages/Property/command.adoc |   1 +
 .../command/spi/CommandServiceListener.java        |   4 +-
 .../modules/applib-svc/pages/AuditerService.adoc   |   4 +-
 .../modules/applib-svc/pages/BookmarkService.adoc  |   2 +-
 .../pages/CommandDtoProcessorService.adoc          |  22 ++-
 .../applib-svc/pages/ContentMappingService.adoc    |  13 +-
 .../modules/applib-svc/pages/PublisherService.adoc |   4 +-
 .../main/adoc/modules/applib-svc/pages/about.adoc  |   2 +-
 .../partials/_application-layer-spi.adoc           |   2 +-
 .../modules/applib-svc/partials/module-nav.adoc    |   2 +-
 .../org/apache/isis/applib/IsisModuleApplib.java   |   3 +-
 .../org/apache/isis/applib/annotation/Action.java  |   4 +-
 .../isis/applib/services/command/Command.java      |  22 +++
 ...andService.java => CommandServiceInternal.java} |   9 +-
 .../command/spi/CommandServiceListener.java        |   5 +-
 .../modules/config/pages/sections/isis.applib.adoc |   4 +-
 .../isis.persistence.jdo-datanucleus.impl.adoc     | 178 ---------------------
 .../config/pages/sections/isis.value-types.adoc    |   9 --
 .../modules/config/pages/sections/resteasy.adoc    |  12 +-
 .../apache/isis/core/config/IsisConfiguration.java |  19 +--
 ...ctionInvocationFacetForDomainEventAbstract.java |   9 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java |  10 +-
 .../pages/CommandServiceInternal.adoc              |   2 +-
 .../IsisModuleCoreRuntimeServices.java             |   2 +
 .../adoc/modules/command-log/pages/about.adoc      |   6 +-
 .../adoc/modules/audit-trail/pages/about.adoc      |   2 +-
 .../persistence/IsisPersistenceSessionJdoBase.java |   7 +-
 .../persistence/PersistenceSession5.java           |   2 +-
 security/adoc/modules/ROOT/pages/about.adoc        |   2 +-
 33 files changed, 97 insertions(+), 273 deletions(-)

diff --git a/antora/components/system/modules/ROOT/pages/about.adoc b/antora/components/system/modules/ROOT/pages/about.adoc
index c61b54c..2722d40 100644
--- a/antora/components/system/modules/ROOT/pages/about.adoc
+++ b/antora/components/system/modules/ROOT/pages/about.adoc
@@ -117,7 +117,6 @@ _Components_
 * org.apache.isis.applib.annotation.ViewModel
 * org.apache.isis.applib.services.audit.AuditerServiceLogging
 * org.apache.isis.applib.services.clock.ClockService
-* org.apache.isis.applib.services.command.CommandService
 * org.apache.isis.applib.services.command.spi.CommandServiceListener$Null
 * org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto
 * org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandsDto
diff --git a/api/adoc/userguide/modules/fun/pages/concepts-patterns/apache-isis-vs-cqrs-and-event-sourcing.adoc b/api/adoc/userguide/modules/fun/pages/concepts-patterns/apache-isis-vs-cqrs-and-event-sourcing.adoc
index 7e7b775..638c7ef 100644
--- a/api/adoc/userguide/modules/fun/pages/concepts-patterns/apache-isis-vs-cqrs-and-event-sourcing.adoc
+++ b/api/adoc/userguide/modules/fun/pages/concepts-patterns/apache-isis-vs-cqrs-and-event-sourcing.adoc
@@ -54,7 +54,7 @@ Here, Apache Isis would be used to provide the UI for the _read_ model, with the
 Mixins would decorate these entities, but would act upon a write model whose persistence is handled outside of Apache Isis, probably using Spring Boot directly to provide a datasource.
 To synchronise the write- and read- model, the events emitted by xref:refguide:applib-svc:PublisherService.adoc[`PublisherService`] could be used.
 
-With respect to commands, Apache Isis provides the xref:refguide:applib-svc:CommandService.adoc[`CommandService`] which allows each business action to be reified into a `Command`.
+With respect to commands, Apache Isis provides the xref:refguide:applib-svc:CommandServiceInternal.adoc[`CommandService`] which allows each business action to be reified into a `Command`.
 However, names are misleading here: Apache Isis' commands are relatively passive, merely recording the intent of the user to invoke some operation.
 In a CQRS architecture, commands take a more active role, locating and acting upon the domain objects.
 More significantly, in CQRS each command has its own class, such as `PlaceOrderCommand`, instantiated by the client and then executed.
diff --git a/api/adoc/userguide/modules/fun/pages/overview/identifiers.adoc b/api/adoc/userguide/modules/fun/pages/overview/identifiers.adoc
index ba023b5..df53ebd 100644
--- a/api/adoc/userguide/modules/fun/pages/overview/identifiers.adoc
+++ b/api/adoc/userguide/modules/fun/pages/overview/identifiers.adoc
@@ -60,7 +60,7 @@ When the PDF is scanned by the mail room, the barcode could be read to attach th
 
 * as a handle to any object in an audit record, as used by xref:refguide:applib-svc:AuditerService.adoc[`AuditerService`];
 
-* similarly within implementations of xref:refguide:applib-svc:CommandService.adoc[`CommandService`] to persist `Command` objects
+* similarly within implementations of xref:refguide:applib-svc:CommandServiceInternal.adoc[`CommandService`] to persist `Command` objects
 
 * similarly within implementations of xref:refguide:applib-svc:PublisherService.adoc[`PublisherService`] to persist published action invocations
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/examples/annotation/Action.java b/api/applib/src/main/adoc/modules/applib-ant/examples/annotation/Action.java
index f8c0703..25e1f51 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/examples/annotation/Action.java
+++ b/api/applib/src/main/adoc/modules/applib-ant/examples/annotation/Action.java
@@ -27,7 +27,7 @@ import java.lang.annotation.Target;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.services.commanddto.processor.CommandDtoProcessor;
-import org.apache.isis.applib.services.command.CommandService;
+import org.apache.isis.applib.services.command.CommandServiceInternal;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandsDto;
 import org.apache.isis.applib.value.Blob;
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Property/command.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Property/command.adoc
index a3da1ef..70689c3 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Property/command.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Property/command.adoc
@@ -28,6 +28,7 @@ The `command()` attribute can be used to explicitly enable or disable command re
 
 
 
+[#commanddtoprocessor]
 == `commandDtoProcessor()`
 
 The `commandDtoProcessor` attribute allows an implementation of `CommandDtoProcessor` to be specified.
diff --git a/api/applib/src/main/adoc/modules/applib-svc/examples/services/command/spi/CommandServiceListener.java b/api/applib/src/main/adoc/modules/applib-svc/examples/services/command/spi/CommandServiceListener.java
index ba6b727..b6a03fb 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/examples/services/command/spi/CommandServiceListener.java
+++ b/api/applib/src/main/adoc/modules/applib-svc/examples/services/command/spi/CommandServiceListener.java
@@ -48,8 +48,8 @@ public interface CommandServiceListener {
     void onComplete(final Command command);           // <.>
 
     /**
-     * At least one implementation is required to satisfy injection point into
-     * {@link org.apache.isis.applib.services.command.CommandService}.
+     * At least one implementation is required to satisfy injection points
+     * internal to the framework.
      */
     @Service
     @Named("isisApplib.CommandServiceListenerNull")
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/AuditerService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/AuditerService.adoc
index 8a9a561..c2d1040 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/AuditerService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/AuditerService.adoc
@@ -63,8 +63,8 @@ As its name implies, it uses xref:pjdo:ROOT:about.adoc[JDO/DataNucleus] to do th
 
 == Related Services
 
-The services provided by this module combines very well with the xref:refguide:applib-svc:CommandService.adoc[`CommandService`].
-The `CommandService` captures the __cause__ of an interaction (an action was invoked, a property was edited), while the `AuditerService` captures the __effect__ of that interaction in terms of changed state.
+The services provided by this module combines very well with the xref:refguide:applib-svc:CommandServiceListener.adoc[`CommandServiceListener`].
+``Command``s captures the __cause__ of an interaction (an action was invoked, a property was edited), while the `AuditerService` captures the __effect__ of that interaction in terms of changed state.
 You may also want to configure the xref:refguide:applib-svc:PublisherService.adoc[`PublisherService`], which also captures the effect of the interaction but as an event.
 All three of these services collaborate implicitly by way of the xref:applib-classes:roles-mixins-contributees/contributee.adoc#HasUniqueId[`HasUniqueId`] interface.
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/BookmarkService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/BookmarkService.adoc
index 581b8b2..e2cec93 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/BookmarkService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/BookmarkService.adoc
@@ -15,7 +15,7 @@ Bookmarks are useful to store a reference to an arbitrary object, although be aw
 Several of the extension libraries use bookmarks.
 For example the xref:refguide:applib-svc:AuditerService.adoc[`AuditerService`] uses bookmarks to identify the object that is being modified.
 
-Serialized form of bookmarks also appear within  xref:refguide:schema:about.adoc[schema] instances, for example as used by xref:refguide:applib-svc:CommandService.adoc[`CommandService`] and the xref:refguide:applib-svc:PublisherService.adoc[`PublisherService`].
+Serialized form of bookmarks also appear within  xref:refguide:schema:about.adoc[schema] instances, for example as used by xref:refguide:applib-svc:CommandServiceInternal.adoc[`CommandService`] and the xref:refguide:applib-svc:PublisherService.adoc[`PublisherService`].
 
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/CommandDtoProcessorService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/CommandDtoProcessorService.adoc
index 6bbeccd..bd7ce0c 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/CommandDtoProcessorService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/CommandDtoProcessorService.adoc
@@ -3,18 +3,15 @@
 :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 [...]
 :page-partial:
 
-The `CommandDtoProcessorService` domain serviceproviding a mechanism to convert the  instance of `Command` into a serializable `CommandDto`.
+Having a DTO representation of ``Command``s (or more precisely, any object implementing `HasCommandDto` offers the ability to move or copy it across the network, for example to support replay scenarios.
+This is used for example by xref:extensions:command-log:about.adoc[Command Log] extension to return persisted representations of commands.
+The conversion is performed by an in-built implementation of the xref:refguide:applib-svc:ContentMappingService.adoc[`ContentMappingService`] SPI.
 
-Having a DTO representation of `Command` offers the ability to move or copy it across the network, for example to support replay scenarios.
-To facilitate this, the framework itself provides a default implementation of this service which copies the publicly accessible members of `Command` into the corresponding `CommandDto`.
+The `CommandDtoProcessorService` SPI provides a mechanism to post-process the `CommandDto` of any objects being serialized across the network.
 
-This is used by xref:refguide:applib-svc:ContentMappingService.adoc[`ContentMappingService`] to serialize ``Command``s over the REST API provided by xref:vro:ROOT:about.adoc[Restful Objects viewer].
-For many cases this default implementation will suffice.
+For example, the xref:extensions:command-replay:about.adoc[Command Replay] extension provides an implementation in order to copy information about the outcome of each command on the primary system into the `userData` map of `CommandDto`.
+Another use case is to strip out large blobs for performance reasons.
 
-If necessary, though, a custom implementation of this service can be provided.
-For example, if a custom implementation of xref:refguide:applib-svc:CommandService.adoc[`CommandService`] provides a different implementation of `Command` with additional state, this could be copied into the `userData` map of `CommandDto` using a companion implementation of the `CommandDtoProcessorService` may be provided in order to copy over any important additional properties.
-
-WARNING: TODO: v2 - perhaps this should just be merged into `CommandService`?  (And for that matter, maybe the `BackgroundCommandService` also?)
 
 
 == API
@@ -29,14 +26,14 @@ include::refguide:applib-svc:example$services/commanddto/processor/spi/CommandDt
 
 == Implementation
 
-As noted in the introduction, the framework provides a default implementation, namely `o.a.i.applib.services.conmap.command.ContentMappingServiceForCommandDto.CopyOverFromCommand`.
+As noted in the introduction, the framework provides a default implementation, namely `o.a.i.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto`.
 
 
 == Related Classes
 
 The `CommandDtoProcessorService` is a global fallback for serializing actions of commands into a DTO.
-However, this can be overridden on an action-by-action basis using  xref:refguide:applib-ant:Action.adoc#commanddtoprocessor[`@Action#commandDtoProcessor`].
-The main use case is to allow certain actions to be ignored.
+However, this can be overridden on on an action-by-action basis using  xref:refguide:applib-ant:Action.adoc#commanddtoprocessor[`@Action#commandDtoProcessor`], and on a property-by-property basis using xref:refguide:applib-ant:Property.adoc#commanddtoprocessor[`@Command#commandDtoProcessor()`].
+The main use case is to allow certain actions/property edits to be ignored:
 
 [source,java]
 ----
@@ -49,4 +46,3 @@ include::refguide:applib-svc:example$services/commanddto/processor/CommandDtoPro
 * the `CommandDtoProcessorService` is used by xref:refguide:applib-svc:ContentMappingService.adoc[`ContentMappingService`] to serialize ``Command``s over the REST API provided by xref:vro:ROOT:about.adoc[Restful Objects viewer].
 All implementations are used.
 
-* if there is a custom implementations of xref:refguide:applib-svc:CommandService.adoc[`CommandService`] (with a corresponding custom implementation of `Command`), then it may define a corresponding implementation of this `CommandDtoProcessorService` in order to serialize out any additional state.
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/ContentMappingService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/ContentMappingService.adoc
index 444f0cd..0bb7e49 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/ContentMappingService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/ContentMappingService.adoc
@@ -29,16 +29,13 @@ include::refguide:applib-svc:example$services/conmap/ContentMappingService.java[
 
 == Implementations
 
-The framework provides two implementations of this service, both in support of the xref:refguide:applib-svc:CommandService.adoc[`CommandService`] SPI.
+The framework provides two implementations of this service, both to allow objects implementing `HasCommandDto` to be converted into serializable ``CommandDto``s, in other words XML.
+This is used by the xref:extensions:command-log:about.adoc[Command Log] and xref:extensions:command-replay:about.adoc[Command Replay] extensions to allow commands to be replicated from a primary to secondary system, for regression testing.
 
-By way of background: implementations of the SPI `CommandService` work with custom implementations of the `Command` interface, typically being persisted to a datastore.
-The `CommandWithDto` interface is a subtype of `Command` for implementations that can be reified into xref:refguide:schema:cmd.adoc[`CommandDto`] XML instances.
-One implementation that does this is the xref:extensions:command-log:about.adoc[Command Log] extension module.
+The implementations are:
 
-For framework implementations of `ContentMappingService` allow domain service actions that return ``CommandDto``s (either singularly or in a list) to be converted into XML documents:
-
-* `o.a.i.applib.services.conmap.ContentMappingServiceForCommandDto` will map any single instance of a `CommandWithDto` into a `CommandDto` XML document
-* `o.a.i.applib.services.conmap.ContentMappingServiceForCommandsDto` will map list of ``CommandWithDto``s into a `CommandsDto` XML document, and will wrap any single instance of a `CommandWithDto` into a singleton list and thence into a `CommandsDto` XML document.
+* `o.a.i.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto` will map any single instance of a `HasCommandDto` into a `CommandDto` XML document
+* `o.a.i.applib.services.commanddto.conmap.ContentMappingServiceForCommandsDto` will map a list of ``HasCommandDto``s into a `CommandsDto` XML document, and will wrap any single instance of a `CommandWithDto` into a singleton list and thence into a `CommandsDto` XML document.
 
 If the action invocation or property edit represent provides an implementation of a `CommandDtoProcessor` (by way of xref:refguide:applib-ant:Action.adoc#command[`@Action#commandDtoProcessor()`] or xref:refguide:applib-ant:Property.adoc#command[`@Property#commandDtoProcessor()`]) then this is also called to post-process the persisted `CommandDto` if required.
 A typical use case for this is to dynamically add in serialized ``Blob``s or ``Clob``s, the values of which are not captured by default in `CommandDto`.
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/PublisherService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/PublisherService.adoc
index 3350cf2..7b72a12 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/PublisherService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/PublisherService.adoc
@@ -126,8 +126,8 @@ To support these use cases several other services are involved:
 * the xref:refguide:applib-svc:MetricsService.adoc[`MetricsService`] is used to obtain the objects that are loaded throughout the transaction; this info is used in order to instantiate the `PublishedObjects` object passed through to the `PublisherService`.
 
 
-The services provided by this module combine very well with the xref:refguide:applib-svc:CommandService.adoc[`CommandService`] and with xref:refguide:applib-svc:AuditerService.adoc[`AuditerService`].
-The `CommandService` captures the __cause__ of an interaction (an action was invoked, a property was edited), while the `PublisherService` captures the __effect__ of that interaction in terms of events, and the `AuditerService` captures the effect of the interaction in terms of changed state.
+The services provided by this module combine very well with the xref:refguide:applib-svc:CommandServiceListener.adoc[`CommandServiceListener`] and with xref:refguide:applib-svc:AuditerService.adoc[`AuditerService`].
+The ``Command`` captures the __cause__ of an interaction (an action was invoked, a property was edited), while the `PublisherService` captures the __effect__ of that interaction in terms of events, and the `AuditerService` captures the effect of the interaction in terms of changed state.
 You may also want to configure the xref:refguide:applib-svc:PublisherService.adoc[`PublisherService`], which also captures the effect of the interaction but as an event.
 All three of these services collaborate implicitly by way of the xref:applib-classes:roles-mixins-contributees/contributee.adoc#HasUniqueId[`HasUniqueId`] interface.
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/about.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/about.adoc
index 0c8e6b4..57a5a6d 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/about.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/about.adoc
@@ -187,7 +187,7 @@ This captures whether the command succeeded or failed.
 The xref:extensions:command-log:about.adoc[Command Log] extension uses this to persist a log of commands, for auditing or to support regression testing with the xref:extensions:command-replay:about.adoc[Command Replay] extension.
 
 
-Implementations of xref:refguide:applib-svc:CommandService.adoc[`CommandService`] can use the `Command#getMemento()` method to obtain a XML equivalent of that `Command`, reified using the xref:refguide:schema:cmd.adoc[`cmd.xsd`] schema.
+Implementations of xref:refguide:applib-svc:CommandServiceInternal.adoc[`CommandService`] can use the `Command#getMemento()` method to obtain a XML equivalent of that `Command`, reified using the xref:refguide:schema:cmd.adoc[`cmd.xsd`] schema.
 This can be converted back into a `CommandDto` using the `CommandDtoUtils` utility class (part of the applib).
 
 Similarly, implementations of xref:refguide:applib-svc:PublisherService.adoc[`PublisherService`] can use the `InteractionDtoUtils` utility class to obtain a `InteractionDto` representing the interaction, either just for a single execution or for the entire call-graph.
diff --git a/api/applib/src/main/adoc/modules/applib-svc/partials/_application-layer-spi.adoc b/api/applib/src/main/adoc/modules/applib-svc/partials/_application-layer-spi.adoc
index 6412aca..1dc1c49 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/partials/_application-layer-spi.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/partials/_application-layer-spi.adoc
@@ -21,7 +21,7 @@ Domain service SPIs influence how the framework handles application layer concer
 
 
 
-|xref:refguide:applib-svc:CommandService.adoc[CommandService]
+|xref:refguide:applib-svc:CommandServiceInternal.adoc[CommandService]
 |Service to act as a factory and repository (create and save) of command instances, ie representations of an action invocation.
 Used for command/auditing and background services.
 |
diff --git a/api/applib/src/main/adoc/modules/applib-svc/partials/module-nav.adoc b/api/applib/src/main/adoc/modules/applib-svc/partials/module-nav.adoc
index 8cc26e4..f98b03e 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/partials/module-nav.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/partials/module-nav.adoc
@@ -11,7 +11,7 @@
 ** xref:refguide:applib-svc:ClockService.adoc[ClockService]
 ** xref:refguide:applib-svc:CommandDtoProcessorService.adoc[CommandDtoProcessorService]
 ** xref:refguide:applib-svc:CommandExecutorService.adoc[CommandExecutorService]
-** xref:refguide:applib-svc:CommandService.adoc[CommandService]
+** xref:refguide:applib-svc:CommandServiceInternal.adoc[CommandService]
 ** xref:refguide:applib-svc:CommandServiceListener.adoc[CommandServiceListener]
 ** xref:refguide:applib-svc:ConfigurationMenu.adoc[ConfigurationMenu]
 ** xref:refguide:applib-svc:ConfigurationViewService.adoc[ConfigurationViewService]
diff --git a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
index ada8693..ab4e7be 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
@@ -33,7 +33,7 @@ import org.apache.isis.applib.services.audit.AuditerServiceLogging;
 import org.apache.isis.applib.services.bookmark.BookmarkHolder_lookup;
 import org.apache.isis.applib.services.bookmark.BookmarkHolder_object;
 import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.services.command.CommandService;
+import org.apache.isis.applib.services.command.CommandServiceInternal;
 import org.apache.isis.applib.services.command.spi.CommandServiceListener;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandsDto;
@@ -73,7 +73,6 @@ import org.apache.isis.schema.IsisModuleSchema;
         AuditerServiceLogging.class,
         ClockService.class,
         CommandDtoProcessorServiceIdentity.class,
-        CommandService.class,
         CommandServiceListener.Null.class,
         ContentMappingServiceForCommandDto.class,
         ContentMappingServiceForCommandsDto.class,
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
index f8c0703..54feabc 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
@@ -27,7 +27,7 @@ import java.lang.annotation.Target;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.services.commanddto.processor.CommandDtoProcessor;
-import org.apache.isis.applib.services.command.CommandService;
+import org.apache.isis.applib.services.command.CommandServiceInternal;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandsDto;
 import org.apache.isis.applib.value.Blob;
@@ -101,7 +101,7 @@ public @interface Action {
      * The {@link CommandDtoProcessor} to process this command's DTO.
      *
      * <p>
-     *     Specifying a processor requires that the implementation of {@link CommandService} provides a
+     *     Specifying a processor requires that the implementation of {@link CommandServiceInternal} provides a
      *     custom implementation of {@link org.apache.isis.applib.services.command.Command} that additionally extends
      *     from {@link CommandWithDto}.
      * </p>
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
index dc55a40..c53302c 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
@@ -260,9 +260,18 @@ public class Command implements HasUniqueId, HasUsername, HasCommandDto {
     // end::refguide[]
 
 
+    /**
+     * Whether this command has been reified
+     */
+    // tag::refguide[]
+    @Getter
+    private boolean reified;
+    // end::refguide[]
+
     private final Updater UPDATER = new Updater();
 
     public class Updater implements CommandOutcomeHandler {
+
         /**
          * <b>NOT API</b>: intended to be called only by the framework.
          *
@@ -331,6 +340,19 @@ public class Command implements HasUniqueId, HasUsername, HasCommandDto {
         public void setSystemStateChanged(boolean systemStateChanged) {
             Command.this.systemStateChanged = systemStateChanged;
         }
+
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         * Hint that this {@link Command} has resulted in a change of state to the system.
+         * Implementations can use this to persist the command, for example.
+         * </p>
+         */
+        public void setReified(boolean reified) {
+            Command.this.reified = reified;
+        }
+
     };
 
     /**
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/command/CommandService.java b/api/applib/src/main/java/org/apache/isis/applib/services/command/CommandServiceInternal.java
similarity index 93%
rename from api/applib/src/main/java/org/apache/isis/applib/services/command/CommandService.java
rename to api/applib/src/main/java/org/apache/isis/applib/services/command/CommandServiceInternal.java
index eae10f0..780ebe6 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/command/CommandService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/command/CommandServiceInternal.java
@@ -40,13 +40,13 @@ import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Service
-@Named("isisApplib.CommandService")
+@Named("isisRuntimeServices.CommandServiceInternal")
 @Order(OrderPrecedence.MIDPOINT)
 @Primary
-@Qualifier("Default")
+@Qualifier("Internal")
 @Log4j2
 // tag::refguide[]
-public class CommandService {
+public class CommandServiceInternal {
 
     // end::refguide[]
     /**
@@ -63,6 +63,9 @@ public class CommandService {
         // ...
     // end::refguide[]
 
+        if(! command.isReified()) {
+            return;
+        }
         if(command.getLogicalMemberIdentifier() == null) {
             // eg if seed fixtures
             return;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/command/spi/CommandServiceListener.java b/api/applib/src/main/java/org/apache/isis/applib/services/command/spi/CommandServiceListener.java
index ba6b727..602c967 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/command/spi/CommandServiceListener.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/command/spi/CommandServiceListener.java
@@ -21,7 +21,6 @@ package org.apache.isis.applib.services.command.spi;
 import javax.inject.Named;
 
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -48,8 +47,8 @@ public interface CommandServiceListener {
     void onComplete(final Command command);           // <.>
 
     /**
-     * At least one implementation is required to satisfy injection point into
-     * {@link org.apache.isis.applib.services.command.CommandService}.
+     * At least one implementation is required to satisfy injection point
+     * internal to the framework.
      */
     @Service
     @Named("isisApplib.CommandServiceListenerNull")
diff --git a/core/config/src/main/adoc/modules/config/pages/sections/isis.applib.adoc b/core/config/src/main/adoc/modules/config/pages/sections/isis.applib.adoc
index 28b5b43..b3e47e1 100644
--- a/core/config/src/main/adoc/modules/config/pages/sections/isis.applib.adoc
+++ b/core/config/src/main/adoc/modules/config/pages/sections/isis.applib.adoc
@@ -44,7 +44,7 @@ isis.applib.annotation.action. +
 command
 
 | 
-| The default for whether action invocations should be reified as a ``Command`` using the ``CommandService``, either for auditing or for replayed against a secondary system, eg for regression testing.
+| The default for whether action invocations should be reified as a ``Command`` using the ``CommandServiceListener``, either for auditing or for replayed against a secondary system, eg for regression testing.
 
 This setting can be overridden on a case-by-case basis using ``Action#command()``.
 
@@ -415,7 +415,7 @@ isis.applib.annotation.property. +
 command
 
 | 
-| The default for whether property edits should be reified as a ``Command`` using the ``CommandService``, for example for auditing, or to be replayed against a secondary system, for regression testing.
+| The default for whether property edits should be reified as a ``Command`` using the ``CommandServiceListener``, for example for auditing, or to be replayed against a secondary system, for regression testing.
 
 This setting can be overridden on a case-by-case basis using ``Property#command()``.
 
diff --git a/core/config/src/main/adoc/modules/config/pages/sections/isis.persistence.jdo-datanucleus.impl.adoc b/core/config/src/main/adoc/modules/config/pages/sections/isis.persistence.jdo-datanucleus.impl.adoc
index 986e28a..2a48d4f 100644
--- a/core/config/src/main/adoc/modules/config/pages/sections/isis.persistence.jdo-datanucleus.impl.adoc
+++ b/core/config/src/main/adoc/modules/config/pages/sections/isis.persistence.jdo-datanucleus.impl.adoc
@@ -12,55 +12,6 @@ include::../section-hooks/isis.persistence.jdo-datanucleus.impl~pre.adoc[]
 |Default
 |Description
 |
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.ConnectionFactory2Name]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus. +
-ConnectionFactory2Name
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.ConnectionFactoryName]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus. +
-ConnectionFactoryName
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.ConnectionPasswordDecrypter]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus. +
-ConnectionPasswordDecrypter
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.PersistenceUnitLoadClasses]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus. +
-PersistenceUnitLoadClasses
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.cache.level2.mode]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus.cache.level2.mode
-
-| 
-| Values of javax.persistence.SharedCacheMode, capitalized
-
-
-|
 [[isis.persistence.jdo-datanucleus.impl.datanucleus.cache.level2.type]]
 isis.persistence.jdo-datanucleus. +
 impl.datanucleus.cache.level2.type
@@ -122,15 +73,6 @@ NOTE: this config property isn't used by the framework, but is provided as a con
 
 
 |
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.identifier.case]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus.identifier.case
-
-| 
-| null
-
-
-|
 [[isis.persistence.jdo-datanucleus.impl.datanucleus.object-provider.class-name]]
 isis.persistence.jdo-datanucleus. +
 impl.datanucleus.object-provider. +
@@ -145,16 +87,6 @@ See also ``json`` (camelCasing instead of kebab-casing).
 
 
 |
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.objectProvider.className]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus.objectProvider. +
-className
-
-| 
-| null
-
-
-|
 [[isis.persistence.jdo-datanucleus.impl.datanucleus.persistence-unit-load-classes]]
 isis.persistence.jdo-datanucleus. +
 impl.datanucleus. +
@@ -171,16 +103,6 @@ NOTE: this config property isn't used by the framework, but is provided as a con
 
 
 |
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus. +
-persistenceByReachabilityAtCommit
-
-| 
-| null
-
-
-|
 [[isis.persistence.jdo-datanucleus.impl.datanucleus.schema.auto-create-all]]
 isis.persistence.jdo-datanucleus. +
 impl.datanucleus.schema. +
@@ -211,26 +133,6 @@ NOTE: this config property isn't used by the framework, but is provided as a con
 
 
 |
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.schema.autoCreateAll]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus.schema. +
-autoCreateAll
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.schema.autoCreateDatabase]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus.schema. +
-autoCreateDatabase
-
-| 
-| null
-
-
-|
 [[isis.persistence.jdo-datanucleus.impl.datanucleus.schema.validate-all]]
 isis.persistence.jdo-datanucleus. +
 impl.datanucleus.schema. +
@@ -243,36 +145,6 @@ NOTE: this config property isn't used by the framework, but is provided as a con
 
 
 |
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.schema.validateAll]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus.schema. +
-validateAll
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.schema.validateConstraints]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus.schema. +
-validateConstraints
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.datanucleus.schema.validateTables]]
-isis.persistence.jdo-datanucleus. +
-impl.datanucleus.schema. +
-validateTables
-
-| 
-| null
-
-
-|
 [[isis.persistence.jdo-datanucleus.impl.datanucleus.transaction-type]]
 isis.persistence.jdo-datanucleus. +
 impl.datanucleus.transaction-type
@@ -288,56 +160,6 @@ NOTE: this config property isn't used by the framework, but is provided as a con
 
 
 |
-[[isis.persistence.jdo-datanucleus.impl.javax.jdo.PersistenceManagerFactoryClass]]
-isis.persistence.jdo-datanucleus. +
-impl.javax.jdo. +
-PersistenceManagerFactoryClass
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionDriverName]]
-isis.persistence.jdo-datanucleus. +
-impl.javax.jdo.option. +
-ConnectionDriverName
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionPassword]]
-isis.persistence.jdo-datanucleus. +
-impl.javax.jdo.option. +
-ConnectionPassword
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionURL]]
-isis.persistence.jdo-datanucleus. +
-impl.javax.jdo.option. +
-ConnectionURL
-
-| 
-| null
-
-
-|
-[[isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionUserName]]
-isis.persistence.jdo-datanucleus. +
-impl.javax.jdo.option. +
-ConnectionUserName
-
-| 
-| null
-
-
-|
 [[isis.persistence.jdo-datanucleus.impl.javax.jdo.option.connection-driver-name]]
 isis.persistence.jdo-datanucleus. +
 impl.javax.jdo.option. +
diff --git a/core/config/src/main/adoc/modules/config/pages/sections/isis.value-types.adoc b/core/config/src/main/adoc/modules/config/pages/sections/isis.value-types.adoc
index a026acc..bb8fff5 100644
--- a/core/config/src/main/adoc/modules/config/pages/sections/isis.value-types.adoc
+++ b/core/config/src/main/adoc/modules/config/pages/sections/isis.value-types.adoc
@@ -12,15 +12,6 @@ include::../section-hooks/isis.value-types~pre.adoc[]
 |Default
 |Description
 |
-[[isis.value-types.primitives.integer.format]]
-isis.value-types.primitives. +
-integer.format
-
-| 
-| null
-
-
-|
 [[isis.value-types.java-lang.byte.format]]
 isis.value-types.java-lang.byte. +
 format
diff --git a/core/config/src/main/adoc/modules/config/pages/sections/resteasy.adoc b/core/config/src/main/adoc/modules/config/pages/sections/resteasy.adoc
index 89b3857..82164f7 100644
--- a/core/config/src/main/adoc/modules/config/pages/sections/resteasy.adoc
+++ b/core/config/src/main/adoc/modules/config/pages/sections/resteasy.adoc
@@ -43,6 +43,10 @@ resteasy.jaxrs.app.registration
 | 
 | How the implementation of the JAX-RS application is discovered.
 
+There should be very little reason to change this from its default.
+
+See https://github.com/resteasy/resteasy-spring-boot/blob/master/mds/USAGE.md#jax-rs-application-registration-methods[here] for more details.
+
 
 |
 [[resteasy.jaxrs.default-path]]
@@ -55,14 +59,6 @@ Note that this is used rather than ``prefix`` because there is _NO_ implementati
 
 
 |
-[[resteasy.jaxrs.defaultPath]]
-resteasy.jaxrs.defaultPath
-
-| 
-| The path at which the RO viewer should be mounted.
-
-
-|
 [[resteasy.resteasy-settings]]
 resteasy.resteasy-settings
 
diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index 9510e28..f33acf3 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -40,7 +40,6 @@ import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import javax.activation.DataSource;
-import javax.annotation.RegEx;
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.validation.Constraint;
@@ -60,7 +59,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.services.audit.AuditerService;
-import org.apache.isis.applib.services.command.CommandService;
+import org.apache.isis.applib.services.command.CommandServiceInternal;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.publish.PublishedObjects;
@@ -649,9 +648,10 @@ public class IsisConfiguration {
             public static class Action {
 
                 /**
-                 * The default for whether action invocations should be reified as a
-                 * {@link org.apache.isis.applib.services.command.Command} using the
-                 * {@link CommandService},
+                 * The default for whether action invocations should be reified
+                 * as a {@link org.apache.isis.applib.services.command.Command},
+                 * to be sent to any registered
+                 * {@link org.apache.isis.applib.services.command.spi.CommandServiceListener}s,
                  * either for auditing or for replayed against a secondary
                  * system, eg for regression testing.
                  *
@@ -830,10 +830,11 @@ public class IsisConfiguration {
 
                 /**
                  * The default for whether property edits should be reified as a
-                 * {@link org.apache.isis.applib.services.command.Command} using the
-                 * {@link CommandService},
-                 * for example for auditing, or to be replayed against a
-                 * secondary system, for regression testing.
+                 * as a {@link org.apache.isis.applib.services.command.Command},
+                 * to be sent to any registered
+                 * {@link org.apache.isis.applib.services.command.spi.CommandServiceListener}s,
+                 * either for auditing or for replayed against a secondary
+                 * system, eg for regression testing.
                  *
                  * <p>
                  *  This setting can be overridden on a case-by-case basis using
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 3313697..0a4085b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -34,7 +34,7 @@ import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.command.CommandService;
+import org.apache.isis.applib.services.command.CommandServiceInternal;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.Interaction.ActionInvocation;
 import org.apache.isis.applib.services.iactn.InteractionContext;
@@ -53,6 +53,7 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
@@ -160,6 +161,8 @@ implements ImperativeFacet {
         val interactionContext = getInteractionContext();
         val interaction = interactionContext.getInteraction();
         val command = interaction.getCommand();
+        val commandFacet = getFacetHolder().getFacet(CommandFacet.class);
+        command.updater().setReified(commandFacet != null);
 
         val actionId = owningAction.getIdentifier().toClassAndNameIdentityString();
 
@@ -362,10 +365,6 @@ implements ImperativeFacet {
         return serviceRegistry.lookupServiceElseFail(QueryResultsCache.class);
     }
 
-    private CommandService getCommandService() {
-        return serviceRegistry.lookupServiceElseFail(CommandService.class);
-    }
-
     private ClockService getClockService() {
         return serviceRegistry.lookupServiceElseFail(ClockService.class);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
index 40de553..abd5cde 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
@@ -26,17 +26,17 @@ import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.command.CommandService;
+import org.apache.isis.applib.services.command.CommandServiceInternal;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.applib.services.metrics.MetricsService;
-import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropertyFacet;
@@ -260,6 +260,8 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
         if( command==null ) {
             return head.getTarget();
         }
+        val commandFacet = getFacetHolder().getFacet(CommandFacet.class);
+        command.updater().setReified(commandFacet != null);
 
         val propertyId = owningProperty.getIdentifier().toClassAndNameIdentityString();
 
@@ -321,10 +323,6 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
         return getServiceRegistry().lookupServiceElseFail(InteractionContext.class);
     }
 
-    private CommandService getCommandService() {
-        return getServiceRegistry().lookupServiceElseFail(CommandService.class);
-    }
-
     private ClockService getClockService() {
         return getServiceRegistry().lookupServiceElseFail(ClockService.class);
     }
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/CommandService.adoc b/core/runtimeservices/src/main/adoc/modules/runtime-services/pages/CommandServiceInternal.adoc
similarity index 78%
rename from api/applib/src/main/adoc/modules/applib-svc/pages/CommandService.adoc
rename to core/runtimeservices/src/main/adoc/modules/runtime-services/pages/CommandServiceInternal.adoc
index 686609f..5a7b73f 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/CommandService.adoc
+++ b/core/runtimeservices/src/main/adoc/modules/runtime-services/pages/CommandServiceInternal.adoc
@@ -4,5 +4,5 @@
 :page-partial:
 
 
-The `CommandService` service is an internal service whose responsibility is simply to notify all known xref:CommandServiceListener.adoc[`CommandServiceListener`] when the `Command` has completed.
+The `CommandServiceInternal` service is an internal service whose responsibility is simply to notify all known xref:refguide:applib-svc:CommandServiceListener.adoc[`CommandServiceListener`] when the `Command` has completed.
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java
index 34db8ee..5fa6705 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java
@@ -26,6 +26,7 @@ import org.springframework.context.annotation.Import;
 import org.springframework.core.OrderComparator;
 import org.springframework.core.annotation.AnnotationAwareOrderComparator;
 
+import org.apache.isis.applib.services.command.CommandServiceInternal;
 import org.apache.isis.core.codegen.bytebuddy.IsisModuleCoreCodegenByteBuddy;
 import org.apache.isis.core.runtime.IsisModuleCoreRuntime;
 import org.apache.isis.core.runtimeservices.bookmarks.BookmarkServiceDefault;
@@ -69,6 +70,7 @@ import org.apache.isis.core.runtimeservices.xmlsnapshot.XmlSnapshotServiceDefaul
         BookmarkServiceDefault.class,
         CommandDtoServiceInternalDefault.class,
         CommandExecutorServiceDefault.class,
+        CommandServiceInternal.class,
         ConfigurationViewServiceDefault.class,
         EmailNotificationServiceDefault.class,
         EmailServiceDefault.class,
diff --git a/extensions/core/command-log/adoc/modules/command-log/pages/about.adoc b/extensions/core/command-log/adoc/modules/command-log/pages/about.adoc
index a5cd1f0..d30b851 100644
--- a/extensions/core/command-log/adoc/modules/command-log/pages/about.adoc
+++ b/extensions/core/command-log/adoc/modules/command-log/pages/about.adoc
@@ -13,7 +13,7 @@ It further provides a number of supporting services:
 * `org.isisaddons.module.command.dom.CommandServiceJdoContributions` contributes actions for searching for persisted child and sibling ``Command``s.
 
 //* implementation of the
-//xref:refguide:applib-svc:CommandService.adoc[`BackgroundCommandService`].
+//xref:refguide:applib-svc:CommandServiceInternal.adoc[`BackgroundCommandService`].
 
 All of these can be activated by updating the `pom.xml` and updating the `AppManifest#getModules()` method.
 
@@ -25,8 +25,8 @@ If contributions are not required in the UI, these can be suppressed either usin
 
 WARNING: TODO: v2 - this is to move into the xref:mappings:ROOT:about.adoc[mappings catalogue].
 
-The xref:extensions:command-log:about.adoc[Command Log] extension provides an implementation of this service (`CommandService`), and also provides a number of related domain services (`CommandJdoRepository` and `CommandServiceJdoContributions`).
-//This module also provides service implementations of the xref:refguide:applib-svc:CommandService.adoc[`BackgroundCommandService`].
+The xref:extensions:command-log:about.adoc[Command Log] extension provides an implementation of the service (`CommandServiceListener`), and also provides a number of related domain services (`CommandJdoRepository` and `CommandServiceJdoContributions`).
+//This module also provides service implementations of the xref:refguide:applib-svc:CommandServiceInternal.adoc[`BackgroundCommandService`].
 
 
 
diff --git a/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc b/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc
index 72e3818..7efd4db 100644
--- a/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc
+++ b/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc
@@ -32,7 +32,7 @@ The typical way to indicate that an object should be audited is to annotate it w
 The auditing service works very well with implementations of xref:refguide:applib-svc:PublisherService.adoc[`PublisherService`] that persist the ``Interaction.Execution`` objects obtained from the xref:refguide:applib-svc:InteractionContext.adoc[`InteractionContext`] service.
 The interaction execution captures the _cause_ of an interaction (an action was invoked, a property was edited), while the `AuditerService` audit entries capture the _effect_ of that interaction in terms of changed state.
 
-The xref:refguide:applib-svc:CommandService.adoc[`CommandService`] can also be combined with the auditer service, however
+The xref:refguide:applib-svc:CommandServiceInternal.adoc[`CommandService`] can also be combined with the auditer service, however
 ``Command``s are primarily concerned with capture the _intent_ of an action, not the actual action invocation itself.
 
 
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java
index 738e931..c3233a8 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java
@@ -26,7 +26,7 @@ import javax.jdo.PersistenceManager;
 import javax.jdo.PersistenceManagerFactory;
 
 import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.services.command.CommandService;
+import org.apache.isis.applib.services.command.CommandServiceInternal;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.applib.services.inject.ServiceInjector;
@@ -63,7 +63,7 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
     @Getter protected final MetaModelContext metaModelContext;
     protected final ServiceInjector serviceInjector;
     protected final ServiceRegistry serviceRegistry;
-    protected final CommandService commandService;
+    protected final CommandServiceInternal commandServiceInternal;
     protected final FactoryService factoryService;
     protected final ClockService clockService;
     protected final UserService userService;
@@ -115,8 +115,7 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
         this.configuration = metaModelContext.getConfiguration();
         this.specificationLoader = metaModelContext.getSpecificationLoader();
 
-        
-        this.commandService = lookupService(CommandService.class);
+        this.commandServiceInternal = lookupService(CommandServiceInternal.class);
         this.factoryService = lookupService(FactoryService.class);
         this.clockService = lookupService(ClockService.class);
         this.userService = lookupService(UserService.class);
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
index 9e62746..a9af90a 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
@@ -234,7 +234,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             command.updater().setCompletedAt(completedAt);
         }
 
-        commandService.complete(command);
+        commandServiceInternal.complete(command);
 
         interaction.clear();
     }
diff --git a/security/adoc/modules/ROOT/pages/about.adoc b/security/adoc/modules/ROOT/pages/about.adoc
index 1fcc10e..d9d1abc 100644
--- a/security/adoc/modules/ROOT/pages/about.adoc
+++ b/security/adoc/modules/ROOT/pages/about.adoc
@@ -58,6 +58,6 @@ When ``Interaction``s are persisted (eg by way of the xref:mappings:outbox-publi
 traceability.
 The xref:security:audit-trail:about.adoc[Auditer] module provides an implementation of the `AuditerService`.
 
-For xref:refguide:applib-svc:CommandService.adoc[`CommandService`] can be also be used to capture actions, for example using the xref:extensions:command-log:about.adoc[Command Log] extension.
+For xref:refguide:applib-svc:CommandServiceInternal.adoc[`CommandService`] can be also be used to capture actions, for example using the xref:extensions:command-log:about.adoc[Command Log] extension.
 ====