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 2019/12/07 08:02:30 UTC

[isis] branch master updated (ebcec83 -> 9836120)

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

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


    from ebcec83  ISIS-2158: rename IsisBootSse -> IsisModuleExtSse
     new 5fddbb8  ISIS-2217: renames Module to ModuleWithFixtures
     new 2f47acc  ISIS-2216: adds @Named for isis extensions
     new 244b6d1  ISIS-2216: adds @Ordered and @Primary
     new 7d0021e  ISIS-2216: adds @Qualifier to all services.
     new 9836120  ISIS-2216: comments, is all.

The 5 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:
 .../org/apache/isis/applib/IsisModuleApplib.java   |  4 +-
 .../isis/applib/annotation/OrderPrecedence.java    | 58 ++++++++++++++++
 .../isis/applib/mixins/dto/DtoMappingHelper.java   |  9 ++-
 .../services/audit/AuditerServiceLogging.java      |  6 ++
 .../isis/applib/services/clock/ClockService.java   |  7 ++
 .../applib/services/command/CommandContext.java    |  8 ++-
 .../ContentMappingServiceForCommandDto.java        |  9 ++-
 .../ContentMappingServiceForCommandsDto.java       |  7 ++
 .../applib/services/iactn/InteractionContext.java  |  7 ++
 .../applib/services/jaxb/JaxbServiceDefault.java   |  7 ++
 .../services/publish/PublisherServiceLogging.java  |  7 ++
 ...Internal.java => QueryResultsCacheDefault.java} |  9 ++-
 .../applib/services/scratchpad/Scratchpad.java     |  7 ++
 .../services/tablecol/TableColumnOrderService.java |  7 ++
 .../UrlEncodingServiceWithCompression.java         |  9 ++-
 .../environment/IsisSystemEnvironment.java         |  8 ++-
 .../config/viewer/wicket/WebAppConfiguration.java  |  7 ++
 ...ctionInvocationFacetForDomainEventAbstract.java |  6 +-
 .../autocomplete/AutoCompleteFacetAbstract.java    |  8 +--
 ...tySetterOrClearFacetForDomainEventAbstract.java |  6 +-
 .../objectmanager/ObjectManagerDefault.java        |  7 ++
 .../metamodel/services/ServiceInjectorDefault.java |  7 ++
 .../appfeat/ApplicationFeatureFactory.java         |  9 ++-
 .../services/events/MetamodelEventService.java     |  8 ++-
 .../exceprecog/ExceptionRecognizerDocDefault.java  | 13 ++--
 .../services/grid/GridLoaderServiceDefault.java    |  9 ++-
 .../services/grid/GridReaderUsingJaxb.java         |  7 ++
 .../services/grid/GridServiceDefault.java          |  8 ++-
 .../grid/bootstrap3/GridSystemServiceBS3.java      |  8 ++-
 .../services/layout/LayoutServiceDefault.java      |  7 ++
 .../metamodel/MetaModelServiceDefault.java         |  7 ++
 ...Internal.java => PublisherDispatchService.java} |  2 +-
 .../services/registry/ServiceRegistryDefault.java  | 12 ++--
 .../services/swagger/SwaggerServiceDefault.java    |  7 ++
 .../services/title/TitleServiceDefault.java        |  7 ++
 .../services/user/UserServiceDefault.java          | 11 +++-
 .../specloader/InjectorMethodEvaluatorDefault.java |  7 ++
 .../specloader/ProgrammingModelServiceDefault.java |  7 ++
 .../specloader/SpecificationLoaderDefault.java     |  7 ++
 .../specimpl/OneToManyAssociationMixedIn.java      |  8 +--
 .../specimpl/OneToOneAssociationMixedIn.java       |  8 +--
 .../datanucleus/DataNucleusSettings.java           | 10 +++
 .../service/JdoPersistenceLifecycleService.java    | 12 +++-
 ...eptionRecognizerCompositeForJdoObjectStore.java |  9 ++-
 .../datanucleus5/jdosupport/IsisJdoSupportDN5.java | 12 ++++
 .../metrics/MetricsServiceDefault.java             | 14 ++--
 .../persistence/IsisPersistenceSessionJdoBase.java |  7 +-
 .../IsisPlatformTransactionManagerForJdo.java      | 11 +++-
 .../persistence/IsisTransactionJdo.java            | 16 ++---
 .../persistence/PersistenceSessionFactory5.java    | 13 +++-
 .../services/IsisModuleRuntimeServices.java        |  8 +--
 .../auth/AuthenticationSessionProviderDefault.java |  7 ++
 ...ndard.java => AuthorizationManagerDefault.java} | 11 +++-
 .../background/CommandExecutorServiceDefault.java  |  7 ++
 .../bookmarks/BookmarkServiceInternalDefault.java  |  7 ++
 .../command/CommandDtoServiceInternalDefault.java  |  9 ++-
 .../services/command/CommandServiceDefault.java    |  7 ++
 .../confmenu/ConfigurationViewServiceDefault.java  | 10 ++-
 .../services/email/EmailServiceDefault.java        |  9 ++-
 .../services/eventbus/EventBusServiceSpring.java   |  7 ++
 .../services/factory/FactoryServiceDefault.java    |  7 ++
 .../homepage/HomePageResolverServiceDefault.java   | 11 ++--
 .../services/i18n/po/TranslationServicePo.java     |  7 ++
 .../ixn/InteractionDtoServiceInternalDefault.java  |  9 ++-
 .../menubars/MenuBarsLoaderServiceDefault.java     |  7 ++
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |  7 ++
 .../services/message/MessageServiceDefault.java    |  7 ++
 ...t.java => PublisherDispatchServiceDefault.java} | 20 ++++--
 .../sessmgmt/SessionManagementServiceDefault.java  |  7 ++
 .../runtime/services/sudo/SudoServiceDefault.java  |  9 ++-
 .../userprof/UserProfileServiceDefault.java        |  9 ++-
 .../userreg/EmailNotificationServiceDefault.java   |  9 ++-
 .../services/wrapper/WrapperFactoryDefault.java    |  7 ++
 .../services/xactn/TransactionServiceSpring.java   |  7 ++
 .../xmlsnapshot/XmlSnapshotServiceDefault.java     |  7 ++
 .../org/apache/isis/runtime/IsisModuleRuntime.java |  8 +--
 .../context/session/RuntimeEventService.java       | 10 +++
 .../events/PersistenceEventService.java            | 10 +++
 .../persistence/events/TimestampService.java       |  8 ++-
 .../system/session/IsisSessionFactoryDefault.java  |  7 ++
 ...ceInternal.java => AuditerDispatchService.java} | 17 +++--
 ...iceInternal.java => ChangedObjectsService.java} | 13 +++-
 .../system/transaction/PreAndPostValues.java       |  4 +-
 .../isis/security/api/IsisModuleSecurityApi.java   |  4 +-
 .../api/authentication/AuthenticationSession.java  |  4 +-
 .../AuthenticationRequestLogonFixture.java         |  4 +-
 ...dard.java => AuthenticationManagerDefault.java} | 19 ++++--
 ...rdAuthenticationManager_AuthenticationTest.java |  6 +-
 ...rdAuthenticationManager_AuthenticatorsTest.java |  8 +--
 .../keycloak/webmodule/WebModuleKeycloak.java      | 10 ++-
 .../security/shiro/webmodule/WebModuleShiro.java   | 13 +++-
 .../rendering/domainobjects/JsonValueEncoder.java  | 14 +++-
 .../RepresentationServiceContentNegotiator.java    | 52 +++++++--------
 .../acceptheader/AcceptHeaderServiceForRest.java   |  9 ++-
 ...entNegotiationServiceForRestfulObjectsV1_0.java |  9 ++-
 .../ContentNegotiationServiceOrgApacheIsisV1.java  |  7 +-
 .../ContentNegotiationServiceXRoDomainType.java    | 11 +++-
 .../viewer/webmodule/WebModuleRestfulObjects.java  |  7 +-
 .../themepicker/IsisWicketThemeSupportDefault.java | 12 +++-
 .../ComponentFactoryRegistrarDefault.java          | 13 ++++
 .../ComponentFactoryRegistryDefault.java           | 11 ++++
 .../registries/pages/PageClassListDefault.java     | 13 ++++
 .../registries/pages/PageClassRegistryDefault.java | 12 ++++
 .../pages/PageNavigationServiceDefault.java        | 12 ++++
 .../viewer/services/BookmarkUiServiceWicket.java   |  6 ++
 .../viewer/services/DeepLinkServiceWicket.java     | 11 ++++
 .../services/HintStoreUsingWicketSession.java      |  6 ++
 .../services/ImageResourceCacheClassPath.java      | 12 ++++
 .../viewer/services/LocaleProviderWicket.java      | 12 ++++
 .../services/TranslationsResolverWicket.java       | 11 +++-
 .../services/WicketViewerSettingsDefault.java      | 11 ++++
 .../mementos/ObjectMementoServiceWicket.java       |  9 ++-
 .../wicket/viewer/webmodule/WebModuleWicket.java   | 12 +++-
 .../logonlog/WebModuleLogOnExceptionLogger.java    | 12 +++-
 .../templresources/WebModuleTemplateResources.java | 11 +++-
 .../error/service/DemoErrorReportingService.java   |  2 +
 .../java/demoapp/dom/events/EventSubscriber.java   |  2 +
 .../main/java/demoapp/dom/jee/JeeDemoService.java  |  6 ++
 .../demoapp/utils/LibraryPreloadingService.java    |  4 ++
 .../isis/testdomain/rest/RestEndpointService.java  |  3 +-
 .../testdomain/bootstrapping/builtin-IsisBoot.list |  2 +-
 .../bootstrapping/builtin-domain-services.list     |  2 +-
 .../bootstrapping/builtin-requestscoped.list       |  2 +-
 .../bootstrapping/builtin-singleton.list           |  2 +-
 .../spring/service/SpringBeansService.java         |  8 +++
 .../dom/services/calendar/CalendarService.java     |  9 ++-
 .../isis/extensions/excel/dom/ExcelService.java    |  9 ++-
 .../fixture/IsisModuleExtFakeDataFixtures.java     |  4 +-
 .../fakedata/dom/services/FakeDataService.java     | 11 +++-
 .../dom/webmodule/WebModuleH2Console.java          | 10 ++-
 .../PasswordEncryptionServiceUsingJBcrypt.java     | 11 ++++
 .../permission/ApplicationPermissionFactory.java   | 14 +++-
 .../jdo/dom/role/ApplicationRoleFactory.java       | 13 +++-
 .../jdo/dom/tenancy/ApplicationTenancyFactory.java | 13 +++-
 .../jdo/dom/user/ApplicationUserFactory.java       | 13 +++-
 .../secman/jdo/seed/SeedSecurityModuleService.java | 11 +++-
 .../services/SecurityRealmServiceUsingShiro.java   |  9 +++
 .../fixtures/FixturesLifecycleService.java         | 13 +++-
 .../extensions/fixtures/IsisModuleExtFixtures.java | 10 ++-
 .../fixturescripts/ExecutionParametersService.java | 13 ++++
 ...l.java => QueryResultsCacheControlDefault.java} | 15 ++++-
 .../fixtures/modules/ModuleFixtureService.java     | 54 ---------------
 .../{Module.java => ModuleWithFixtures.java}       |  6 +-
 ...Service.java => ModuleWithFixturesService.java} | 77 ++++++++++++++++------
 .../isis/extensions/sse/IsisModuleExtSse.java      |  9 ++-
 .../extensions/sse/services/SseServiceDefault.java | 13 +++-
 .../sse/webmodule/WebModuleServerSentEvents.java   | 10 ++-
 .../isis/legacy/applib/DomainObjectContainer.java  |  9 ++-
 148 files changed, 1208 insertions(+), 299 deletions(-)
 create mode 100644 core/applib/src/main/java/org/apache/isis/applib/annotation/OrderPrecedence.java
 rename core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/{QueryResultsCacheInternal.java => QueryResultsCacheDefault.java} (93%)
 rename core/metamodel/src/main/java/org/apache/isis/metamodel/services/publishing/{PublishingServiceInternal.java => PublisherDispatchService.java} (97%)
 rename core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/{AuthorizationManagerStandard.java => AuthorizationManagerDefault.java} (89%)
 rename core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/{PublishingServiceInternalDefault.java => PublisherDispatchServiceDefault.java} (91%)
 rename core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/{AuditingServiceInternal.java => AuditerDispatchService.java} (88%)
 rename core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/{ChangedObjectsServiceInternal.java => ChangedObjectsService.java} (96%)
 rename core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/{AuthenticationManagerStandard.java => AuthenticationManagerDefault.java} (89%)
 rename extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/{QueryResultsCacheControlInternal.java => QueryResultsCacheControlDefault.java} (78%)
 delete mode 100644 extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleFixtureService.java
 rename extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/{Module.java => ModuleWithFixtures.java} (90%)
 rename extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/{ModuleService.java => ModuleWithFixturesService.java} (61%)


[isis] 05/05: ISIS-2216: comments, is all.

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

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

commit 9836120aae0a4b704f0bf712a9a3fe19e238cc5b
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Dec 7 07:44:04 2019 +0000

    ISIS-2216: comments, is all.
---
 .../java/org/apache/isis/extensions/sse/IsisModuleExtSse.java    | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/IsisModuleExtSse.java b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/IsisModuleExtSse.java
index c130b6f..da790e7 100644
--- a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/IsisModuleExtSse.java
+++ b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/IsisModuleExtSse.java
@@ -26,9 +26,12 @@ import org.apache.isis.extensions.sse.services.SseServiceDefault;
 
 @Configuration
 @Import({
-    SseMetaModelPlugin.class,
-    SseServiceDefault.class,
-    WebModuleServerSentEvents.class
+        // @Component's
+        SseMetaModelPlugin.class,
+
+        // @Service's
+        SseServiceDefault.class,
+        WebModuleServerSentEvents.class
 })
 public class IsisModuleExtSse {
 


[isis] 02/05: ISIS-2216: adds @Named for isis extensions

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

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

commit 2f47acc4db334a4deecc95f933fabbb6fb1843f0
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Dec 6 16:17:57 2019 +0000

    ISIS-2216: adds @Named for isis extensions
    
    Also ISIS-2217 : combined ModuleFixtureService and ModuleService, renamed to ModuleWithFixturesService
---
 .../spring/service/SpringBeansService.java         |  3 ++
 .../isis/extensions/excel/dom/ExcelService.java    |  2 +-
 .../fakedata/dom/services/FakeDataService.java     |  2 +-
 .../dom/webmodule/WebModuleH2Console.java          |  7 ++-
 .../PasswordEncryptionServiceUsingJBcrypt.java     |  6 +++
 .../permission/ApplicationPermissionFactory.java   |  8 +++-
 .../jdo/dom/role/ApplicationRoleFactory.java       |  8 +++-
 .../jdo/dom/tenancy/ApplicationTenancyFactory.java |  8 +++-
 .../jdo/dom/user/ApplicationUserFactory.java       |  8 +++-
 .../secman/jdo/seed/SeedSecurityModuleService.java |  5 ++-
 .../services/SecurityRealmServiceUsingShiro.java   |  4 ++
 .../fixtures/FixturesLifecycleService.java         |  5 +++
 .../extensions/fixtures/IsisModuleExtFixtures.java |  6 +--
 .../fixturescripts/ExecutionParametersService.java |  6 +++
 .../QueryResultsCacheControlInternal.java          |  6 +++
 .../fixtures/modules/ModuleFixtureService.java     | 52 ----------------------
 ...Service.java => ModuleWithFixturesService.java} | 36 ++++++++++++++-
 .../extensions/sse/services/SseServiceDefault.java |  5 ++-
 .../sse/webmodule/WebModuleServerSentEvents.java   |  7 ++-
 19 files changed, 116 insertions(+), 68 deletions(-)

diff --git a/extensions/core/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java b/extensions/core/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java
index 284cf16..532014e 100644
--- a/extensions/core/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java
+++ b/extensions/core/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java
@@ -23,6 +23,8 @@ import lombok.extern.log4j.Log4j2;
 
 import java.util.*;
 
+import javax.inject.Named;
+
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.stereotype.Service;
@@ -31,6 +33,7 @@ import org.springframework.stereotype.Service;
  * Borrowed from BeansEndpoint.
  */
 @Service
+@Named("isisExtSpring.SpringBeansService")
 @Log4j2
 public class SpringBeansService {
 
diff --git a/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/ExcelService.java b/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/ExcelService.java
index 802bf9f..237e20c 100644
--- a/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/ExcelService.java
+++ b/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/ExcelService.java
@@ -26,7 +26,7 @@ import org.apache.isis.extensions.excel.dom.util.Mode;
 import org.springframework.stereotype.Service;
 
 @Service
-@Named("isisExtExcel.excelService")
+@Named("isisExtExcel.ExcelService")
 @Log4j2
 public class ExcelService {
 
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/apache/isis/extensions/fakedata/dom/services/FakeDataService.java b/extensions/lib/fakedata/impl/src/main/java/org/apache/isis/extensions/fakedata/dom/services/FakeDataService.java
index adefcc0..37fc981 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/apache/isis/extensions/fakedata/dom/services/FakeDataService.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/apache/isis/extensions/fakedata/dom/services/FakeDataService.java
@@ -19,7 +19,7 @@ import org.apache.isis.applib.services.repository.RepositoryService;
 import org.springframework.stereotype.Service;
 
 @Service
-@Named("isisExtFakeData.fakeDataService")
+@Named("isisExtFakeData.FakeDataService")
 @Log4j2
 public class FakeDataService {
 
diff --git a/extensions/persistence/h2console/src/main/java/org/apache/isis/extensions/h2console/dom/webmodule/WebModuleH2Console.java b/extensions/persistence/h2console/src/main/java/org/apache/isis/extensions/h2console/dom/webmodule/WebModuleH2Console.java
index 2ede2ed..9d0132a 100644
--- a/extensions/persistence/h2console/src/main/java/org/apache/isis/extensions/h2console/dom/webmodule/WebModuleH2Console.java
+++ b/extensions/persistence/h2console/src/main/java/org/apache/isis/extensions/h2console/dom/webmodule/WebModuleH2Console.java
@@ -19,6 +19,7 @@
 package org.apache.isis.extensions.h2console.dom.webmodule;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
@@ -35,9 +36,13 @@ import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
 
 import lombok.Getter;
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
-@Service @Order(0)
+@Service
+@Named("isisExtH2Console.WebModuleH2Console")
+@Order(0)
+@Log4j2
 public class WebModuleH2Console implements WebModule  {
 
     private final static String SERVLET_NAME = "H2Console";
diff --git a/extensions/security/secman/encryption-jbcrypt/src/main/java/org/apache/isis/extensions/secman/encryption/jbcrypt/services/PasswordEncryptionServiceUsingJBcrypt.java b/extensions/security/secman/encryption-jbcrypt/src/main/java/org/apache/isis/extensions/secman/encryption/jbcrypt/services/PasswordEncryptionServiceUsingJBcrypt.java
index f1f7e1d..754afc2 100644
--- a/extensions/security/secman/encryption-jbcrypt/src/main/java/org/apache/isis/extensions/secman/encryption/jbcrypt/services/PasswordEncryptionServiceUsingJBcrypt.java
+++ b/extensions/security/secman/encryption-jbcrypt/src/main/java/org/apache/isis/extensions/secman/encryption/jbcrypt/services/PasswordEncryptionServiceUsingJBcrypt.java
@@ -18,12 +18,18 @@
  */
 package org.apache.isis.extensions.secman.encryption.jbcrypt.services;
 
+import lombok.extern.log4j.Log4j2;
+
+import javax.inject.Named;
+
 import org.mindrot.jbcrypt.BCrypt;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.extensions.secman.api.encryption.PasswordEncryptionService;
 
 @Service
+@Named("isisExtSecman.PasswordEncryptionServiceUsingJBcrypt")
+@Log4j2
 public class PasswordEncryptionServiceUsingJBcrypt implements PasswordEncryptionService {
 
     private String salt;
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionFactory.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionFactory.java
index 52293bb..cef4df4 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionFactory.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionFactory.java
@@ -19,7 +19,10 @@
 package org.apache.isis.extensions.secman.jdo.dom.permission;
 
 
+import lombok.extern.log4j.Log4j2;
+
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
@@ -56,7 +59,10 @@ public interface ApplicationPermissionFactory {
 
     public ApplicationPermission newApplicationPermission();
 
-    @Service @Order(Ordered.LOWEST_PRECEDENCE)
+    @Service
+    @Named("isisExtSecman.ApplicationPermissionFactory.Default")
+    @Order(Ordered.LOWEST_PRECEDENCE)
+    @Log4j2
     public static class Default implements ApplicationPermissionFactory {
 
         @Override
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleFactory.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleFactory.java
index 8544c48..230d4e4 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleFactory.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleFactory.java
@@ -18,7 +18,10 @@
  */
 package org.apache.isis.extensions.secman.jdo.dom.role;
 
+import lombok.extern.log4j.Log4j2;
+
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
@@ -55,7 +58,10 @@ public interface ApplicationRoleFactory {
 
     public ApplicationRole newApplicationRole();
 
-    @Service @Order(Ordered.LOWEST_PRECEDENCE)
+    @Service
+    @Named("isisExtSecman.ApplicationRoleFactory.Default")
+    @Order(Ordered.LOWEST_PRECEDENCE)
+    @Log4j2
     public static class Default implements ApplicationRoleFactory {
 
         @Override
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyFactory.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyFactory.java
index d8be332..9e7759c 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyFactory.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyFactory.java
@@ -18,7 +18,10 @@
  */
 package org.apache.isis.extensions.secman.jdo.dom.tenancy;
 
+import lombok.extern.log4j.Log4j2;
+
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
@@ -55,7 +58,10 @@ public interface ApplicationTenancyFactory {
 
     public ApplicationTenancy newApplicationTenancy();
 
-    @Service @Order(Ordered.LOWEST_PRECEDENCE)
+    @Service
+    @Named("isisExtSecman.ApplicationTenancyFactory.Default")
+    @Order(Ordered.LOWEST_PRECEDENCE)
+    @Log4j2
     public static class Default implements ApplicationTenancyFactory {
 
         @Override
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserFactory.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserFactory.java
index 3a9664b..fcb3121 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserFactory.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserFactory.java
@@ -18,7 +18,10 @@
  */
 package org.apache.isis.extensions.secman.jdo.dom.user;
 
+import lombok.extern.log4j.Log4j2;
+
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
@@ -55,7 +58,10 @@ public interface ApplicationUserFactory {
 
     public ApplicationUser newApplicationUser();
 
-    @Service @Order(Ordered.LOWEST_PRECEDENCE)
+    @Service
+    @Named("isisExtSecman.ApplicationUserFactory.Default")
+    @Order(Ordered.LOWEST_PRECEDENCE)
+    @Log4j2
     public static class Default implements ApplicationUserFactory {
 
         @Override
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java
index 353fddc..a542e92 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java
@@ -19,6 +19,7 @@
 package org.apache.isis.extensions.secman.jdo.seed;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
@@ -30,7 +31,9 @@ import org.apache.isis.runtime.system.context.session.AppLifecycleEvent;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Service @Log4j2
+@Service
+@Named("isisExtSecman.SeedSecurityModuleService")
+@Log4j2
 public class SeedSecurityModuleService {
 
     @Inject private FixtureScripts fixtureScripts;
diff --git a/extensions/security/secman/realm-shiro/src/main/java/org/apache/isis/extensions/secman/shiro/services/SecurityRealmServiceUsingShiro.java b/extensions/security/secman/realm-shiro/src/main/java/org/apache/isis/extensions/secman/shiro/services/SecurityRealmServiceUsingShiro.java
index 02dea6c..a7605d2 100644
--- a/extensions/security/secman/realm-shiro/src/main/java/org/apache/isis/extensions/secman/shiro/services/SecurityRealmServiceUsingShiro.java
+++ b/extensions/security/secman/realm-shiro/src/main/java/org/apache/isis/extensions/secman/shiro/services/SecurityRealmServiceUsingShiro.java
@@ -19,6 +19,7 @@
 package org.apache.isis.extensions.secman.shiro.services;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.apache.isis.extensions.secman.shiro.util.ShiroUtils;
 import org.springframework.stereotype.Service;
@@ -27,9 +28,12 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.extensions.secman.api.SecurityRealm;
 import org.apache.isis.extensions.secman.api.SecurityRealmService;
 
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 @Service
+@Named("isisExtSecman.SecurityRealmServiceUsingShiro")
+@Log4j2
 public class SecurityRealmServiceUsingShiro implements SecurityRealmService {
     
     @Inject private ServiceInjector serviceInjector;
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecycleService.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecycleService.java
index 9da92de..2bf8292 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecycleService.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecycleService.java
@@ -18,9 +18,12 @@
  */
 package org.apache.isis.extensions.fixtures;
 
+import lombok.extern.log4j.Log4j2;
+
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.springframework.stereotype.Service;
 
@@ -31,6 +34,8 @@ import org.apache.isis.extensions.fixtures.legacy.FixtureClock;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 
 @Service
+@Named("isisExtFixtures.FixturesLifecycleService")
+@Log4j2
 public class FixturesLifecycleService {
 
     @Inject IsisSessionFactory isisSessionFactory; // depends on  
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisModuleExtFixtures.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisModuleExtFixtures.java
index 1eb9fb5..ab0a011 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisModuleExtFixtures.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisModuleExtFixtures.java
@@ -21,8 +21,7 @@ package org.apache.isis.extensions.fixtures;
 import org.apache.isis.extensions.fixtures.fixturescripts.ExecutionParametersService;
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
 import org.apache.isis.extensions.fixtures.legacy.queryresultscache.QueryResultsCacheControlInternal;
-import org.apache.isis.extensions.fixtures.modules.ModuleFixtureService;
-import org.apache.isis.extensions.fixtures.modules.ModuleService;
+import org.apache.isis.extensions.fixtures.modules.ModuleWithFixturesService;
 import org.apache.isis.extensions.spring.IsisModuleExtSpring;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
@@ -35,12 +34,11 @@ import org.springframework.context.annotation.Import;
         // @Service's
         FixturesLifecycleService.class,
         ExecutionParametersService.class,
-        ModuleService.class,
+        ModuleWithFixturesService.class,
         QueryResultsCacheControlInternal.class,
 
         // @DomainService's
         FixtureScripts.class,
-        ModuleFixtureService.class
 })
 public class IsisModuleExtFixtures {
 
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java
index a6d65b2..05f92f3 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java
@@ -18,6 +18,10 @@
  */
 package org.apache.isis.extensions.fixtures.fixturescripts;
 
+import lombok.extern.log4j.Log4j2;
+
+import javax.inject.Named;
+
 import org.springframework.stereotype.Service;
 
 
@@ -32,6 +36,8 @@ import org.springframework.stereotype.Service;
  * </p>
  */
 @Service
+@Named("isisExtFixtures.ExecutionParametersService")
+@Log4j2
 public class ExecutionParametersService {
 
     public ExecutionParameters newExecutionParameters(final String parameters) {
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java
index f62fde9..b2dd303 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java
@@ -18,6 +18,10 @@
  */
 package org.apache.isis.extensions.fixtures.legacy.queryresultscache;
 
+import lombok.extern.log4j.Log4j2;
+
+import javax.inject.Named;
+
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 
@@ -31,6 +35,8 @@ import org.apache.isis.extensions.fixtures.events.FixturesInstallingEvent;
  * In separate class because {@link QueryResultsCache} itself is request-scoped
  */
 @Service
+@Named("isisExtFixtures.QueryResultsCacheControlInternal")
+@Log4j2
 public class QueryResultsCacheControlInternal implements QueryResultCacheControl {
 
     @EventListener(FixturesInstallingEvent.class)
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleFixtureService.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleFixtureService.java
deleted file mode 100644
index 24a080f..0000000
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleFixtureService.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.apache.isis.extensions.fixtures.modules;
-
-import lombok.extern.log4j.Log4j2;
-
-import java.util.Collections;
-import java.util.List;
-
-import javax.inject.Named;
-
-import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
-import org.springframework.stereotype.Service;
-
-@Service
-@Named("isisExtFixtures.moduleFixtureService")
-@Log4j2
-public class ModuleFixtureService {
-
-    private final ModuleService moduleService;
-
-    public ModuleFixtureService(final ModuleService moduleService) {
-        this.moduleService = moduleService;
-    }
-
-    public FixtureScript getRefDataSetupFixture() {
-        return new FixtureScript() {
-            @Override
-            protected void execute(final ExecutionContext executionContext) {
-                final List<ModuleService.ModuleWithFixturesDescriptor> descriptors = moduleService.modules();
-                executionContext.executeChildren(this,
-                        descriptors.stream()
-                        .map(ModuleService.ModuleWithFixturesDescriptor::getModule)
-                        .map(ModuleWithFixtures::getRefDataSetupFixture));
-            }
-        };
-    }
-
-    public FixtureScript getTeardownFixture() {
-        return new FixtureScript() {
-            @Override
-            protected void execute(final ExecutionContext executionContext) {
-                final List<ModuleService.ModuleWithFixturesDescriptor> descriptors = moduleService.modules();
-                Collections.reverse(descriptors);
-                executionContext.executeChildren(this,
-                        descriptors.stream()
-                            .map(ModuleService.ModuleWithFixturesDescriptor::getModule)
-                            .map(ModuleWithFixtures::getTeardownFixture));
-            }
-
-        };
-    }
-
-}
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleService.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixturesService.java
similarity index 79%
rename from extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleService.java
rename to extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixturesService.java
index 6eb7b6f..5a674c0 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleService.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixturesService.java
@@ -26,6 +26,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
@@ -42,16 +43,47 @@ import lombok.Data;
 import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
+import javax.inject.Named;
+
 @Service
+@Named("isisExtFixtures.ModuleService")
 @Log4j2
-public class ModuleService {
+public class ModuleWithFixturesService {
 
     private final SpringBeansService springBeansService;
 
-    public ModuleService(final SpringBeansService springBeansService) {
+    public ModuleWithFixturesService(final SpringBeansService springBeansService) {
         this.springBeansService = springBeansService;
     }
 
+    public FixtureScript getRefDataSetupFixture() {
+        return new FixtureScript() {
+            @Override
+            protected void execute(final ExecutionContext executionContext) {
+                final List<ModuleWithFixturesService.ModuleWithFixturesDescriptor> descriptors = modules();
+                executionContext.executeChildren(this,
+                        descriptors.stream()
+                                .map(ModuleWithFixturesService.ModuleWithFixturesDescriptor::getModule)
+                                .map(ModuleWithFixtures::getRefDataSetupFixture));
+            }
+        };
+    }
+
+    public FixtureScript getTeardownFixture() {
+        return new FixtureScript() {
+            @Override
+            protected void execute(final ExecutionContext executionContext) {
+                final List<ModuleWithFixturesService.ModuleWithFixturesDescriptor> descriptors = modules();
+                Collections.reverse(descriptors);
+                executionContext.executeChildren(this,
+                        descriptors.stream()
+                                .map(ModuleWithFixturesService.ModuleWithFixturesDescriptor::getModule)
+                                .map(ModuleWithFixtures::getTeardownFixture));
+            }
+
+        };
+    }
+
     public List<ModuleWithFixturesDescriptor> modules() {
 
         final List<ModuleWithFixturesDescriptor> descriptors = new ArrayList<>();
diff --git a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/services/SseServiceDefault.java b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/services/SseServiceDefault.java
index b1c556d..201221f 100644
--- a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/services/SseServiceDefault.java
+++ b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/services/SseServiceDefault.java
@@ -32,6 +32,7 @@ import java.util.concurrent.ForkJoinPool;
 import java.util.function.Predicate;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.springframework.stereotype.Service;
 
@@ -58,7 +59,9 @@ import lombok.extern.log4j.Log4j2;
  * @since 2.0
  *
  */
-@Service @Log4j2
+@Service
+@Named("isisExtSse.SseServiceDefault")
+@Log4j2
 public class SseServiceDefault implements SseService {
 
     @Inject TransactionService transactionService;
diff --git a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/WebModuleServerSentEvents.java b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/WebModuleServerSentEvents.java
index c77da4b..7e5d26b 100644
--- a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/WebModuleServerSentEvents.java
+++ b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/WebModuleServerSentEvents.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.extensions.sse.webmodule;
 
+import javax.inject.Named;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
@@ -28,6 +29,7 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
 
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 /**
@@ -35,7 +37,10 @@ import lombok.val;
  * 
  * @since 2.0
  */
-@Service @Order(-99)
+@Service
+@Named("isisExtSse.WebModuleServerSentEvents")
+@Order(-99)
+@Log4j2
 public final class WebModuleServerSentEvents implements WebModule  {
 
     private final static String SERVLET_NAME = "ServerSentEventsServlet";


[isis] 01/05: ISIS-2217: renames Module to ModuleWithFixtures

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

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

commit 5fddbb80610c03dd61fa3b1647da6efbd61b07cd
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Dec 6 16:06:42 2019 +0000

    ISIS-2217: renames Module to ModuleWithFixtures
---
 .../fixture/IsisModuleExtFakeDataFixtures.java     |  4 +--
 .../fixtures/modules/ModuleFixtureService.java     | 20 ++++++-------
 .../extensions/fixtures/modules/ModuleService.java | 34 +++++++++++-----------
 .../{Module.java => ModuleWithFixtures.java}       |  6 ++--
 4 files changed, 31 insertions(+), 33 deletions(-)

diff --git a/extensions/lib/fakedata/fixture/src/main/java/org/isisaddons/module/fakedata/fixture/IsisModuleExtFakeDataFixtures.java b/extensions/lib/fakedata/fixture/src/main/java/org/isisaddons/module/fakedata/fixture/IsisModuleExtFakeDataFixtures.java
index b0eb901..2e2aea4 100644
--- a/extensions/lib/fakedata/fixture/src/main/java/org/isisaddons/module/fakedata/fixture/IsisModuleExtFakeDataFixtures.java
+++ b/extensions/lib/fakedata/fixture/src/main/java/org/isisaddons/module/fakedata/fixture/IsisModuleExtFakeDataFixtures.java
@@ -1,7 +1,7 @@
 package org.isisaddons.module.fakedata.fixture;
 
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
-import org.apache.isis.extensions.fixtures.modules.Module;
+import org.apache.isis.extensions.fixtures.modules.ModuleWithFixtures;
 import org.apache.isis.extensions.fakedata.dom.IsisModuleExtFakeData;
 import org.isisaddons.module.fakedata.fixture.demoapp.demomodule.fixturescripts.FakeDataDemoObjectWithAll_tearDown;
 import org.springframework.context.annotation.ComponentScan;
@@ -13,7 +13,7 @@ import org.springframework.context.annotation.Import;
         IsisModuleExtFakeData.class
 })
 @ComponentScan
-public class IsisModuleExtFakeDataFixtures implements Module {
+public class IsisModuleExtFakeDataFixtures implements ModuleWithFixtures {
 
     @Override public FixtureScript getTeardownFixture() {
         return new FakeDataDemoObjectWithAll_tearDown();
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleFixtureService.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleFixtureService.java
index 82aadb8..24a080f 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleFixtureService.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleFixtureService.java
@@ -7,8 +7,6 @@ import java.util.List;
 
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
 import org.springframework.stereotype.Service;
 
@@ -27,11 +25,11 @@ public class ModuleFixtureService {
         return new FixtureScript() {
             @Override
             protected void execute(final ExecutionContext executionContext) {
-                final List<ModuleService.ModuleDescriptor> modules = moduleService.modules();
+                final List<ModuleService.ModuleWithFixturesDescriptor> descriptors = moduleService.modules();
                 executionContext.executeChildren(this,
-                        modules.stream()
-                        .map(ModuleService.ModuleDescriptor::getModule)
-                        .map(Module::getRefDataSetupFixture));
+                        descriptors.stream()
+                        .map(ModuleService.ModuleWithFixturesDescriptor::getModule)
+                        .map(ModuleWithFixtures::getRefDataSetupFixture));
             }
         };
     }
@@ -40,12 +38,12 @@ public class ModuleFixtureService {
         return new FixtureScript() {
             @Override
             protected void execute(final ExecutionContext executionContext) {
-                final List<ModuleService.ModuleDescriptor> modules = moduleService.modules();
-                Collections.reverse(modules);
+                final List<ModuleService.ModuleWithFixturesDescriptor> descriptors = moduleService.modules();
+                Collections.reverse(descriptors);
                 executionContext.executeChildren(this,
-                        modules.stream()
-                            .map(ModuleService.ModuleDescriptor::getModule)
-                            .map(Module::getTeardownFixture));
+                        descriptors.stream()
+                            .map(ModuleService.ModuleWithFixturesDescriptor::getModule)
+                            .map(ModuleWithFixtures::getTeardownFixture));
             }
 
         };
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleService.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleService.java
index 66f4c4e..6eb7b6f 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleService.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleService.java
@@ -40,6 +40,7 @@ import org.apache.isis.metamodel.facets.Annotations;
 
 import lombok.Data;
 import lombok.extern.log4j.Log4j2;
+import lombok.val;
 
 @Service
 @Log4j2
@@ -51,29 +52,29 @@ public class ModuleService {
         this.springBeansService = springBeansService;
     }
 
-    public List<ModuleDescriptor> modules() {
+    public List<ModuleWithFixturesDescriptor> modules() {
 
-        final List<ModuleDescriptor> moduleDescriptors = new ArrayList<>();
+        final List<ModuleWithFixturesDescriptor> descriptors = new ArrayList<>();
         final Map<String, ContextBeans> contexts = springBeansService.beans();
         for (Map.Entry<String, ContextBeans> contextEntry : contexts.entrySet()) {
             final String contextId = contextEntry.getKey();
             final ContextBeans contextBeans = contextEntry.getValue();
             final ConfigurableApplicationContext context = contextBeans.getContext();
 
-            final Map<String, Module> modulesByBeanName = context.getBeansOfType(Module.class);
+            final Map<String, ModuleWithFixtures> modulesByBeanName = context.getBeansOfType(ModuleWithFixtures.class);
             final Map<String, Object> configurationBeansByBeanName = context.getBeansWithAnnotation(Configuration.class);
             final Map<String, Object> beansAnnotatedWithImportByBeanName = context.getBeansWithAnnotation(Import.class);
 
             for (Map.Entry<String, BeanDescriptor> beanEntry : contextBeans.getBeans().entrySet()) {
                 final String beanName = beanEntry.getKey();
 
-                final Module module = modulesByBeanName.get(beanName);
+                final ModuleWithFixtures module = modulesByBeanName.get(beanName);
                 if(module != null) {
 
                     final Object annotatedWithConfiguration = configurationBeansByBeanName.get(beanName);
                     final Object annotatedWithImport = beansAnnotatedWithImportByBeanName.get(beanName);
 
-                    final Map<String, Module> importedModulesByBeanName = new LinkedHashMap<>();
+                    final Map<String, ModuleWithFixtures> importedModulesByBeanName = new LinkedHashMap<>();
                     if(annotatedWithConfiguration != null && annotatedWithImport != null) {
 
                         final Import importAnnot = Annotations.getAnnotation(annotatedWithImport.getClass(), Import.class);
@@ -90,40 +91,39 @@ public class ModuleService {
                                             beanCollection = Collections.singletonList(entryValue);
                                         }
                                         beanCollection.stream()
-                                                .filter(Module.class::isInstance)
-                                                .map(Module.class::cast)
+                                                .filter(ModuleWithFixtures.class::isInstance)
+                                                .map(ModuleWithFixtures.class::cast)
                                                 .forEach(mod -> importedModulesByBeanName.put(name, mod));
                                     });
                                 });
                     }
 
-                    final ModuleDescriptor moduleDescriptor = new ModuleDescriptor(contextId, beanName, module, importedModulesByBeanName);
-                    moduleDescriptors.add(moduleDescriptor);
+                    val descriptor = new ModuleWithFixturesDescriptor(contextId, beanName, module, importedModulesByBeanName);
+                    descriptors.add(descriptor);
                 }
             }
         }
-        return moduleDescriptors;
+        return descriptors;
     }
 
     @EventListener(ContextRefreshedEvent.class)
     public void onContextRefreshed(ContextRefreshedEvent event) {
         log.info("onContextRefreshed");
-        final List<ModuleDescriptor> modules = modules();
-        for (final ModuleDescriptor module : modules) {
-            log.info(module);
+        for (final ModuleWithFixturesDescriptor descriptor : modules()) {
+            log.info(descriptor);
         }
     }
 
     @Data
-    public static class ModuleDescriptor {
+    public static class ModuleWithFixturesDescriptor {
         private final String contextId;
         private final String beanName;
-        private final Module module;
-        private final Map<String,Module> dependenciesByName;
+        private final ModuleWithFixtures module;
+        private final Map<String, ModuleWithFixtures> dependenciesByName;
 
         @Override
         public String toString() {
-            return "ModuleDescriptor{" +
+            return "ModuleWithFixturesDescriptor{" +
                     "contextId='" + contextId + '\'' +
                     ", beanName='" + beanName + '\'' +
                     ", dependenciesByName=" + dependenciesByName.keySet() +
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/Module.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixtures.java
similarity index 90%
rename from extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/Module.java
rename to extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixtures.java
index 10074d2..4158106 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/Module.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixtures.java
@@ -6,7 +6,7 @@ import org.springframework.context.annotation.Import;
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
 
 /**
- * A module is a class that implements this {@link Module} interface, but in addition is expected to be annotated with
+ * A module is a class that implements this {@link ModuleWithFixtures} interface, but in addition is expected to be annotated with
  * {@link Configuration @Configuration} and which defines a dependency other modules by {@link Import @Import}ing them,
  * and conversely may be a dependency of other modules if they import it.
  *
@@ -19,7 +19,7 @@ import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
  * </p>
  *
  * <p>
- *     Optionally, the <code>@Configuration</code> class can implements this {@link Module} interface.
+ *     Optionally, the <code>@Configuration</code> class can implements this {@link ModuleWithFixtures} interface.
  *     Doing so allows it to declare setup and teardown fixtures, eg to set up permanent ref data or to teardown
  *     test entities within the module.
  * </p>
@@ -28,7 +28,7 @@ import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
  *     inferred from the <code>@Configuration</code> imports.
  * </p>
  */
-public interface Module {
+public interface ModuleWithFixtures {
 
     /**
      * Optionally each module can define a {@link FixtureScript} which holds immutable "reference data".


[isis] 03/05: ISIS-2216: adds @Ordered and @Primary

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

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

commit 244b6d1cd52bfe0405aa05db7e2ed436943919f0
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Dec 6 17:01:59 2019 +0000

    ISIS-2216: adds @Ordered and @Primary
---
 .../isis/applib/annotation/OrderPrecedence.java    | 58 ++++++++++++++++++++++
 .../isis/applib/mixins/dto/DtoMappingHelper.java   |  5 ++
 .../services/audit/AuditerServiceLogging.java      |  6 +++
 .../isis/applib/services/clock/ClockService.java   |  5 ++
 .../applib/services/command/CommandContext.java    |  5 ++
 .../ContentMappingServiceForCommandDto.java        |  7 ++-
 .../ContentMappingServiceForCommandsDto.java       |  5 ++
 .../applib/services/iactn/InteractionContext.java  |  5 ++
 .../applib/services/jaxb/JaxbServiceDefault.java   |  5 ++
 .../services/publish/PublisherServiceLogging.java  |  5 ++
 .../QueryResultsCacheInternal.java                 |  5 ++
 .../applib/services/scratchpad/Scratchpad.java     |  5 ++
 .../services/tablecol/TableColumnOrderService.java |  5 ++
 .../UrlEncodingServiceWithCompression.java         |  5 ++
 .../environment/IsisSystemEnvironment.java         |  6 ++-
 .../config/viewer/wicket/WebAppConfiguration.java  |  5 ++
 .../objectmanager/ObjectManagerDefault.java        |  5 ++
 .../metamodel/services/ServiceInjectorDefault.java |  5 ++
 .../appfeat/ApplicationFeatureFactory.java         |  7 ++-
 .../services/events/MetamodelEventService.java     |  5 ++
 .../exceprecog/ExceptionRecognizerDocDefault.java  |  8 ++-
 .../services/grid/GridLoaderServiceDefault.java    |  5 ++
 .../services/grid/GridReaderUsingJaxb.java         |  5 ++
 .../services/grid/GridServiceDefault.java          |  5 ++
 .../grid/bootstrap3/GridSystemServiceBS3.java      |  5 ++
 .../services/layout/LayoutServiceDefault.java      |  5 ++
 .../metamodel/MetaModelServiceDefault.java         |  5 ++
 .../services/registry/ServiceRegistryDefault.java  |  5 ++
 .../services/swagger/SwaggerServiceDefault.java    |  5 ++
 .../services/title/TitleServiceDefault.java        |  5 ++
 .../services/user/UserServiceDefault.java          |  7 +++
 .../specloader/InjectorMethodEvaluatorDefault.java |  5 ++
 .../specloader/ProgrammingModelServiceDefault.java |  5 ++
 .../specloader/SpecificationLoaderDefault.java     |  5 ++
 .../datanucleus/DataNucleusSettings.java           |  8 +++
 .../service/JdoPersistenceLifecycleService.java    | 10 +++-
 ...eptionRecognizerCompositeForJdoObjectStore.java |  5 ++
 .../datanucleus5/jdosupport/IsisJdoSupportDN5.java | 10 ++++
 .../metrics/MetricsServiceDefault.java             |  5 ++
 .../IsisPlatformTransactionManagerForJdo.java      | 11 +++-
 .../persistence/PersistenceSessionFactory5.java    | 11 +++-
 .../auth/AuthenticationSessionProviderDefault.java |  5 ++
 .../auth/AuthorizationManagerStandard.java         |  5 ++
 .../background/CommandExecutorServiceDefault.java  |  5 ++
 .../bookmarks/BookmarkServiceInternalDefault.java  |  5 ++
 .../command/CommandDtoServiceInternalDefault.java  |  5 ++
 .../services/command/CommandServiceDefault.java    |  5 ++
 .../confmenu/ConfigurationViewServiceDefault.java  |  5 ++
 .../services/email/EmailServiceDefault.java        |  5 ++
 .../services/eventbus/EventBusServiceSpring.java   |  5 ++
 .../services/factory/FactoryServiceDefault.java    |  5 ++
 .../homepage/HomePageResolverServiceDefault.java   |  9 ++--
 .../services/i18n/po/TranslationServicePo.java     |  5 ++
 .../ixn/InteractionDtoServiceInternalDefault.java  |  5 ++
 .../menubars/MenuBarsLoaderServiceDefault.java     |  5 ++
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |  5 ++
 .../services/message/MessageServiceDefault.java    |  5 ++
 .../publish/PublishingServiceInternalDefault.java  |  7 ++-
 .../sessmgmt/SessionManagementServiceDefault.java  |  5 ++
 .../runtime/services/sudo/SudoServiceDefault.java  |  5 ++
 .../userprof/UserProfileServiceDefault.java        |  5 ++
 .../userreg/EmailNotificationServiceDefault.java   |  5 ++
 .../services/wrapper/WrapperFactoryDefault.java    |  5 ++
 .../services/xactn/TransactionServiceSpring.java   |  5 ++
 .../xmlsnapshot/XmlSnapshotServiceDefault.java     |  5 ++
 .../context/session/RuntimeEventService.java       |  8 +++
 .../events/PersistenceEventService.java            |  8 +++
 .../persistence/events/TimestampService.java       |  5 ++
 .../system/session/IsisSessionFactoryDefault.java  |  5 ++
 .../transaction/AuditingServiceInternal.java       |  7 +++
 .../transaction/ChangedObjectsServiceInternal.java |  7 +++
 .../standard/AuthenticationManagerStandard.java    |  5 ++
 .../keycloak/webmodule/WebModuleKeycloak.java      |  8 ++-
 .../security/shiro/webmodule/WebModuleShiro.java   | 10 +++-
 .../rendering/domainobjects/JsonValueEncoder.java  | 12 ++++-
 .../RepresentationServiceContentNegotiator.java    | 10 ++++
 .../acceptheader/AcceptHeaderServiceForRest.java   |  5 ++
 ...entNegotiationServiceForRestfulObjectsV1_0.java |  5 ++
 .../ContentNegotiationServiceOrgApacheIsisV1.java  |  4 +-
 .../ContentNegotiationServiceXRoDomainType.java    |  8 ++-
 .../viewer/webmodule/WebModuleRestfulObjects.java  |  3 +-
 .../themepicker/IsisWicketThemeSupportDefault.java | 10 +++-
 .../ComponentFactoryRegistrarDefault.java          | 11 ++++
 .../ComponentFactoryRegistryDefault.java           |  9 ++++
 .../registries/pages/PageClassListDefault.java     | 11 ++++
 .../registries/pages/PageClassRegistryDefault.java | 10 ++++
 .../pages/PageNavigationServiceDefault.java        | 10 ++++
 .../viewer/services/BookmarkUiServiceWicket.java   |  5 ++
 .../viewer/services/DeepLinkServiceWicket.java     | 10 ++++
 .../services/HintStoreUsingWicketSession.java      |  5 ++
 .../services/ImageResourceCacheClassPath.java      | 10 ++++
 .../viewer/services/LocaleProviderWicket.java      | 11 ++++
 .../services/TranslationsResolverWicket.java       | 10 +++-
 .../services/WicketViewerSettingsDefault.java      |  9 ++++
 .../mementos/ObjectMementoServiceWicket.java       |  5 ++
 .../wicket/viewer/webmodule/WebModuleWicket.java   | 11 +++-
 .../logonlog/WebModuleLogOnExceptionLogger.java    |  8 ++-
 .../templresources/WebModuleTemplateResources.java |  9 +++-
 .../error/service/DemoErrorReportingService.java   |  2 +
 .../java/demoapp/dom/events/EventSubscriber.java   |  2 +
 .../main/java/demoapp/dom/jee/JeeDemoService.java  |  6 +++
 .../demoapp/utils/LibraryPreloadingService.java    |  4 ++
 102 files changed, 673 insertions(+), 25 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/OrderPrecedence.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/OrderPrecedence.java
new file mode 100644
index 0000000..c305158
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/OrderPrecedence.java
@@ -0,0 +1,58 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.applib.annotation;
+
+import lombok.experimental.UtilityClass;
+
+import org.springframework.core.Ordered;
+
+@UtilityClass
+public class OrderPrecedence {
+
+    /**
+     * Useful constant for the highest precedence value.
+     *
+     * @see java.lang.Integer#MIN_VALUE
+     * @see Ordered#HIGHEST_PRECEDENCE
+     */
+    public static final int HIGHEST = Ordered.HIGHEST_PRECEDENCE;
+
+    /**
+     * Useful constant for the lowest precedence value.
+     *
+     * @see java.lang.Integer#MAX_VALUE
+     * @see Ordered#LOWEST_PRECEDENCE
+     */
+    public static final int LOWEST = Ordered.LOWEST_PRECEDENCE;
+
+    /**
+     * Used by framework services that are unlikely to be overridden by application code.
+     */
+    public static final int HIGH = HIGHEST / 2;
+    /**
+     * Used by framework services that could be overridden by application code (though not commonly).
+     */
+    public static final int DEFAULT = 0;
+    /**
+     * Used by framework services that are expected to be overridden by application code, or that act as a fallback.
+     */
+    public static final int LOW = OrderPrecedence.LOWEST / 2;
+
+}
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java b/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java
index 6f25302..ecdc02f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java
@@ -25,15 +25,20 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.schema.common.v1.BookmarkObjectState;
 import org.apache.isis.schema.common.v1.OidDto;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisApplib.DtoMappingHelper")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class DtoMappingHelper {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerServiceLogging.java b/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerServiceLogging.java
index 681bcc0..b5291ee 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerServiceLogging.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerServiceLogging.java
@@ -24,7 +24,10 @@ import java.util.UUID;
 import javax.annotation.PostConstruct;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -33,6 +36,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisApplib.AuditerServiceLogging")
+@Order(OrderPrecedence.LOW)
+@Primary
+@Qualifier("logging")
 @Log4j2
 public class AuditerServiceLogging implements AuditerService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java b/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java
index 88118d7..62ada44 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java
@@ -27,6 +27,9 @@ import java.time.OffsetDateTime;
 
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.clock.Clock;
@@ -39,6 +42,8 @@ import org.apache.isis.applib.clock.Clock;
  */
 @Service
 @Named("isisApplib.ClockService")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class ClockService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
index 64fab8c..00d2d37 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
@@ -23,6 +23,9 @@ import lombok.extern.log4j.Log4j2;
 import javax.enterprise.context.RequestScoped;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
@@ -36,6 +39,8 @@ import org.springframework.stereotype.Service;
 @Service
 @Named("isisApplib.CommandContext")
 @RequestScoped
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class CommandContext {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandDto.java b/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandDto.java
index 7aa68b7..eae9098 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandDto.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandDto.java
@@ -27,6 +27,8 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.ws.rs.core.MediaType;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 
 import org.apache.isis.applib.annotation.DomainService;
@@ -46,6 +48,8 @@ import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisApplib.ContentMappingServiceForCommandDto")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @Log4j2
 public class ContentMappingServiceForCommandDto implements ContentMappingService {
 
@@ -106,7 +110,8 @@ public class ContentMappingServiceForCommandDto implements ContentMappingService
     @Named("isisApplib.ContentMappingServiceForCommandDto.CopyOverFromCommand")
     // specify quite a high priority since custom processors will probably want to run after this one
     // (but can choose to run before if they wish)
-    @Order(-1000)
+    @Order(OrderPrecedence.HIGH)
+    @Primary
     @Log4j2
     public static class CopyOverFromCommand implements CommandDtoProcessorService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandsDto.java b/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandsDto.java
index 9729302..af81fe8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandsDto.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandsDto.java
@@ -28,13 +28,18 @@ import javax.ws.rs.core.MediaType;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.conmap.ContentMappingService;
 import org.apache.isis.schema.cmd.v1.CommandDto;
 import org.apache.isis.schema.cmd.v1.CommandsDto;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisApplib.ContentMappingServiceForCommandsDto")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @Log4j2
 public class ContentMappingServiceForCommandsDto implements ContentMappingService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
index 9e9726c..68e2591 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
@@ -23,6 +23,9 @@ import lombok.extern.log4j.Log4j2;
 import javax.enterprise.context.RequestScoped;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.DomainService;
@@ -36,6 +39,8 @@ import org.apache.isis.applib.annotation.DomainService;
  */
 @Service
 @Named("isisApplib.InteractionContext")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @RequestScoped
 @Log4j2
 public class InteractionContext {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
index a03e9c9..55185c7 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
@@ -30,6 +30,9 @@ import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.NonRecoverableException;
@@ -42,6 +45,8 @@ import org.apache.isis.applib.jaxbadapters.PersistentEntityAdapter;
 
 @Service
 @Named("isisApplib.JaxbServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class JaxbServiceDefault extends JaxbService.Simple {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java
index 8d87040..0fc2d2f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java
@@ -18,6 +18,9 @@
  */
 package org.apache.isis.applib.services.publish;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.iactn.Interaction;
@@ -32,6 +35,8 @@ import javax.inject.Named;
 
 @Service
 @Named("isisApplib.PublisherServiceLogging")
+@Order(OrderPrecedence.LOW)
+@Primary
 @Log4j2
 public class PublisherServiceLogging implements PublisherService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java
index fa88193..a578c6d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java
@@ -24,6 +24,7 @@ import java.util.concurrent.Callable;
 import javax.enterprise.context.RequestScoped;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import org.apache.isis.applib.annotation.DomainService;
@@ -32,6 +33,8 @@ import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import lombok.extern.log4j.Log4j2;
@@ -48,6 +51,8 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisApplib.QueryResultsCacheInternal")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @RequestScoped
 @Log4j2
 public class QueryResultsCacheInternal implements QueryResultsCache, WithTransactionScope {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/scratchpad/Scratchpad.java b/core/applib/src/main/java/org/apache/isis/applib/services/scratchpad/Scratchpad.java
index 0b17e50..a9ba852 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/scratchpad/Scratchpad.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/scratchpad/Scratchpad.java
@@ -27,7 +27,10 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.commons.internal.collections._Maps;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 /**
@@ -42,6 +45,8 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @RequestScoped
+@Order(OrderPrecedence.HIGH)
+@Primary
 @Named("isisApplib.Scratchpad")
 @Log4j2
 public class Scratchpad {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java b/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
index 23bd1b8..dcf8ac1 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
@@ -26,6 +26,9 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 public interface TableColumnOrderService {
@@ -45,6 +48,8 @@ public interface TableColumnOrderService {
      */
     @Service
     @Named("isisApplib.TableColumnOrderService.Default")
+    @Order(OrderPrecedence.LOW)
+    @Primary
     @Log4j2
     public static class Default implements TableColumnOrderService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression.java b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression.java
index 5e9fb3b..ea498e4 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression.java
@@ -26,12 +26,17 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.commons.internal.base._Bytes;
 import org.apache.isis.commons.internal.base._Strings;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisApplib.UrlEncodingServiceWithCompression")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class UrlEncodingServiceWithCompression implements UrlEncodingService {
 
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
index 1304639..b0ed9c9 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
@@ -25,9 +25,11 @@ import javax.inject.Named;
 import javax.inject.Singleton;
 
 import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.ContextClosedEvent;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Context;
@@ -46,8 +48,10 @@ import lombok.extern.log4j.Log4j2;
  * @implNote acts as the framework's bootstrapping entry-point for Spring  
  */
 @Service
-@Singleton
 @Named("isisCommons.IsisSystemEnvironment")
+@Order(-1_073_741_824) // same as OrderedPrecedence#HIGH
+@Primary
+@Singleton
 @Log4j2
 public class IsisSystemEnvironment {
     
diff --git a/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppConfiguration.java b/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppConfiguration.java
index 41de174..1a420ba 100644
--- a/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppConfiguration.java
@@ -25,6 +25,9 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.core.io.AbstractResource;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
@@ -42,6 +45,8 @@ import lombok.val;
 @Service
 @Singleton
 @Named("isisConfig.WebAppConfiguration")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class WebAppConfiguration {
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManagerDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManagerDefault.java
index 71ad5f3..df62b04 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManagerDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManagerDefault.java
@@ -22,6 +22,9 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.metamodel.context.MetaModelContext;
@@ -41,6 +44,8 @@ import lombok.val;
  */
 @Service
 @Named("isisMetaModel.ObjectManagerDefault")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @Log4j2
 public class ObjectManagerDefault implements ObjectManager {
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
index 42afb6d..c3f57f0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
@@ -25,8 +25,11 @@ import java.util.function.Consumer;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.beans.factory.InjectionPoint;
 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
@@ -38,6 +41,8 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
  */
 @Service
 @Named("isisMetaModel.ServiceInjectorDefault")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @Log4j2
 public class ServiceInjectorDefault implements ServiceInjector {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java
index 39b013a..fa662e8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java
@@ -23,13 +23,18 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.factory.FactoryService;
 
 @Service
-@Log4j2
 @Named("isisMetaModel.ApplicationFeatureFactory")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class ApplicationFeatureFactory {
 
     public ApplicationFeature newApplicationFeature() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java
index 448de73..69146fa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java
@@ -23,6 +23,9 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
@@ -43,6 +46,8 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service 
 @Named("isisMetaModel.MetamodelEventService")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 @Builder //for JUnit Test support
 public class MetamodelEventService {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
index 459e2b7..9d2ff41 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
@@ -26,6 +26,9 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.RecoverableException;
@@ -36,6 +39,8 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 
 @Service
 @Named("isisMetaModel.ExceptionRecognizerDocDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class ExceptionRecognizerDocDefault
 implements ExceptionRecognizer {
@@ -69,8 +74,7 @@ implements ExceptionRecognizer {
 
     /**
      * Framework-provided implementation of {@link ExceptionRecognizer},
-     * which will automatically recognize any {@link org.apache.isis.applib.RecoverableException}s or
-     * any {@link ConcurrencyException}s.
+     * which will automatically recognize any {@link org.apache.isis.applib.RecoverableException}s.
      */
     @Override
     public String recognize(Throwable ex) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
index 3f9f563..2712bca 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
@@ -28,6 +28,9 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.layout.grid.Grid;
@@ -43,6 +46,8 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisMetaModel.GridLoaderServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class GridLoaderServiceDefault implements GridLoaderService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridReaderUsingJaxb.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridReaderUsingJaxb.java
index 956b745..dab5043 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridReaderUsingJaxb.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridReaderUsingJaxb.java
@@ -28,6 +28,9 @@ import javax.inject.Named;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.layout.grid.Grid;
@@ -43,6 +46,8 @@ import org.apache.isis.commons.internal.collections._Arrays;
  */
 @Service
 @Named("isisMetaModel.GridReaderUsingJaxb")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class GridReaderUsingJaxb {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java
index 9d42ef4..4b05e8a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java
@@ -27,6 +27,9 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.layout.grid.Grid;
@@ -39,6 +42,8 @@ import org.apache.isis.commons.internal.collections._Lists;
 
 @Service
 @Named("isisMetaModel.GridServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class GridServiceDefault implements GridService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
index 66a82cb..f0d4169 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
@@ -30,6 +30,9 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -73,6 +76,8 @@ import lombok.val;
 
 @Service
 @Named("isisMetaModel.GridSystemServiceBS3")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
index 6b454a9..9904399 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
@@ -26,6 +26,9 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.xml.bind.Marshaller;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.layout.grid.Grid;
@@ -46,6 +49,8 @@ import lombok.val;
 
 @Service
 @Named("isisMetaModel.LayoutServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class LayoutServiceDefault implements LayoutService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
index dab539a..f850c90 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -29,6 +29,9 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -57,6 +60,8 @@ import org.apache.isis.schema.metamodel.v1.MetamodelDto;
 
 @Service
 @Named("isisMetaModel.MetaModelServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class MetaModelServiceDefault implements MetaModelService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
index 32f8648..9d9bc94 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
@@ -29,6 +29,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Lazy;
@@ -38,6 +39,8 @@ import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.commons.internal.ioc.spring._Spring;
 import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import lombok.extern.log4j.Log4j2;
@@ -48,6 +51,8 @@ import lombok.val;
  */
 @Service
 @Named("isisMetaModel.ServiceRegistryDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public final class ServiceRegistryDefault implements ServiceRegistry {
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
index 634c926..1b0d52f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
@@ -23,6 +23,9 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.swagger.SwaggerService;
@@ -37,6 +40,8 @@ import static org.apache.isis.commons.internal.resources._Resources.prependConte
 
 @Service
 @Named("isisMetaModel.swaggerServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class SwaggerServiceDefault implements SwaggerService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java
index 15ad22b..3837d6f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java
@@ -22,6 +22,9 @@ package org.apache.isis.metamodel.services.title;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.title.TitleService;
@@ -34,6 +37,8 @@ import lombok.val;
 
 @Service
 @Named("isisMetaModel.TitleServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class TitleServiceDefault implements TitleService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java
index 23e5606..346683e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java
@@ -28,6 +28,9 @@ import java.util.Stack;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.DomainService;
@@ -41,6 +44,8 @@ import org.apache.isis.security.api.authentication.AuthenticationSessionProvider
 
 @Service
 @Named("isisMetaModel.UserServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class UserServiceDefault implements UserService {
 
@@ -150,6 +155,8 @@ public class UserServiceDefault implements UserService {
 
     @Service
     @Named("isisMetaModel.UserServiceDefault.SudoServiceSpi")
+    @Order(OrderPrecedence.DEFAULT)
+    @Primary
     @Log4j2
     public static class SudoServiceSpi implements SudoService.Spi {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java
index e158430..07c75fe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java
@@ -25,12 +25,17 @@ import java.lang.reflect.Method;
 
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.metamodel.spec.InjectorMethodEvaluator;
 
 @Service
 @Named("isisMetaModel.InjectorMethodEvaluatorDefault")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @Log4j2
 public final class InjectorMethodEvaluatorDefault implements InjectorMethodEvaluator {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
index 5697862..9eb3fa3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
@@ -21,7 +21,10 @@ package org.apache.isis.metamodel.specloader;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -38,6 +41,8 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisMetaModel.ProgrammingModelServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class ProgrammingModelServiceDefault implements ProgrammingModelService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
index 4f723f9..b84df83 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
@@ -29,6 +29,7 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Blackhole;
@@ -59,6 +60,8 @@ import org.apache.isis.metamodel.specloader.specimpl.standalonelist.ObjectSpecif
 import org.apache.isis.metamodel.specloader.validator.MetaModelValidatorAbstract;
 import org.apache.isis.metamodel.specloader.validator.ValidationFailures;
 import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import lombok.Getter;
@@ -83,6 +86,8 @@ import static org.apache.isis.commons.internal.base._With.requires;
  */
 @Service
 @Named("isisMetaModel.SpecificationLoaderDefault")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @Log4j2
 public class SpecificationLoaderDefault implements SpecificationLoader {
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/DataNucleusSettings.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/DataNucleusSettings.java
index 071721b..1d79a05 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/DataNucleusSettings.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/DataNucleusSettings.java
@@ -18,11 +18,16 @@
  */
 package org.apache.isis.persistence.jdo.datanucleus5.datanucleus;
 
+import lombok.extern.log4j.Log4j2;
+
 import java.util.Map;
 
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 /**
@@ -30,6 +35,9 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @Named("isisJdoDn5.DataNucleusSettings")
+@Order(OrderPrecedence.HIGH)
+@Primary
+@Log4j2
 public class DataNucleusSettings {
 
     @Inject @Named("dn-settings") 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/service/JdoPersistenceLifecycleService.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/service/JdoPersistenceLifecycleService.java
index 495ee6d..4b6494e 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/service/JdoPersistenceLifecycleService.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/service/JdoPersistenceLifecycleService.java
@@ -20,8 +20,12 @@ package org.apache.isis.persistence.jdo.datanucleus5.datanucleus.service;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Context;
@@ -37,7 +41,11 @@ import org.apache.isis.runtime.system.session.IsisSession;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Service @Log4j2
+@Service
+@Named("isisJdoDn5.JdoPersistenceLifecycleService")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class JdoPersistenceLifecycleService {
 
     @Inject private MetaModelContext metaModelContext;
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/exceprecog/ExceptionRecognizerCompositeForJdoObjectStore.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/exceprecog/ExceptionRecognizerCompositeForJdoObjectStore.java
index 6fdf2d1..f68e84d 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/exceprecog/ExceptionRecognizerCompositeForJdoObjectStore.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/exceprecog/ExceptionRecognizerCompositeForJdoObjectStore.java
@@ -26,9 +26,12 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 import org.apache.isis.config.IsisConfiguration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 /**
@@ -44,6 +47,8 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @Named("isisJdoDn5.ExceptionRecognizerCompositeForJdoObjectStore")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class ExceptionRecognizerCompositeForJdoObjectStore extends ExceptionRecognizerComposite {
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/jdosupport/IsisJdoSupportDN5.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/jdosupport/IsisJdoSupportDN5.java
index a5656a4..af321ce 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/jdosupport/IsisJdoSupportDN5.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/jdosupport/IsisJdoSupportDN5.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.persistence.jdo.datanucleus5.jdosupport;
 
+import lombok.extern.log4j.Log4j2;
+
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
@@ -29,13 +31,17 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.jdo.Extent;
 import javax.jdo.JDOQLTypedQuery;
 import javax.jdo.PersistenceManager;
 import javax.jdo.datastore.JDOConnection;
 import javax.jdo.query.BooleanExpression;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.persistence.jdo.applib.services.IsisJdoSupport_v3_2;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.FatalException;
@@ -56,6 +62,10 @@ import static org.apache.isis.commons.internal.base._NullSafe.stream;
  *
  */
 @Service
+@Named("isisJdoDn5.IsisJdoSupportDN5")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class IsisJdoSupportDN5 implements IsisJdoSupport_v3_2 {
 
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceDefault.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceDefault.java
index b1dc252..d61fab5 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceDefault.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceDefault.java
@@ -31,13 +31,18 @@ import javax.jdo.listener.LoadLifecycleListener;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.applib.services.metrics.MetricsService;
 import org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisJdoDn5.MetricsServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @RequestScoped
 @Log4j2
 public class MetricsServiceDefault implements MetricsService, InstanceLifecycleListener,
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java
index 1794698..65a7d43 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java
@@ -19,8 +19,12 @@
 package org.apache.isis.persistence.jdo.datanucleus5.persistence;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionException;
@@ -39,7 +43,12 @@ import org.apache.isis.security.api.authentication.AuthenticationSession;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Service @Log4j2 @Qualifier("jdo")
+@Service
+@Named("isisJdoDn5.IsisPlatformTransactionManagerForJdo")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Qualifier("jdo")
+@Log4j2
 public class IsisPlatformTransactionManagerForJdo extends AbstractPlatformTransactionManager {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java
index 1013248..20beeb4 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java
@@ -24,11 +24,15 @@ import java.util.Objects;
 
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.inject.Singleton;
 import javax.jdo.listener.StoreLifecycleListener;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.datanucleus.PropertyNames;
 import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.base._Blackhole;
@@ -56,7 +60,12 @@ import lombok.extern.log4j.Log4j2;
  * Factory for {@link PersistenceSession}.
  *
  */
-@Service @Singleton @Log4j2
+@Service
+@Named("isisJdoDn5.PersistenceSessionFactory5")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Singleton
+@Log4j2
 public class PersistenceSessionFactory5
 implements PersistenceSessionFactory, FixturesInstalledStateHolder {
     
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthenticationSessionProviderDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthenticationSessionProviderDefault.java
index 7ae7e4c..f3789bc 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthenticationSessionProviderDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthenticationSessionProviderDefault.java
@@ -25,6 +25,9 @@ import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.metamodel.services.user.UserServiceDefault;
@@ -36,6 +39,8 @@ import org.apache.isis.security.api.authentication.standard.SimpleSession;
 
 @Service
 @Named("isisRuntimeServices.AuthenticationSessionProviderDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class AuthenticationSessionProviderDefault implements AuthenticationSessionProvider {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerStandard.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerStandard.java
index 066fa3f..5801947 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerStandard.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerStandard.java
@@ -24,6 +24,9 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.Identifier;
@@ -41,6 +44,8 @@ import lombok.val;
 
 @Service
 @Named("isisRuntimeServices.AuthorizationManagerStandard")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class AuthorizationManagerStandard implements AuthorizationManager, MetaModelRefiner {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
index 5122efd..e13e55a 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
@@ -27,6 +27,9 @@ import java.util.stream.Stream;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -72,6 +75,8 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisRuntimeServices.CommandExecutorServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class CommandExecutorServiceDefault implements CommandExecutorService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
index 6b92143..af72bf6 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
@@ -27,6 +27,7 @@ import java.util.Set;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkHolder;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
@@ -42,6 +43,8 @@ import org.apache.isis.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import lombok.extern.log4j.Log4j2;
@@ -53,6 +56,8 @@ import lombok.val;
  */
 @Service
 @Named("isisRuntimeServices.BookmarkServiceInternalDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class BookmarkServiceInternalDefault implements BookmarkService, SerializingAdapter {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandDtoServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandDtoServiceInternalDefault.java
index f5e38c8..f74db4f 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandDtoServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandDtoServiceInternalDefault.java
@@ -26,6 +26,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.command.Command;
@@ -48,6 +49,8 @@ import org.apache.isis.schema.common.v1.OidsDto;
 import org.apache.isis.schema.common.v1.ValueWithTypeDto;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import lombok.extern.log4j.Log4j2;
@@ -55,6 +58,8 @@ import lombok.val;
 
 @Service
 @Named("isisRuntimeServices.CommandDtoServiceInternalDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class CommandDtoServiceInternalDefault implements CommandDtoServiceInternal {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java
index a495969..62218c9 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java
@@ -22,6 +22,9 @@ import lombok.extern.log4j.Log4j2;
 
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.command.Command;
@@ -30,6 +33,8 @@ import org.apache.isis.applib.services.command.spi.CommandService;
 
 @Service
 @Named("isisRuntimeServices.CommandServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class CommandServiceDefault implements CommandService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java
index 1f68bd1..06bc5c8 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java
@@ -28,6 +28,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.confview.ConfigurationProperty;
 import org.apache.isis.applib.services.confview.ConfigurationViewService;
 import org.apache.isis.commons.internal.base._Lazy;
@@ -37,6 +38,8 @@ import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.ConfigurationConstants;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.util.ConfigUtil;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import lombok.val;
@@ -47,6 +50,8 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisRuntimeServices.ConfigurationViewServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class ConfigurationViewServiceDefault implements ConfigurationViewService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/email/EmailServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/email/EmailServiceDefault.java
index ddf669a..50fd4cc 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/email/EmailServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/email/EmailServiceDefault.java
@@ -34,9 +34,12 @@ import org.apache.commons.mail.resolver.DataSourceClassPathResolver;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.email.EmailService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.config.IsisConfiguration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import lombok.extern.log4j.Log4j2;
@@ -46,6 +49,8 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisRuntimeServices.EmailServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class EmailServiceDefault implements EmailService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java
index 9e59533..6be08c7 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java
@@ -23,13 +23,18 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.eventbus.EventBusService;
 
 @Service
 @Named("isisRuntimeServices.EventBusServiceSpring")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class EventBusServiceSpring implements EventBusService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java
index 05ecdac..8ac32d7 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java
@@ -25,6 +25,9 @@ import java.lang.reflect.InvocationTargetException;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.NonRecoverableException;
@@ -46,6 +49,8 @@ import lombok.val;
 
 @Service
 @Named("isisRuntimeServices.FactoryServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class FactoryServiceDefault implements FactoryService {
     
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
index c0dc63c..02cc17a 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
@@ -22,13 +22,12 @@ import javax.enterprise.inject.Vetoed;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.*;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.HomePage;
-import org.apache.isis.applib.annotation.ViewModel;
-import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Lazy;
@@ -51,6 +50,8 @@ import lombok.val;
 
 @Service
 @Named("isisRuntimeServices.HomePageResolverServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class HomePageResolverServiceDefault implements HomePageResolverService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
index 6dccb39..c1c973a 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
@@ -25,6 +25,9 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.i18n.LocaleProvider;
@@ -38,6 +41,8 @@ import org.apache.isis.config.IsisConfiguration;
 
 @Service
 @Named("isisRuntimeServices.TranslationServicePo")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class TranslationServicePo implements TranslationService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
index 0d29994..887754f 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
@@ -28,6 +28,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.iactn.Interaction;
@@ -47,10 +48,14 @@ import org.apache.isis.schema.ixn.v1.ActionInvocationDto;
 import org.apache.isis.schema.ixn.v1.PropertyEditDto;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisRuntimeServices.InteractionDtoServiceInternalDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class InteractionDtoServiceInternalDefault implements InteractionDtoServiceInternal {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
index 36ba7ec..bf76682 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
@@ -24,7 +24,10 @@ import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.core.io.AbstractResource;
 import org.springframework.stereotype.Service;
 
@@ -40,6 +43,8 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisRuntimeServices.MenuBarsLoaderServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class MenuBarsLoaderServiceDefault implements MenuBarsLoaderService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
index 9d3ad65..25d5381 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
@@ -28,6 +28,9 @@ import java.util.stream.Stream;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.DomainServiceLayout;
@@ -65,6 +68,8 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisRuntimeServices.MenuBarsServiceBS3")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class MenuBarsServiceBS3 implements MenuBarsService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java
index 2337862..7118f60 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java
@@ -23,6 +23,9 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.RecoverableException;
@@ -34,6 +37,8 @@ import org.apache.isis.security.api.authentication.MessageBroker;
 
 @Service
 @Named("isisRuntimeServices.MessageServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class MessageServiceDefault implements MessageService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublishingServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublishingServiceInternalDefault.java
index 80185f4..425f38d 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublishingServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublishingServiceInternalDefault.java
@@ -34,6 +34,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.annotation.PublishingChangeKind;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
@@ -49,14 +50,18 @@ import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.facets.object.publishedobject.PublishedObjectFacet;
 import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 /**
  * Wrapper around {@link PublisherService}.  Is a no-op if there is no injected service.
  */
 @Service
-@RequestScoped
 @Named("isisRuntimeServices.PublishingServiceInternalDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@RequestScoped
 @Log4j2
 public class PublishingServiceInternalDefault implements PublishingServiceInternal {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java
index 40c49a69..d815307 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java
@@ -22,6 +22,9 @@ package org.apache.isis.runtime.services.sessmgmt;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.sessmgmt.SessionManagementService;
@@ -33,6 +36,8 @@ import lombok.val;
 
 @Service
 @Named("isisRuntimeServices.SessionManagementServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class SessionManagementServiceDefault implements SessionManagementService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sudo/SudoServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sudo/SudoServiceDefault.java
index 904ca59..0168093 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sudo/SudoServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sudo/SudoServiceDefault.java
@@ -29,11 +29,16 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.sudo.SudoService;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisRuntimeServices.SudoServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class SudoServiceDefault implements SudoService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userprof/UserProfileServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userprof/UserProfileServiceDefault.java
index b31f8d4..9aa19f7 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userprof/UserProfileServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userprof/UserProfileServiceDefault.java
@@ -25,13 +25,18 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.userprof.UserProfileService;
 import org.apache.isis.security.api.authentication.AuthenticationSessionProvider;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisRuntimeServices.UserProfileServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class UserProfileServiceDefault implements UserProfileService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userreg/EmailNotificationServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userreg/EmailNotificationServiceDefault.java
index 126d4a3..22d678f 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userreg/EmailNotificationServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userreg/EmailNotificationServiceDefault.java
@@ -32,12 +32,15 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.email.EmailService;
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
 import org.apache.isis.applib.services.userreg.events.EmailEventAbstract;
 import org.apache.isis.applib.services.userreg.events.EmailRegistrationEvent;
 import org.apache.isis.applib.services.userreg.events.PasswordResetEvent;
 import org.apache.isis.commons.internal.resources._Resources;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import static java.util.regex.Pattern.compile;
@@ -48,6 +51,8 @@ import static java.util.regex.Pattern.quote;
  */
 @Service
 @Named("isisRuntimeServices.EmailNotificationServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class EmailNotificationServiceDefault implements EmailNotificationService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/WrapperFactoryDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/WrapperFactoryDefault.java
index c85d373..8d78a9d 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/WrapperFactoryDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/WrapperFactoryDefault.java
@@ -32,6 +32,9 @@ import java.util.function.BiConsumer;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.factory.FactoryService;
@@ -77,6 +80,8 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisRuntimeServices.WrapperFactoryDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class WrapperFactoryDefault implements WrapperFactory {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java
index 8d2cc97..4c00bf4 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java
@@ -24,6 +24,9 @@ import java.util.function.Supplier;
 import javax.annotation.Nonnull;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.TransactionStatus;
@@ -43,6 +46,8 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisRuntimeServices.TransactionServiceSpring")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class TransactionServiceSpring implements TransactionService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java
index ba0662a..07579fe 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java
@@ -23,6 +23,9 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.xmlsnapshot.XmlSnapshotService;
@@ -42,6 +45,8 @@ import org.apache.isis.metamodel.util.snapshot.XmlSnapshot;
  */
 @Service
 @Named("isisRuntimeServices.XmlSnapshotServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class XmlSnapshotServiceDefault extends XmlSnapshotServiceAbstract {
     
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java
index 656305d..a934ad2 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java
@@ -18,9 +18,14 @@
  */
 package org.apache.isis.runtime.system.context.session;
 
+import lombok.extern.log4j.Log4j2;
+
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.eventbus.EventBusService;
@@ -34,6 +39,9 @@ import org.apache.isis.runtime.system.session.IsisSession;
  */
 @Service
 @Named("isisRuntime.RuntimeEventService")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class RuntimeEventService {
     
     @Inject private EventBusService eventBusService;  
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java
index 76dfa08..b840bab 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java
@@ -18,10 +18,15 @@
  */
 package org.apache.isis.runtime.system.persistence.events;
 
+import lombok.extern.log4j.Log4j2;
+
 import javax.enterprise.event.Event;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 /**
@@ -31,6 +36,9 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @Named("isisRuntime.PersistenceEventService")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class PersistenceEventService {
     
     // -- MANAGED EVENTS
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/TimestampService.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/TimestampService.java
index b7d04a5..78c36cc 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/TimestampService.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/TimestampService.java
@@ -21,7 +21,10 @@ package org.apache.isis.runtime.system.persistence.events;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.mixins.timestamp.HoldsUpdatedAt;
@@ -35,6 +38,8 @@ import lombok.val;
 
 @Service
 @Named("isisRuntime.TimestampService")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class TimestampService {
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
index 604a057..ee9df7b 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
@@ -27,8 +27,11 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.collections._Sets;
@@ -65,6 +68,8 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisRuntime.IsisSessionFactoryDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class IsisSessionFactoryDefault implements IsisSessionFactory {
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java
index 17b5c57..ce43ea1 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java
@@ -26,6 +26,9 @@ import java.util.UUID;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.audit.AuditerService;
@@ -37,6 +40,7 @@ import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.facets.actions.action.invocation.CommandUtil;
 import org.apache.isis.metamodel.facets.object.audit.AuditableFacet;
 
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 /**
@@ -44,6 +48,9 @@ import lombok.val;
  */
 @Service
 @Named("isisRuntime.AuditingServiceInternal")
+@Order(OrderPrecedence.HIGH)
+@Primary
+@Log4j2
 public class AuditingServiceInternal {
     
     @Inject private List<AuditerService> auditerServices;
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsServiceInternal.java
index 9116b1d..88e3ca6 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsServiceInternal.java
@@ -28,6 +28,9 @@ import java.util.stream.Stream;
 import javax.enterprise.context.RequestScoped;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PublishingChangeKind;
@@ -41,11 +44,15 @@ import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.Contributed;
 import org.apache.isis.metamodel.spec.feature.ObjectAssociation;
 
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 @Service
 @Named("isisRuntime.ChangedObjectsServiceInternal")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @RequestScoped
+@Log4j2
 public class ChangedObjectsServiceInternal implements WithTransactionScope {
 
     /**
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerStandard.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerStandard.java
index eb8f3d6..3d0ae67 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerStandard.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerStandard.java
@@ -27,6 +27,7 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.util.ToString;
 import org.apache.isis.commons.collections.Can;
@@ -38,6 +39,8 @@ import org.apache.isis.security.api.authentication.AuthenticationRequest;
 import org.apache.isis.security.api.authentication.AuthenticationSession;
 import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
 import org.apache.isis.security.api.authentication.manager.RegistrationDetails;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import static org.apache.isis.commons.internal.base._With.requires;
@@ -48,6 +51,8 @@ import lombok.val;
 
 @Service
 @Named("isisSecurityApi.AuthenticationManagerStandard")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class AuthenticationManagerStandard implements AuthenticationManager {
 
diff --git a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java
index 705fd51..23c515e 100644
--- a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java
+++ b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java
@@ -18,15 +18,19 @@
  */
 package org.apache.isis.security.keycloak.webmodule;
 
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
+import javax.inject.Named;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -39,7 +43,9 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
  * WebModule to enable support for Keycloak.
  */
 @Service
-@Order(Ordered.HIGHEST_PRECEDENCE + 100)
+@Named("isisSecKeycloak.WebModuleKeycloak")
+@Order(OrderPrecedence.HIGHEST + 100)
+@Log4j2
 public final class WebModuleKeycloak implements WebModule  {
 
     private final static String KEYCLOAK_FILTER_CLASS_NAME = KeycloakFilter.class.getName();
diff --git a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
index 1705470..3faf8c3 100644
--- a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
+++ b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
@@ -22,11 +22,13 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.inject.Named;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.shiro.config.Ini;
 import org.apache.shiro.realm.Realm;
 import org.apache.shiro.web.env.EnvironmentLoaderListener;
@@ -51,6 +53,7 @@ import static org.apache.isis.commons.internal.context._Context.getDefaultClassL
 import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
 
 import lombok.SneakyThrows;
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 /**
@@ -59,8 +62,11 @@ import lombok.val;
  * Can be customized via static {@link WebModuleShiro#setShiroEnvironmentClass(Class)}
  * @since 2.0
  */
-@Service @Order(Ordered.HIGHEST_PRECEDENCE + 100)
-public final class WebModuleShiro implements WebModule  {
+@Service
+@Named("isisSecKeycloak.WebModuleKeycloak")
+@Order(OrderPrecedence.HIGHEST + 200)
+@Log4j2
+public class WebModuleShiro implements WebModule  {
     
     private final static String SHIRO_LISTENER_CLASS_NAME = EnvironmentLoaderListenerForIsis.class.getName();
     private final static String SHIRO_FILTER_CLASS_NAME = ShiroFilter.class.getName();
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index f8d295d..cfca5ff 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -25,10 +25,14 @@ import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.inject.Singleton;
 
 import com.fasterxml.jackson.databind.node.NullNode;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.base._NullSafe;
@@ -43,6 +47,7 @@ import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 
 import static org.apache.isis.commons.internal.base._With.requires;
 
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 
@@ -50,7 +55,12 @@ import lombok.val;
  * Similar to Isis' value encoding, but with additional support for JSON
  * primitives.
  */
-@Service @Singleton
+@Service
+@Named("isisRoRendering.JsonValueEncoder")
+@Order(OrderPrecedence.HIGH)
+@Primary
+@Singleton
+@Log4j2
 public class JsonValueEncoder {
 
     @Inject private SpecificationLoader specificationLoader;
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
index da67861..320c910 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
@@ -18,14 +18,20 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.service;
 
+import lombok.extern.log4j.Log4j2;
+
 import java.util.List;
 import java.util.function.Function;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.metamodel.spec.ManagedObject;
@@ -40,6 +46,10 @@ import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.ContentNeg
 import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.ContentNegotiationServiceForRestfulObjectsV1_0;
 
 @Service
+@Named("isisRoRendering.RepresentationServiceContentNegotiator")
+@Order(OrderPrecedence.HIGH)
+@Primary
+@Log4j2
 public class RepresentationServiceContentNegotiator implements RepresentationService {
 
     @Inject List<ContentNegotiationService> contentNegotiationServices;
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/acceptheader/AcceptHeaderServiceForRest.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/acceptheader/AcceptHeaderServiceForRest.java
index ee28a12..6860b52 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/acceptheader/AcceptHeaderServiceForRest.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/acceptheader/AcceptHeaderServiceForRest.java
@@ -35,14 +35,19 @@ import javax.ws.rs.ext.Provider;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.acceptheader.AcceptHeaderService;
 import org.apache.isis.commons.internal.base._NullSafe;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
 @Service
 @Named("isisRoRendering.AcceptHeaderServiceForRest")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @RequestScoped
 @Log4j2
 public class AcceptHeaderServiceForRest implements AcceptHeaderService {
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
index 95dcb23..7d1f993 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
@@ -32,6 +32,7 @@ import javax.ws.rs.core.Response.ResponseBuilder;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.domain.DomainObjectList;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.facets.actcoll.typeof.TypeOfFacet;
@@ -59,6 +60,8 @@ import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndPr
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectCollectionReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectPropertyReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import lombok.extern.log4j.Log4j2;
@@ -66,6 +69,8 @@ import lombok.val;
 
 @Service
 @Named("isisRoRendering.ContentNegotiationServiceForRestfulObjectsV1_0")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Log4j2
 public class ContentNegotiationServiceForRestfulObjectsV1_0 implements ContentNegotiationService {
 
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java
index 5f05aa6..1e18248 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java
@@ -26,6 +26,8 @@ import javax.inject.Named;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 
 import org.apache.isis.applib.annotation.DomainService;
@@ -56,7 +58,7 @@ import lombok.val;
 
 @Service
 @Named("isisRoRendering.ContentNegotiationServiceOrgApacheIsisV1")
-@Order(200) //in effect, is the relative priority (lower numbers have higher priority)
+@Order(OrderPrecedence.DEFAULT + 200)
 @Log4j2
 public class ContentNegotiationServiceOrgApacheIsisV1 extends ContentNegotiationServiceAbstract {
 
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java
index 5a972e5..4e99b2b 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java
@@ -18,12 +18,16 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.service.conneg;
 
+import lombok.extern.log4j.Log4j2;
+
 import java.util.List;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -51,7 +55,9 @@ import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationSer
  * </p>
  */
 @Service
-@Order(100) //in effect, is the relative priority (lower numbers have higher priority)
+@Named("isisRoRendering.ContentNegotiationServiceXRoDomainType")
+@Order(OrderPrecedence.DEFAULT + 100)
+@Log4j2
 public class ContentNegotiationServiceXRoDomainType extends ContentNegotiationServiceAbstract {
 
     public static final String X_RO_DOMAIN_TYPE = "x-ro-domain-type";
diff --git a/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/WebModuleRestfulObjects.java b/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/WebModuleRestfulObjects.java
index 3724ab8..9e46a37 100644
--- a/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/WebModuleRestfulObjects.java
+++ b/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/WebModuleRestfulObjects.java
@@ -24,6 +24,7 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.viewer.restfulobjects.viewer.webmodule.auth.AuthenticationSessionStrategyBasicAuth;
 import org.springframework.core.annotation.Order;
@@ -52,7 +53,7 @@ import lombok.val;
  */
 @Service
 @Named("isisRoViewer.WebModuleRestfulObjects")
-@Order(-80)
+@Order(OrderPrecedence.DEFAULT - 80)
 @Log4j2
 public final class WebModuleRestfulObjects implements WebModule  {
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java
index 2e494a4..d691265 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java
@@ -23,7 +23,11 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -41,7 +45,11 @@ import lombok.extern.log4j.Log4j2;
 /**
  * @since 2.0
  */
-@Service @Log4j2 
+@Service
+@Named("isisWicketUi.IsisWicketThemeSupportDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class IsisWicketThemeSupportDefault implements IsisWicketThemeSupport {
 
     private final _Lazy<ThemeProviderComposite> themeProvider = _Lazy.of(this::createThemeProvider);
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index e9abf95..f96b2d0 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -19,8 +19,15 @@
 
 package org.apache.isis.viewer.wicket.viewer.registries.components;
 
+import lombok.extern.log4j.Log4j2;
+
 import java.util.ServiceLoader;
 
+import javax.inject.Named;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Plugin;
@@ -95,6 +102,10 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.Enti
  * <tt>META-INF/services</tt>).
  */
 @Service
+@Named("isisWicketViewer.ComponentFactoryRegistrarDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistrar {
     
     @Override
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java
index bbc7e87..d1505a5 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java
@@ -26,10 +26,14 @@ import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.model.IModel;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.collections._Lists;
@@ -45,6 +49,7 @@ import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistrar.C
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.webapp.context.IsisWebAppCommonContext;
 
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 /**
@@ -52,6 +57,10 @@ import lombok.val;
  * provided {@link ComponentFactoryRegistrar}.
  */
 @Service
+@Named("isisWicketViewer.ComponentFactoryRegistryDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class ComponentFactoryRegistryDefault implements ComponentFactoryRegistry {
 
     @Inject private ComponentFactoryRegistrar componentFactoryRegistrar;
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java
index ecc2fbc..dd79c1c 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java
@@ -19,7 +19,14 @@
 
 package org.apache.isis.viewer.wicket.viewer.registries.pages;
 
+import lombok.extern.log4j.Log4j2;
+
+import javax.inject.Named;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Page;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.viewer.wicket.model.models.PageType;
@@ -42,6 +49,10 @@ import org.apache.isis.viewer.wicket.ui.pages.voidreturn.VoidReturnPage;
  * for each of the {@link PageType}s.
  */
 @Service
+@Named("isisWicketViewer.PageClassListDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class PageClassListDefault implements PageClassList {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
index a34d1eb..5853bfc 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
@@ -19,12 +19,18 @@
 
 package org.apache.isis.viewer.wicket.viewer.registries.pages;
 
+import lombok.extern.log4j.Log4j2;
+
 import java.util.Map;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Page;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.collections._Maps;
@@ -38,6 +44,10 @@ import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistrySpi;
  * underlying {@link PageClassList}.
  */
 @Service
+@Named("isisWicketViewer.PageClassRegistryDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class PageClassRegistryDefault implements PageClassRegistry, PageClassRegistrySpi {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java
index 9016edf..1a62e97 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java
@@ -19,13 +19,19 @@
 
 package org.apache.isis.viewer.wicket.viewer.registries.pages;
 
+import lombok.extern.log4j.Log4j2;
+
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Page;
 import org.apache.wicket.RestartResponseAtInterceptPageException;
 import org.apache.wicket.RestartResponseException;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.viewer.wicket.model.models.PageType;
@@ -36,6 +42,10 @@ import org.apache.isis.viewer.wicket.ui.pages.PageNavigationService;
  * Default implementation of {@link org.apache.isis.viewer.wicket.ui.pages.PageNavigationService}
  */
 @Service
+@Named("isisWicketViewer.PageNavigationServiceDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class PageNavigationServiceDefault implements PageNavigationService {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/BookmarkUiServiceWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/BookmarkUiServiceWicket.java
index 2fc172f..86d8fa1 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/BookmarkUiServiceWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/BookmarkUiServiceWicket.java
@@ -20,6 +20,9 @@ package org.apache.isis.viewer.wicket.viewer.services;
 
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmarkui.BookmarkUiService;
@@ -29,6 +32,8 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisWicketViewer.BookmarkUiServiceWicket")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @Log4j2
 public class BookmarkUiServiceWicket implements BookmarkUiService {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java
index c46f571..9bd6e93 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java
@@ -18,15 +18,21 @@
  */
 package org.apache.isis.viewer.wicket.viewer.services;
 
+import lombok.extern.log4j.Log4j2;
+
 import java.net.URI;
 import java.net.URISyntaxException;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Page;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.linking.DeepLinkService;
@@ -41,6 +47,10 @@ import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
  * for Wicket Viewer
  */
 @Service
+@Named("isisWicketViewer.DeepLinkServiceWicket")
+@Order(OrderPrecedence.HIGH)
+@Primary
+@Log4j2
 public class DeepLinkServiceWicket implements DeepLinkService {
 
     @Inject private PageClassRegistry pageClassRegistry;
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
index ece2f3e..82f703d 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
@@ -24,7 +24,10 @@ import java.util.Set;
 
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Session;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -35,6 +38,8 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisWicketViewer.HintStoreUsingWicketSession")
+@Order(OrderPrecedence.HIGH)
+@Primary
 @Log4j2
 public class HintStoreUsingWicketSession implements HintStore {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java
index 9830b7a..54f393d 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java
@@ -26,8 +26,11 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.request.resource.PackageResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.collections._Lists;
@@ -39,6 +42,9 @@ import org.apache.isis.metamodel.spec.Specification;
 import org.apache.isis.viewer.wicket.model.models.ImageResourceCache;
 
 import images.Images;
+import lombok.extern.log4j.Log4j2;
+
+import javax.inject.Named;
 
 /**
  * Caches images loaded either from the same package as the specified object, or from the <tt>images</tt> package (using the {@link Images} otherwise.
@@ -48,6 +54,10 @@ import images.Images;
  * Searches for a fixed set of suffixes: <code>png, gif, jpeg, jpg, svg</code>.
  */
 @Service
+@Named("isisWicketViewer.ImageResourceCacheClassPath")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class ImageResourceCacheClassPath implements ImageResourceCache {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
index e71ef81..86813f02 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
@@ -18,11 +18,18 @@
  */
 package org.apache.isis.viewer.wicket.viewer.services;
 
+import lombok.extern.log4j.Log4j2;
+
 import java.util.Locale;
 
+import javax.inject.Named;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Application;
 import org.apache.wicket.Session;
 import org.apache.wicket.request.cycle.RequestCycle;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.i18n.LocaleProvider;
@@ -32,6 +39,10 @@ import org.apache.isis.applib.services.i18n.LocaleProvider;
  * An implementation that provides the locale of the current session.
  */
 @Service
+@Named("isisWicketViewer.LocaleProviderWicket")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class LocaleProviderWicket implements LocaleProvider {
 
     @Override
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
index 90b091d..132c4cd 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
@@ -29,8 +29,12 @@ import java.util.List;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+import javax.inject.Named;
 import javax.servlet.ServletContext;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.i18n.TranslationsResolver;
@@ -44,7 +48,11 @@ import lombok.extern.log4j.Log4j2;
 /**
  * An implementation that reads from /WEB-INF/...
  */
-@Service @Log4j2
+@Service
+@Named("isisWicketViewer.TranslationsResolverWicket")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class TranslationsResolverWicket implements TranslationsResolver {
 
     /**
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/WicketViewerSettingsDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/WicketViewerSettingsDefault.java
index d296b30..0295da3 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/WicketViewerSettingsDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/WicketViewerSettingsDefault.java
@@ -20,7 +20,11 @@
 package org.apache.isis.viewer.wicket.viewer.services;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PromptStyle;
@@ -28,8 +32,13 @@ import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 
 import lombok.Getter;
+import lombok.extern.log4j.Log4j2;
 
 @Service
+@Named("isisWicketViewer.WicketViewerSettingsDefault")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
+@Log4j2
 public class WicketViewerSettingsDefault implements WicketViewerSettings {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java
index 441225c..ff840c2 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java
@@ -25,6 +25,9 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -50,6 +53,8 @@ import lombok.val;
  */
 @Service
 @Named("isisWicketViewer.ObjectMementoServiceWicket")
+@Order(OrderPrecedence.DEFAULT)
+@Primary
 @Singleton
 public class ObjectMementoServiceWicket
 implements ObjectMementoService {
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/webmodule/WebModuleWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/webmodule/WebModuleWicket.java
index 77a7d0f..b5cb7cb 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/webmodule/WebModuleWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/webmodule/WebModuleWicket.java
@@ -18,14 +18,19 @@
  */
 package org.apache.isis.viewer.wicket.viewer.webmodule;
 
+import lombok.extern.log4j.Log4j2;
+
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.servlet.Filter;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.protocol.http.WicketFilter;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -45,7 +50,11 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
  * WebModule that provides the Wicket Viewer.
  * @since 2.0
  */
-@Service @Order(-80)
+@Service
+@Named("isisWicketViewer.WebModuleWicket")
+@Order(OrderPrecedence.DEFAULT - 80)
+@Primary
+@Log4j2
 public final class WebModuleWicket implements WebModule  {
 
     private final static String WICKET_FILTER_CLASS_NAME = WicketFilter.class.getName();
diff --git a/core/webapp/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java b/core/webapp/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java
index 5d98083..1088e18 100644
--- a/core/webapp/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java
+++ b/core/webapp/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java
@@ -18,6 +18,9 @@
  */
 package org.apache.isis.webapp.modules.logonlog;
 
+import lombok.extern.log4j.Log4j2;
+
+import javax.inject.Named;
 import javax.servlet.Filter;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
@@ -42,7 +45,10 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
  * 
  * @since 2.0
  */
-@Service @Order(Ordered.LOWEST_PRECEDENCE)
+@Service
+@Named("isisWebapp.WebModuleLogOnExceptionLogger")
+@Order(Ordered.LOWEST_PRECEDENCE) // TODO: should this not be the highest precedence, ie first in stack?
+@Log4j2
 public final class WebModuleLogOnExceptionLogger implements WebModule  {
 
     private final static String LOGONLOGGER_FILTER_CLASS_NAME = IsisLogOnExceptionFilter.class.getName();
diff --git a/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/WebModuleTemplateResources.java b/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/WebModuleTemplateResources.java
index 8778bc3..316fce4 100644
--- a/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/WebModuleTemplateResources.java
+++ b/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/WebModuleTemplateResources.java
@@ -18,11 +18,15 @@
  */
 package org.apache.isis.webapp.modules.templresources;
 
+import lombok.extern.log4j.Log4j2;
+
+import javax.inject.Named;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -34,7 +38,10 @@ import org.apache.isis.webapp.modules.WebModuleContext;
  * 
  * @since 2.0
  */
-@Service @Order(-100)
+@Service
+@Named("isisWebapp.WebModuleTemplateResources")
+@Order(OrderPrecedence.DEFAULT - 100)
+@Log4j2
 public final class WebModuleTemplateResources implements WebModule  {
 
     private final static String[] urlPatterns = { "*.thtml" };
diff --git a/examples/demo/src/main/java/demoapp/dom/error/service/DemoErrorReportingService.java b/examples/demo/src/main/java/demoapp/dom/error/service/DemoErrorReportingService.java
index e4fe595..5110d2e 100644
--- a/examples/demo/src/main/java/demoapp/dom/error/service/DemoErrorReportingService.java
+++ b/examples/demo/src/main/java/demoapp/dom/error/service/DemoErrorReportingService.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.services.error.Ticket;
 import org.apache.isis.applib.services.error.Ticket.StackTracePolicy;
 import org.apache.isis.runtime.services.error.EmailTicket;
 import org.apache.isis.runtime.services.error.EmailTicket.MailTo;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import lombok.val;
@@ -34,6 +35,7 @@ import javax.inject.Named;
 
 @Service
 @Named("demoapp.demoErrorReportingService")
+@Qualifier("demo")
 public class DemoErrorReportingService implements ErrorReportingService {
 
     @Override
diff --git a/examples/demo/src/main/java/demoapp/dom/events/EventSubscriber.java b/examples/demo/src/main/java/demoapp/dom/events/EventSubscriber.java
index 91d601d..a3abb62 100644
--- a/examples/demo/src/main/java/demoapp/dom/events/EventSubscriber.java
+++ b/examples/demo/src/main/java/demoapp/dom/events/EventSubscriber.java
@@ -22,6 +22,7 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 
@@ -39,6 +40,7 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("demoapp.eventSubscriber")
+@Qualifier("demo")
 @Log4j2
 public class EventSubscriber {
 
diff --git a/examples/demo/src/main/java/demoapp/dom/jee/JeeDemoService.java b/examples/demo/src/main/java/demoapp/dom/jee/JeeDemoService.java
index ba028e1..68dba18 100644
--- a/examples/demo/src/main/java/demoapp/dom/jee/JeeDemoService.java
+++ b/examples/demo/src/main/java/demoapp/dom/jee/JeeDemoService.java
@@ -18,9 +18,15 @@
  */
 package demoapp.dom.jee;
 
+import lombok.extern.log4j.Log4j2;
+
+import javax.inject.Named;
+
 import org.springframework.stereotype.Service;
 
 @Service
+@Named("demoapp.JeeDemoService")
+@Log4j2
 public class JeeDemoService {
 
     public String getMessage() {
diff --git a/examples/demo/src/main/java/demoapp/utils/LibraryPreloadingService.java b/examples/demo/src/main/java/demoapp/utils/LibraryPreloadingService.java
index 7dd4a32..be331e6 100644
--- a/examples/demo/src/main/java/demoapp/utils/LibraryPreloadingService.java
+++ b/examples/demo/src/main/java/demoapp/utils/LibraryPreloadingService.java
@@ -19,6 +19,7 @@
 package demoapp.utils;
 
 import javax.annotation.PostConstruct;
+import javax.inject.Named;
 
 import org.springframework.stereotype.Service;
 
@@ -26,9 +27,12 @@ import org.apache.isis.commons.internal.concurrent._ConcurrentContext;
 import org.apache.isis.commons.internal.concurrent._ConcurrentTaskList;
 import org.apache.isis.extensions.asciidoc.applib.value.AsciiDoc;
 
+import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 @Service
+@Named("demoapp.LibraryPreloadingService")
+@Log4j2
 public class LibraryPreloadingService {
 
     @PostConstruct


[isis] 04/05: ISIS-2216: adds @Qualifier to all services.

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

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

commit 7d0021e5ea6bcf5a486dfebb0fb38d213466690c
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Dec 7 07:42:38 2019 +0000

    ISIS-2216: adds @Qualifier to all services.
    
    Also renames some services:
    - AuditingServiceInternal (to AuditerDispatchService)
    - PublishingServiceInternal (to PublisherDispatchService)
    - AuthenticationManagerStandard (to AuthenticationManagerDefault)
    - AuthorizationManagerStandard (to AuthorizationManagerDefault)
---
 .../org/apache/isis/applib/IsisModuleApplib.java   |  4 +--
 .../isis/applib/annotation/OrderPrecedence.java    |  2 +-
 .../isis/applib/mixins/dto/DtoMappingHelper.java   |  6 ++--
 .../isis/applib/services/clock/ClockService.java   |  4 ++-
 .../applib/services/command/CommandContext.java    |  5 +--
 .../ContentMappingServiceForCommandDto.java        |  4 ++-
 .../ContentMappingServiceForCommandsDto.java       |  2 ++
 .../applib/services/iactn/InteractionContext.java  |  4 ++-
 .../applib/services/jaxb/JaxbServiceDefault.java   |  4 ++-
 .../services/publish/PublisherServiceLogging.java  |  2 ++
 ...Internal.java => QueryResultsCacheDefault.java} |  4 ++-
 .../applib/services/scratchpad/Scratchpad.java     |  2 ++
 .../services/tablecol/TableColumnOrderService.java |  2 ++
 .../UrlEncodingServiceWithCompression.java         |  6 ++--
 .../environment/IsisSystemEnvironment.java         |  2 ++
 .../config/viewer/wicket/WebAppConfiguration.java  |  4 ++-
 ...ctionInvocationFacetForDomainEventAbstract.java |  6 ++--
 .../autocomplete/AutoCompleteFacetAbstract.java    |  8 ++---
 ...tySetterOrClearFacetForDomainEventAbstract.java |  6 ++--
 .../objectmanager/ObjectManagerDefault.java        |  2 ++
 .../metamodel/services/ServiceInjectorDefault.java |  2 ++
 .../appfeat/ApplicationFeatureFactory.java         |  4 ++-
 .../services/events/MetamodelEventService.java     |  5 +--
 .../exceprecog/ExceptionRecognizerDocDefault.java  |  7 ++--
 .../services/grid/GridLoaderServiceDefault.java    |  6 ++--
 .../services/grid/GridReaderUsingJaxb.java         |  4 ++-
 .../services/grid/GridServiceDefault.java          |  5 +--
 .../grid/bootstrap3/GridSystemServiceBS3.java      |  5 +--
 .../services/layout/LayoutServiceDefault.java      |  4 ++-
 .../metamodel/MetaModelServiceDefault.java         |  4 ++-
 ...Internal.java => PublisherDispatchService.java} |  2 +-
 .../services/registry/ServiceRegistryDefault.java  |  9 ++---
 .../services/swagger/SwaggerServiceDefault.java    |  4 ++-
 .../services/title/TitleServiceDefault.java        |  4 ++-
 .../services/user/UserServiceDefault.java          | 10 +++---
 .../specloader/InjectorMethodEvaluatorDefault.java |  2 ++
 .../specloader/ProgrammingModelServiceDefault.java |  4 ++-
 .../specloader/SpecificationLoaderDefault.java     |  2 ++
 .../specimpl/OneToManyAssociationMixedIn.java      |  8 ++---
 .../specimpl/OneToOneAssociationMixedIn.java       |  8 ++---
 .../datanucleus/DataNucleusSettings.java           |  2 ++
 .../service/JdoPersistenceLifecycleService.java    |  4 ++-
 ...eptionRecognizerCompositeForJdoObjectStore.java |  6 ++--
 .../datanucleus5/jdosupport/IsisJdoSupportDN5.java |  4 ++-
 .../metrics/MetricsServiceDefault.java             | 11 +++---
 .../persistence/IsisPersistenceSessionJdoBase.java |  7 ++--
 .../IsisPlatformTransactionManagerForJdo.java      |  4 +--
 .../persistence/IsisTransactionJdo.java            | 16 ++++-----
 .../persistence/PersistenceSessionFactory5.java    |  4 ++-
 .../services/IsisModuleRuntimeServices.java        |  8 ++---
 .../auth/AuthenticationSessionProviderDefault.java |  4 ++-
 ...ndard.java => AuthorizationManagerDefault.java} |  8 +++--
 .../background/CommandExecutorServiceDefault.java  |  4 ++-
 .../bookmarks/BookmarkServiceInternalDefault.java  |  4 ++-
 .../command/CommandDtoServiceInternalDefault.java  |  6 ++--
 .../services/command/CommandServiceDefault.java    |  4 ++-
 .../confmenu/ConfigurationViewServiceDefault.java  |  7 ++--
 .../services/email/EmailServiceDefault.java        |  6 ++--
 .../services/eventbus/EventBusServiceSpring.java   |  4 ++-
 .../services/factory/FactoryServiceDefault.java    |  4 ++-
 .../homepage/HomePageResolverServiceDefault.java   |  4 ++-
 .../services/i18n/po/TranslationServicePo.java     |  4 ++-
 .../ixn/InteractionDtoServiceInternalDefault.java  |  6 ++--
 .../menubars/MenuBarsLoaderServiceDefault.java     |  4 ++-
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |  4 ++-
 .../services/message/MessageServiceDefault.java    |  4 ++-
 ...t.java => PublisherDispatchServiceDefault.java} | 17 ++++-----
 .../sessmgmt/SessionManagementServiceDefault.java  |  4 ++-
 .../runtime/services/sudo/SudoServiceDefault.java  |  6 ++--
 .../userprof/UserProfileServiceDefault.java        |  6 ++--
 .../userreg/EmailNotificationServiceDefault.java   |  6 ++--
 .../services/wrapper/WrapperFactoryDefault.java    |  4 ++-
 .../services/xactn/TransactionServiceSpring.java   |  4 ++-
 .../xmlsnapshot/XmlSnapshotServiceDefault.java     |  4 ++-
 .../org/apache/isis/runtime/IsisModuleRuntime.java |  8 ++---
 .../context/session/RuntimeEventService.java       |  4 ++-
 .../events/PersistenceEventService.java            |  4 ++-
 .../persistence/events/TimestampService.java       |  5 +--
 .../system/session/IsisSessionFactoryDefault.java  |  4 ++-
 ...ceInternal.java => AuditerDispatchService.java} | 10 +++---
 ...iceInternal.java => ChangedObjectsService.java} |  6 ++--
 .../system/transaction/PreAndPostValues.java       |  4 +--
 .../isis/security/api/IsisModuleSecurityApi.java   |  4 +--
 .../api/authentication/AuthenticationSession.java  |  4 +--
 .../AuthenticationRequestLogonFixture.java         |  4 +--
 ...dard.java => AuthenticationManagerDefault.java} | 16 +++++----
 ...rdAuthenticationManager_AuthenticationTest.java |  6 ++--
 ...rdAuthenticationManager_AuthenticatorsTest.java |  8 ++---
 .../keycloak/webmodule/WebModuleKeycloak.java      |  4 +--
 .../security/shiro/webmodule/WebModuleShiro.java   |  3 +-
 .../rendering/domainobjects/JsonValueEncoder.java  |  2 ++
 .../RepresentationServiceContentNegotiator.java    | 42 +++++++---------------
 .../acceptheader/AcceptHeaderServiceForRest.java   |  6 ++--
 ...entNegotiationServiceForRestfulObjectsV1_0.java |  6 ++--
 .../ContentNegotiationServiceOrgApacheIsisV1.java  |  7 ++--
 .../ContentNegotiationServiceXRoDomainType.java    |  5 +--
 .../viewer/webmodule/WebModuleRestfulObjects.java  |  6 ++--
 .../themepicker/IsisWicketThemeSupportDefault.java |  4 ++-
 .../ComponentFactoryRegistrarDefault.java          |  4 ++-
 .../ComponentFactoryRegistryDefault.java           |  4 ++-
 .../registries/pages/PageClassListDefault.java     |  4 ++-
 .../registries/pages/PageClassRegistryDefault.java |  4 ++-
 .../pages/PageNavigationServiceDefault.java        |  4 ++-
 .../viewer/services/BookmarkUiServiceWicket.java   |  3 +-
 .../viewer/services/DeepLinkServiceWicket.java     |  3 +-
 .../services/HintStoreUsingWicketSession.java      |  3 +-
 .../services/ImageResourceCacheClassPath.java      |  4 ++-
 .../viewer/services/LocaleProviderWicket.java      |  5 +--
 .../services/TranslationsResolverWicket.java       |  5 +--
 .../services/WicketViewerSettingsDefault.java      |  4 ++-
 .../mementos/ObjectMementoServiceWicket.java       |  8 ++---
 .../wicket/viewer/webmodule/WebModuleWicket.java   |  5 +--
 .../logonlog/WebModuleLogOnExceptionLogger.java    |  6 ++--
 .../templresources/WebModuleTemplateResources.java |  4 ++-
 .../isis/testdomain/rest/RestEndpointService.java  |  3 +-
 .../testdomain/bootstrapping/builtin-IsisBoot.list |  2 +-
 .../bootstrapping/builtin-domain-services.list     |  2 +-
 .../bootstrapping/builtin-requestscoped.list       |  2 +-
 .../bootstrapping/builtin-singleton.list           |  2 +-
 .../spring/service/SpringBeansService.java         |  5 +++
 .../dom/services/calendar/CalendarService.java     |  9 +++--
 .../isis/extensions/excel/dom/ExcelService.java    |  7 ++++
 .../fakedata/dom/services/FakeDataService.java     |  9 +++--
 .../dom/webmodule/WebModuleH2Console.java          |  5 ++-
 .../PasswordEncryptionServiceUsingJBcrypt.java     |  5 +++
 .../permission/ApplicationPermissionFactory.java   |  8 +++--
 .../jdo/dom/role/ApplicationRoleFactory.java       |  7 +++-
 .../jdo/dom/tenancy/ApplicationTenancyFactory.java |  7 +++-
 .../jdo/dom/user/ApplicationUserFactory.java       |  7 +++-
 .../secman/jdo/seed/SeedSecurityModuleService.java |  6 ++++
 .../services/SecurityRealmServiceUsingShiro.java   |  5 +++
 .../fixtures/FixturesLifecycleService.java         |  8 ++++-
 .../extensions/fixtures/IsisModuleExtFixtures.java |  4 +--
 .../fixturescripts/ExecutionParametersService.java |  7 ++++
 ...l.java => QueryResultsCacheControlDefault.java} | 11 ++++--
 .../modules/ModuleWithFixturesService.java         |  7 ++++
 .../extensions/sse/services/SseServiceDefault.java |  8 ++++-
 .../sse/webmodule/WebModuleServerSentEvents.java   |  5 ++-
 .../isis/legacy/applib/DomainObjectContainer.java  |  9 +++--
 139 files changed, 488 insertions(+), 276 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java b/core/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
index 6684a08..5f16632 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
@@ -40,7 +40,7 @@ import org.apache.isis.applib.services.jaxb.JaxbServiceDefault;
 import org.apache.isis.applib.services.layout.LayoutServiceMenu;
 import org.apache.isis.applib.services.metamodel.MetaModelServicesMenu;
 import org.apache.isis.applib.services.publish.PublisherServiceLogging;
-import org.apache.isis.applib.services.queryresultscache.QueryResultsCacheInternal;
+import org.apache.isis.applib.services.queryresultscache.QueryResultsCacheDefault;
 import org.apache.isis.applib.services.scratchpad.Scratchpad;
 import org.apache.isis.applib.services.swagger.SwaggerServiceMenu;
 import org.apache.isis.applib.services.tablecol.TableColumnOrderService;
@@ -82,7 +82,7 @@ import org.springframework.context.annotation.Import;
         InteractionContext.class,
         JaxbServiceDefault.class,
         PublisherServiceLogging.class,
-        QueryResultsCacheInternal.class,
+        QueryResultsCacheDefault.class,
         Scratchpad.class,
         TableColumnOrderService.Default.class,
         UrlEncodingServiceWithCompression.class,
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/OrderPrecedence.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/OrderPrecedence.java
index c305158..5eeb3a2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/OrderPrecedence.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/OrderPrecedence.java
@@ -49,7 +49,7 @@ public class OrderPrecedence {
     /**
      * Used by framework services that could be overridden by application code (though not commonly).
      */
-    public static final int DEFAULT = 0;
+    public static final int MIDPOINT = 0;
     /**
      * Used by framework services that are expected to be overridden by application code, or that act as a fallback.
      */
diff --git a/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java b/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java
index ecdc02f..301502a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java
@@ -23,22 +23,22 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.schema.common.v1.BookmarkObjectState;
 import org.apache.isis.schema.common.v1.OidDto;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisApplib.DtoMappingHelper")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class DtoMappingHelper {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java b/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java
index 62ada44..c15abb9 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java
@@ -28,6 +28,7 @@ import java.time.OffsetDateTime;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -42,8 +43,9 @@ import org.apache.isis.applib.clock.Clock;
  */
 @Service
 @Named("isisApplib.ClockService")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class ClockService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
index 00d2d37..b1c759f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
@@ -24,9 +24,9 @@ import javax.enterprise.context.RequestScoped;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 /**
@@ -39,8 +39,9 @@ import org.springframework.stereotype.Service;
 @Service
 @Named("isisApplib.CommandContext")
 @RequestScoped
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class CommandContext {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandDto.java b/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandDto.java
index eae9098..35fcdea 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandDto.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandDto.java
@@ -28,6 +28,7 @@ import javax.inject.Named;
 import javax.ws.rs.core.MediaType;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 
@@ -50,6 +51,7 @@ import org.springframework.stereotype.Service;
 @Named("isisApplib.ContentMappingServiceForCommandDto")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("CommandDto")
 @Log4j2
 public class ContentMappingServiceForCommandDto implements ContentMappingService {
 
@@ -111,7 +113,7 @@ public class ContentMappingServiceForCommandDto implements ContentMappingService
     // specify quite a high priority since custom processors will probably want to run after this one
     // (but can choose to run before if they wish)
     @Order(OrderPrecedence.HIGH)
-    @Primary
+    @Qualifier("Command")
     @Log4j2
     public static class CopyOverFromCommand implements CommandDtoProcessorService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandsDto.java b/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandsDto.java
index af81fe8..88e65e2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandsDto.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/conmap/command/ContentMappingServiceForCommandsDto.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.conmap.ContentMappingService;
 import org.apache.isis.schema.cmd.v1.CommandDto;
 import org.apache.isis.schema.cmd.v1.CommandsDto;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -40,6 +41,7 @@ import org.springframework.stereotype.Service;
 @Named("isisApplib.ContentMappingServiceForCommandsDto")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("CommandsDto")
 @Log4j2
 public class ContentMappingServiceForCommandsDto implements ContentMappingService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
index 68e2591..e1bd3e9 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
@@ -24,6 +24,7 @@ import javax.enterprise.context.RequestScoped;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -39,8 +40,9 @@ import org.apache.isis.applib.annotation.DomainService;
  */
 @Service
 @Named("isisApplib.InteractionContext")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @RequestScoped
 @Log4j2
 public class InteractionContext {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
index 55185c7..3c85ad4 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
@@ -31,6 +31,7 @@ import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -45,8 +46,9 @@ import org.apache.isis.applib.jaxbadapters.PersistentEntityAdapter;
 
 @Service
 @Named("isisApplib.JaxbServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class JaxbServiceDefault extends JaxbService.Simple {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java
index 0fc2d2f..1153b98 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java
@@ -19,6 +19,7 @@
 package org.apache.isis.applib.services.publish;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -37,6 +38,7 @@ import javax.inject.Named;
 @Named("isisApplib.PublisherServiceLogging")
 @Order(OrderPrecedence.LOW)
 @Primary
+@Qualifier("Logging")
 @Log4j2
 public class PublisherServiceLogging implements PublisherService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheDefault.java
similarity index 97%
rename from core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java
rename to core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheDefault.java
index a578c6d..55456e6 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheDefault.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -54,8 +55,9 @@ import lombok.extern.log4j.Log4j2;
 @Order(OrderPrecedence.HIGH)
 @Primary
 @RequestScoped
+@Qualifier("Default")
 @Log4j2
-public class QueryResultsCacheInternal implements QueryResultsCache, WithTransactionScope {
+public class QueryResultsCacheDefault implements QueryResultsCache, WithTransactionScope {
 
     private final Map<Key, Value<?>> cache = _Maps.newHashMap();
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/scratchpad/Scratchpad.java b/core/applib/src/main/java/org/apache/isis/applib/services/scratchpad/Scratchpad.java
index a9ba852..9583093 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/scratchpad/Scratchpad.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/scratchpad/Scratchpad.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.commons.internal.collections._Maps;
+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,6 +49,7 @@ import org.springframework.stereotype.Service;
 @Order(OrderPrecedence.HIGH)
 @Primary
 @Named("isisApplib.Scratchpad")
+@Qualifier("Default")
 @Log4j2
 public class Scratchpad {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java b/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
index dcf8ac1..f53119b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
@@ -27,6 +27,7 @@ import javax.inject.Named;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -50,6 +51,7 @@ public interface TableColumnOrderService {
     @Named("isisApplib.TableColumnOrderService.Default")
     @Order(OrderPrecedence.LOW)
     @Primary
+    @Qualifier("Default")
     @Log4j2
     public static class Default implements TableColumnOrderService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression.java b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression.java
index ea498e4..7e3e6fa 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression.java
@@ -24,19 +24,19 @@ import java.nio.charset.StandardCharsets;
 
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.commons.internal.base._Bytes;
 import org.apache.isis.commons.internal.base._Strings;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisApplib.UrlEncodingServiceWithCompression")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Compression")
 @Log4j2
 public class UrlEncodingServiceWithCompression implements UrlEncodingService {
 
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
index b0ed9c9..0995b42 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.ContextClosedEvent;
@@ -51,6 +52,7 @@ import lombok.extern.log4j.Log4j2;
 @Named("isisCommons.IsisSystemEnvironment")
 @Order(-1_073_741_824) // same as OrderedPrecedence#HIGH
 @Primary
+@Qualifier("Default")
 @Singleton
 @Log4j2
 public class IsisSystemEnvironment {
diff --git a/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppConfiguration.java b/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppConfiguration.java
index 1a420ba..c39a12f 100644
--- a/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppConfiguration.java
@@ -26,6 +26,7 @@ import javax.inject.Named;
 import javax.inject.Singleton;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.core.io.AbstractResource;
@@ -45,8 +46,9 @@ import lombok.val;
 @Service
 @Singleton
 @Named("isisConfig.WebAppConfiguration")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class WebAppConfiguration {
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 23065af..86d5e28 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -64,7 +64,7 @@ import org.apache.isis.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.metamodel.services.ixn.InteractionDtoServiceInternal;
-import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
+import org.apache.isis.metamodel.services.publishing.PublisherDispatchService;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
@@ -509,8 +509,8 @@ implements ImperativeFacet {
         return serviceRegistry.lookupServiceElseFail(ClockService.class);
     }
 
-    private PublishingServiceInternal getPublishingServiceInternal() {
-        return serviceRegistry.lookupServiceElseFail(PublishingServiceInternal.class);
+    private PublisherDispatchService getPublishingServiceInternal() {
+        return serviceRegistry.lookupServiceElseFail(PublisherDispatchService.class);
     }
 
     private InteractionDtoServiceInternal getInteractionDtoServiceInternal() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
index e2355a0..ae585be 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
@@ -32,7 +32,7 @@ import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.metamodel.facets.param.autocomplete.MinLengthUtil;
-import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
+import org.apache.isis.metamodel.services.publishing.PublisherDispatchService;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
 public abstract class AutoCompleteFacetAbstract 
@@ -73,7 +73,7 @@ implements AutoCompleteFacet {
 
         final ManagedObject resultAdapter =
                 getPublishingServiceInternal().withPublishingSuppressed(
-                        new PublishingServiceInternal.Block<ManagedObject>() {
+                        new PublisherDispatchService.Block<ManagedObject>() {
                     @Override
                     public ManagedObject exec() {
                         final Object list = invoke();
@@ -104,8 +104,8 @@ implements AutoCompleteFacet {
         return getServiceRegistry().lookupService(repositoryClass).orElse(null);
     }
 
-    private PublishingServiceInternal getPublishingServiceInternal() {
-        return getServiceRegistry().lookupServiceElseFail(PublishingServiceInternal.class);
+    private PublisherDispatchService getPublishingServiceInternal() {
+        return getServiceRegistry().lookupServiceElseFail(PublisherDispatchService.class);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
index 4369069..f3ce1e8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
@@ -43,7 +43,7 @@ import org.apache.isis.metamodel.facets.properties.publish.PublishedPropertyFace
 import org.apache.isis.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import org.apache.isis.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.isis.metamodel.services.ixn.InteractionDtoServiceInternal;
-import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
+import org.apache.isis.metamodel.services.publishing.PublisherDispatchService;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.schema.ixn.v1.PropertyEditDto;
@@ -322,8 +322,8 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
         return getServiceRegistry().lookupServiceElseFail(ClockService.class);
     }
 
-    private PublishingServiceInternal getPublishingServiceInternal() {
-        return getServiceRegistry().lookupServiceElseFail(PublishingServiceInternal.class);
+    private PublisherDispatchService getPublishingServiceInternal() {
+        return getServiceRegistry().lookupServiceElseFail(PublisherDispatchService.class);
     }
 
     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManagerDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManagerDefault.java
index df62b04..cb2fbd0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManagerDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManagerDefault.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -46,6 +47,7 @@ import lombok.val;
 @Named("isisMetaModel.ObjectManagerDefault")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("DEFAULT")
 @Log4j2
 public class ObjectManagerDefault implements ObjectManager {
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
index c3f57f0..ec365f2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
@@ -27,6 +27,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.beans.factory.InjectionPoint;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
@@ -43,6 +44,7 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 @Named("isisMetaModel.ServiceInjectorDefault")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class ServiceInjectorDefault implements ServiceInjector {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java
index fa662e8..a6958f4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -32,8 +33,9 @@ import org.apache.isis.applib.services.factory.FactoryService;
 
 @Service
 @Named("isisMetaModel.ApplicationFeatureFactory")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class ApplicationFeatureFactory {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java
index 69146fa..3f531f3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java
@@ -21,9 +21,9 @@ package org.apache.isis.metamodel.services.events;
 import javax.enterprise.event.Event;
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.inject.Singleton;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -46,8 +46,9 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service 
 @Named("isisMetaModel.MetamodelEventService")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 @Builder //for JUnit Test support
 public class MetamodelEventService {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
index 9d2ff41..78d2951 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
@@ -27,6 +27,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -39,11 +40,11 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 
 @Service
 @Named("isisMetaModel.ExceptionRecognizerDocDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
-public class ExceptionRecognizerDocDefault
-implements ExceptionRecognizer {
+public class ExceptionRecognizerDocDefault implements ExceptionRecognizer {
     
     @Inject private ServiceInjector serviceInjector;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
index 2712bca..e4782c7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
@@ -26,9 +26,9 @@ import java.util.Objects;
 
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.inject.Singleton;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -38,7 +38,6 @@ import org.apache.isis.applib.services.grid.GridLoaderService;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.commons.internal.resources._Resources;
 
@@ -46,8 +45,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisMetaModel.GridLoaderServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class GridLoaderServiceDefault implements GridLoaderService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridReaderUsingJaxb.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridReaderUsingJaxb.java
index dab5043..055e1b4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridReaderUsingJaxb.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridReaderUsingJaxb.java
@@ -29,6 +29,7 @@ import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -46,8 +47,9 @@ import org.apache.isis.commons.internal.collections._Arrays;
  */
 @Service
 @Named("isisMetaModel.GridReaderUsingJaxb")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class GridReaderUsingJaxb {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java
index 4b05e8a..1afd923 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java
@@ -25,9 +25,9 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.inject.Singleton;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -42,8 +42,9 @@ import org.apache.isis.commons.internal.collections._Lists;
 
 @Service
 @Named("isisMetaModel.GridServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class GridServiceDefault implements GridService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
index f0d4169..cb1f1d1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
@@ -28,9 +28,9 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.inject.Singleton;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -76,8 +76,9 @@ import lombok.val;
 
 @Service
 @Named("isisMetaModel.GridSystemServiceBS3")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("BS3")
 @Log4j2
 public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
index 9904399..f9d86c7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
@@ -27,6 +27,7 @@ import javax.inject.Named;
 import javax.xml.bind.Marshaller;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -49,8 +50,9 @@ import lombok.val;
 
 @Service
 @Named("isisMetaModel.LayoutServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class LayoutServiceDefault implements LayoutService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
index f850c90..d7e1101 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -30,6 +30,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -60,8 +61,9 @@ import org.apache.isis.schema.metamodel.v1.MetamodelDto;
 
 @Service
 @Named("isisMetaModel.MetaModelServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class MetaModelServiceDefault implements MetaModelService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/publishing/PublishingServiceInternal.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/publishing/PublisherDispatchService.java
similarity index 97%
rename from core/metamodel/src/main/java/org/apache/isis/metamodel/services/publishing/PublishingServiceInternal.java
rename to core/metamodel/src/main/java/org/apache/isis/metamodel/services/publishing/PublisherDispatchService.java
index bad25b1..9556c7d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/publishing/PublishingServiceInternal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/publishing/PublisherDispatchService.java
@@ -21,7 +21,7 @@ package org.apache.isis.metamodel.services.publishing;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.iactn.Interaction;
 
-public interface PublishingServiceInternal {
+public interface PublisherDispatchService {
 
     @Programmatic
     void publishObjects();
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
index 9d9bc94..8d0bdcc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
@@ -27,8 +27,6 @@ import java.util.stream.Stream;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.collections.Can;
@@ -39,6 +37,7 @@ import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.commons.internal.ioc.spring._Spring;
 import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -46,13 +45,11 @@ import org.springframework.stereotype.Service;
 import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
-/**
- * @since 2.0
- */
 @Service
 @Named("isisMetaModel.ServiceRegistryDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public final class ServiceRegistryDefault implements ServiceRegistry {
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
index 1b0d52f..0e350cf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -40,8 +41,9 @@ import static org.apache.isis.commons.internal.resources._Resources.prependConte
 
 @Service
 @Named("isisMetaModel.swaggerServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class SwaggerServiceDefault implements SwaggerService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java
index 3837d6f..1ecd5f8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -37,8 +38,9 @@ import lombok.val;
 
 @Service
 @Named("isisMetaModel.TitleServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class TitleServiceDefault implements TitleService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java
index 346683e..d229184 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java
@@ -29,12 +29,11 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.security.RoleMemento;
 import org.apache.isis.applib.security.UserMemento;
 import org.apache.isis.applib.services.sudo.SudoService;
@@ -44,8 +43,9 @@ import org.apache.isis.security.api.authentication.AuthenticationSessionProvider
 
 @Service
 @Named("isisMetaModel.UserServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class UserServiceDefault implements UserService {
 
@@ -155,8 +155,8 @@ public class UserServiceDefault implements UserService {
 
     @Service
     @Named("isisMetaModel.UserServiceDefault.SudoServiceSpi")
-    @Order(OrderPrecedence.DEFAULT)
-    @Primary
+    @Order(OrderPrecedence.MIDPOINT)
+    @Qualifier("UserServiceDefault")
     @Log4j2
     public static class SudoServiceSpi implements SudoService.Spi {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java
index 07c75fe..bd6ac21 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java
@@ -26,6 +26,7 @@ import java.lang.reflect.Method;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -36,6 +37,7 @@ import org.apache.isis.metamodel.spec.InjectorMethodEvaluator;
 @Named("isisMetaModel.InjectorMethodEvaluatorDefault")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public final class InjectorMethodEvaluatorDefault implements InjectorMethodEvaluator {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
index 9eb3fa3..b54fced 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
@@ -23,6 +23,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -41,8 +42,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisMetaModel.ProgrammingModelServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class ProgrammingModelServiceDefault implements ProgrammingModelService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
index b84df83..51a810e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
@@ -60,6 +60,7 @@ import org.apache.isis.metamodel.specloader.specimpl.standalonelist.ObjectSpecif
 import org.apache.isis.metamodel.specloader.validator.MetaModelValidatorAbstract;
 import org.apache.isis.metamodel.specloader.validator.ValidationFailures;
 import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -88,6 +89,7 @@ import static org.apache.isis.commons.internal.base._With.requires;
 @Named("isisMetaModel.SpecificationLoaderDefault")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class SpecificationLoaderDefault implements SpecificationLoader {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
index e30f36a..58e8071 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -38,7 +38,7 @@ import org.apache.isis.metamodel.facets.propcoll.notpersisted.NotPersistedFacetA
 import org.apache.isis.metamodel.interactions.InteractionUtils;
 import org.apache.isis.metamodel.interactions.UsabilityContext;
 import org.apache.isis.metamodel.interactions.VisibilityContext;
-import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
+import org.apache.isis.metamodel.services.publishing.PublisherDispatchService;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
@@ -150,7 +150,7 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
         
         final ManagedObject mixinAdapter = mixinAdapterFor(mixinType, mixedInAdapter);
         return getPublishingServiceInternal().withPublishingSuppressed(
-                new PublishingServiceInternal.Block<ManagedObject>() {
+                new PublisherDispatchService.Block<ManagedObject>() {
                     @Override public ManagedObject exec() {
                         return mixinAction.executeInternal(
                                 mixinAdapter, mixedInAdapter, new ManagedObject[0], interactionInitiatedBy);
@@ -210,8 +210,8 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
         return getSpecificationLoader().loadSpecification(mixinType);
     }
 
-    private PublishingServiceInternal getPublishingServiceInternal() {
-        return getServiceRegistry().lookupServiceElseFail(PublishingServiceInternal.class);
+    private PublisherDispatchService getPublishingServiceInternal() {
+        return getServiceRegistry().lookupServiceElseFail(PublisherDispatchService.class);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
index 38b9b56..89cffe5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
@@ -36,7 +36,7 @@ import org.apache.isis.metamodel.facets.propcoll.notpersisted.NotPersistedFacetA
 import org.apache.isis.metamodel.interactions.InteractionUtils;
 import org.apache.isis.metamodel.interactions.UsabilityContext;
 import org.apache.isis.metamodel.interactions.VisibilityContext;
-import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
+import org.apache.isis.metamodel.services.publishing.PublisherDispatchService;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
@@ -135,7 +135,7 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
         val mixinAdapter = mixinAdapterFor(mixinType, mixedInAdapter);
 
         return getPublishingServiceInternal().withPublishingSuppressed(
-                new PublishingServiceInternal.Block<ManagedObject>(){
+                new PublisherDispatchService.Block<ManagedObject>(){
                     @Override
                     public ManagedObject exec() {
                         return mixinAction.executeInternal(
@@ -196,8 +196,8 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
         return getSpecificationLoader().loadSpecification(mixinType);
     }
 
-    private PublishingServiceInternal getPublishingServiceInternal() {
-        return getServiceRegistry().lookupServiceElseFail(PublishingServiceInternal.class);
+    private PublisherDispatchService getPublishingServiceInternal() {
+        return getServiceRegistry().lookupServiceElseFail(PublisherDispatchService.class);
     }
 
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/DataNucleusSettings.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/DataNucleusSettings.java
index 1d79a05..6ac0a19 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/DataNucleusSettings.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/DataNucleusSettings.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -37,6 +38,7 @@ import org.springframework.stereotype.Service;
 @Named("isisJdoDn5.DataNucleusSettings")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class DataNucleusSettings {
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/service/JdoPersistenceLifecycleService.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/service/JdoPersistenceLifecycleService.java
index 4b6494e..03eb9cc 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/service/JdoPersistenceLifecycleService.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/service/JdoPersistenceLifecycleService.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.EventListener;
 import org.springframework.core.annotation.Order;
@@ -43,8 +44,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisJdoDn5.JdoPersistenceLifecycleService")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class JdoPersistenceLifecycleService {
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/exceprecog/ExceptionRecognizerCompositeForJdoObjectStore.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/exceprecog/ExceptionRecognizerCompositeForJdoObjectStore.java
index f68e84d..e2b7af2 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/exceprecog/ExceptionRecognizerCompositeForJdoObjectStore.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/exceprecog/ExceptionRecognizerCompositeForJdoObjectStore.java
@@ -24,12 +24,11 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 import org.apache.isis.config.IsisConfiguration;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -47,8 +46,9 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @Named("isisJdoDn5.ExceptionRecognizerCompositeForJdoObjectStore")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class ExceptionRecognizerCompositeForJdoObjectStore extends ExceptionRecognizerComposite {
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/jdosupport/IsisJdoSupportDN5.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/jdosupport/IsisJdoSupportDN5.java
index af321ce..09d5da8 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/jdosupport/IsisJdoSupportDN5.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/jdosupport/IsisJdoSupportDN5.java
@@ -40,6 +40,7 @@ import javax.jdo.query.BooleanExpression;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.persistence.jdo.applib.services.IsisJdoSupport_v3_2;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -63,8 +64,9 @@ import static org.apache.isis.commons.internal.base._NullSafe.stream;
  */
 @Service
 @Named("isisJdoDn5.IsisJdoSupportDN5")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("DN5")
 @Log4j2
 public class IsisJdoSupportDN5 implements IsisJdoSupport_v3_2 {
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceDefault.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceDefault.java
index d61fab5..e853bf6 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceDefault.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceDefault.java
@@ -29,20 +29,20 @@ import javax.jdo.listener.InstanceLifecycleEvent;
 import javax.jdo.listener.InstanceLifecycleListener;
 import javax.jdo.listener.LoadLifecycleListener;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.applib.services.metrics.MetricsService;
-import org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal;
+import org.apache.isis.runtime.system.transaction.ChangedObjectsService;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisJdoDn5.MetricsServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @RequestScoped
 @Log4j2
 public class MetricsServiceDefault implements MetricsService, InstanceLifecycleListener,
@@ -74,6 +74,7 @@ LoadLifecycleListener, WithTransactionScope {
         numberLoaded.set(0);
     }
 
-    @Inject ChangedObjectsServiceInternal changedObjectsServiceInternal;
+    @Inject
+    ChangedObjectsService changedObjectsServiceInternal;
 
 }
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java
index 796722e..8785780 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java
@@ -41,10 +41,9 @@ import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.commons.ToString;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryProcessor;
 import org.apache.isis.runtime.persistence.FixturesInstalledStateHolder;
 import org.apache.isis.runtime.system.persistence.PersistenceQueryFactory;
-import org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal;
+import org.apache.isis.runtime.system.transaction.ChangedObjectsService;
 import org.apache.isis.security.api.authentication.AuthenticationSession;
 
 import lombok.Getter;
@@ -70,7 +69,7 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
     protected final CommandService commandService;
 
     protected final InteractionContext interactionContext;
-    protected final ChangedObjectsServiceInternal changedObjectsServiceInternal;
+    protected final ChangedObjectsService changedObjectsServiceInternal;
     protected final FactoryService factoryService;
     protected final MetricsService metricsService;
     protected final ClockService clockService;
@@ -129,7 +128,7 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
         this.commandContext = lookupService(CommandContext.class);
         this.commandService = lookupService(CommandService.class);
         this.interactionContext = lookupService(InteractionContext.class);
-        this.changedObjectsServiceInternal = lookupService(ChangedObjectsServiceInternal.class);
+        this.changedObjectsServiceInternal = lookupService(ChangedObjectsService.class);
         this.metricsService = lookupService(MetricsService.class);
         this.factoryService = lookupService(FactoryService.class);
         this.clockService = lookupService(ClockService.class);
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java
index 65a7d43..487f751 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java
@@ -45,9 +45,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisJdoDn5.IsisPlatformTransactionManagerForJdo")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
-@Qualifier("jdo")
+@Qualifier("JdoDN5")
 @Log4j2
 public class IsisPlatformTransactionManagerForJdo extends AbstractPlatformTransactionManager {
 
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisTransactionJdo.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisTransactionJdo.java
index 688018a..d943d26 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisTransactionJdo.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisTransactionJdo.java
@@ -34,13 +34,13 @@ import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.collections._Inbox;
 import org.apache.isis.commons.internal.components.TransactionScopedComponent;
 import org.apache.isis.metamodel.commons.ToString;
-import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
+import org.apache.isis.metamodel.services.publishing.PublisherDispatchService;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.runtime.system.transaction.AuditingServiceInternal;
+import org.apache.isis.runtime.system.transaction.AuditerDispatchService;
 import org.apache.isis.runtime.system.transaction.IsisTransactionFlushException;
 import org.apache.isis.runtime.system.transaction.IsisTransactionManagerException;
 
@@ -154,8 +154,8 @@ public class IsisTransactionJdo implements TransactionScopedComponent, Transacti
 
     private final _Inbox<PersistenceCommand> persistenceCommands = new _Inbox<>();
 
-    private final PublishingServiceInternal publishingServiceInternal;
-    private final AuditingServiceInternal auditingServiceInternal;
+    private final PublisherDispatchService publisherDispatchService;
+    private final AuditerDispatchService auditerDispatchService;
 
     private final Iterable<WithTransactionScope> withTransactionScopes;
 
@@ -170,8 +170,8 @@ public class IsisTransactionJdo implements TransactionScopedComponent, Transacti
         //        this.authenticationSession = authenticationSession;
 
         //        this.messageBroker = authenticationSession.getMessageBroker();
-        this.publishingServiceInternal = serviceRegistry.lookupServiceElseFail(PublishingServiceInternal.class);
-        this.auditingServiceInternal = serviceRegistry.lookupServiceElseFail(AuditingServiceInternal.class);
+        this.publisherDispatchService = serviceRegistry.lookupServiceElseFail(PublisherDispatchService.class);
+        this.auditerDispatchService = serviceRegistry.lookupServiceElseFail(AuditerDispatchService.class);
 
         this.withTransactionScopes = serviceRegistry.select(WithTransactionScope.class);
 
@@ -371,9 +371,9 @@ public class IsisTransactionJdo implements TransactionScopedComponent, Transacti
         }
 
         try {
-            auditingServiceInternal.audit();
+            auditerDispatchService.audit();
 
-            publishingServiceInternal.publishObjects();
+            publisherDispatchService.publishObjects();
             doFlush();
 
         } catch (final RuntimeException ex) {
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java
index 20beeb4..a24bec2 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java
@@ -31,6 +31,7 @@ import javax.jdo.listener.StoreLifecycleListener;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.datanucleus.PropertyNames;
 import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -62,8 +63,9 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisJdoDn5.PersistenceSessionFactory5")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("JdoDN5")
 @Singleton
 @Log4j2
 public class PersistenceSessionFactory5
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/IsisModuleRuntimeServices.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/IsisModuleRuntimeServices.java
index f569f15..e5a6025 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/IsisModuleRuntimeServices.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/IsisModuleRuntimeServices.java
@@ -24,7 +24,7 @@ import org.springframework.context.annotation.Import;
 import org.apache.isis.codegen.bytebuddy.IsisModuleCodegenByteBuddy;
 import org.apache.isis.runtime.IsisModuleRuntime;
 import org.apache.isis.runtime.services.auth.AuthenticationSessionProviderDefault;
-import org.apache.isis.runtime.services.auth.AuthorizationManagerStandard;
+import org.apache.isis.runtime.services.auth.AuthorizationManagerDefault;
 import org.apache.isis.runtime.services.background.CommandExecutorServiceDefault;
 import org.apache.isis.runtime.services.bookmarks.BookmarkServiceInternalDefault;
 import org.apache.isis.runtime.services.command.CommandDtoServiceInternalDefault;
@@ -40,7 +40,7 @@ import org.apache.isis.runtime.services.ixn.InteractionDtoServiceInternalDefault
 import org.apache.isis.runtime.services.menubars.MenuBarsLoaderServiceDefault;
 import org.apache.isis.runtime.services.menubars.bootstrap3.MenuBarsServiceBS3;
 import org.apache.isis.runtime.services.message.MessageServiceDefault;
-import org.apache.isis.runtime.services.publish.PublishingServiceInternalDefault;
+import org.apache.isis.runtime.services.publish.PublisherDispatchServiceDefault;
 import org.apache.isis.runtime.services.repository.RepositoryServiceDefault;
 import org.apache.isis.runtime.services.routing.RoutingServiceDefault;
 import org.apache.isis.runtime.services.sessmgmt.SessionManagementServiceDefault;
@@ -59,7 +59,7 @@ import org.apache.isis.runtime.services.xmlsnapshot.XmlSnapshotServiceDefault;
 
         // @Service's
         AuthenticationSessionProviderDefault.class,
-        AuthorizationManagerStandard.class,
+        AuthorizationManagerDefault.class,
         BookmarkServiceInternalDefault.class,
         CommandDtoServiceInternalDefault.class,
         CommandExecutorServiceDefault.class,
@@ -75,7 +75,7 @@ import org.apache.isis.runtime.services.xmlsnapshot.XmlSnapshotServiceDefault;
         MenuBarsLoaderServiceDefault.class,
         MenuBarsServiceBS3.class,
         MessageServiceDefault.class,
-        PublishingServiceInternalDefault.class,
+        PublisherDispatchServiceDefault.class,
         SessionManagementServiceDefault.class,
         SudoServiceDefault.class,
         TransactionServiceSpring.class,
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthenticationSessionProviderDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthenticationSessionProviderDefault.java
index f3789bc..011be11 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthenticationSessionProviderDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthenticationSessionProviderDefault.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -39,8 +40,9 @@ import org.apache.isis.security.api.authentication.standard.SimpleSession;
 
 @Service
 @Named("isisRuntimeServices.AuthenticationSessionProviderDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class AuthenticationSessionProviderDefault implements AuthenticationSessionProvider {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerStandard.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerDefault.java
similarity index 93%
rename from core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerStandard.java
rename to core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerDefault.java
index 5801947..74303e3 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerStandard.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/auth/AuthorizationManagerDefault.java
@@ -25,6 +25,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -43,11 +44,12 @@ import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 @Service
-@Named("isisRuntimeServices.AuthorizationManagerStandard")
-@Order(OrderPrecedence.DEFAULT)
+@Named("isisRuntimeServices.AuthorizationManagerDefault")
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
-public class AuthorizationManagerStandard implements AuthorizationManager, MetaModelRefiner {
+public class AuthorizationManagerDefault implements AuthorizationManager, MetaModelRefiner {
 
     @Inject protected Authorizor authorizor;
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
index e13e55a..a91b6dd 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
@@ -28,6 +28,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -75,8 +76,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisRuntimeServices.CommandExecutorServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class CommandExecutorServiceDefault implements CommandExecutorService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
index af72bf6..66161e8 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
@@ -43,6 +43,7 @@ import org.apache.isis.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -56,8 +57,9 @@ import lombok.val;
  */
 @Service
 @Named("isisRuntimeServices.BookmarkServiceInternalDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class BookmarkServiceInternalDefault implements BookmarkService, SerializingAdapter {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandDtoServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandDtoServiceInternalDefault.java
index f74db4f..5845188 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandDtoServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandDtoServiceInternalDefault.java
@@ -24,8 +24,6 @@ import java.util.UUID;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
@@ -49,6 +47,7 @@ import org.apache.isis.schema.common.v1.OidsDto;
 import org.apache.isis.schema.common.v1.ValueWithTypeDto;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -58,8 +57,9 @@ import lombok.val;
 
 @Service
 @Named("isisRuntimeServices.CommandDtoServiceInternalDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class CommandDtoServiceInternalDefault implements CommandDtoServiceInternal {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java
index 62218c9..79fb9de 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java
@@ -23,6 +23,7 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -33,8 +34,9 @@ import org.apache.isis.applib.services.command.spi.CommandService;
 
 @Service
 @Named("isisRuntimeServices.CommandServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class CommandServiceDefault implements CommandService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java
index 06bc5c8..cd6a031 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java
@@ -26,8 +26,6 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.confview.ConfigurationProperty;
 import org.apache.isis.applib.services.confview.ConfigurationViewService;
@@ -35,9 +33,9 @@ import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
-import org.apache.isis.config.ConfigurationConstants;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.util.ConfigUtil;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -50,8 +48,9 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisRuntimeServices.ConfigurationViewServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class ConfigurationViewServiceDefault implements ConfigurationViewService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/email/EmailServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/email/EmailServiceDefault.java
index 50fd4cc..24b5af0 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/email/EmailServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/email/EmailServiceDefault.java
@@ -32,12 +32,11 @@ import org.apache.commons.mail.EmailException;
 import org.apache.commons.mail.ImageHtmlEmail;
 import org.apache.commons.mail.resolver.DataSourceClassPathResolver;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.email.EmailService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.config.IsisConfiguration;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -49,8 +48,9 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisRuntimeServices.EmailServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class EmailServiceDefault implements EmailService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java
index 6be08c7..caa56fb 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
@@ -33,8 +34,9 @@ import org.apache.isis.applib.services.eventbus.EventBusService;
 
 @Service
 @Named("isisRuntimeServices.EventBusServiceSpring")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Spring")
 @Log4j2
 public class EventBusServiceSpring implements EventBusService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java
index 8ac32d7..d8b5520 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -49,8 +50,9 @@ import lombok.val;
 
 @Service
 @Named("isisRuntimeServices.FactoryServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class FactoryServiceDefault implements FactoryService {
     
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
index 02cc17a..3f475a2 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
@@ -24,6 +24,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.*;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -50,8 +51,9 @@ import lombok.val;
 
 @Service
 @Named("isisRuntimeServices.HomePageResolverServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class HomePageResolverServiceDefault implements HomePageResolverService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
index c1c973a..8de915e 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -41,8 +42,9 @@ import org.apache.isis.config.IsisConfiguration;
 
 @Service
 @Named("isisRuntimeServices.TranslationServicePo")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Po")
 @Log4j2
 public class TranslationServicePo implements TranslationService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
index 887754f..4a27c3f 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
@@ -26,8 +26,6 @@ import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
@@ -48,14 +46,16 @@ import org.apache.isis.schema.ixn.v1.ActionInvocationDto;
 import org.apache.isis.schema.ixn.v1.PropertyEditDto;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisRuntimeServices.InteractionDtoServiceInternalDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class InteractionDtoServiceInternalDefault implements InteractionDtoServiceInternal {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
index bf76682..67b6a47 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
@@ -26,6 +26,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.core.io.AbstractResource;
@@ -43,8 +44,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisRuntimeServices.MenuBarsLoaderServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class MenuBarsLoaderServiceDefault implements MenuBarsLoaderService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
index 25d5381..b0d1db1 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
@@ -29,6 +29,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -68,8 +69,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisRuntimeServices.MenuBarsServiceBS3")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("BS3")
 @Log4j2
 public class MenuBarsServiceBS3 implements MenuBarsService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java
index 7118f60..3628d69 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -37,8 +38,9 @@ import org.apache.isis.security.api.authentication.MessageBroker;
 
 @Service
 @Named("isisRuntimeServices.MessageServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class MessageServiceDefault implements MessageService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublishingServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublisherDispatchServiceDefault.java
similarity index 93%
rename from core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublishingServiceInternalDefault.java
rename to core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublisherDispatchServiceDefault.java
index 425f38d..8671c59 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublishingServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/publish/PublisherDispatchServiceDefault.java
@@ -32,8 +32,6 @@ import javax.enterprise.context.RequestScoped;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.annotation.PublishingChangeKind;
 import org.apache.isis.applib.services.clock.ClockService;
@@ -48,8 +46,9 @@ import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.facets.object.publishedobject.PublishedObjectFacet;
-import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
-import org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal;
+import org.apache.isis.metamodel.services.publishing.PublisherDispatchService;
+import org.apache.isis.runtime.system.transaction.ChangedObjectsService;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -58,12 +57,13 @@ import org.springframework.stereotype.Service;
  * Wrapper around {@link PublisherService}.  Is a no-op if there is no injected service.
  */
 @Service
-@Named("isisRuntimeServices.PublishingServiceInternalDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Named("isisRuntimeServices.PublisherDispatchServiceDefault")
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
 @RequestScoped
+@Qualifier("Default")
 @Log4j2
-public class PublishingServiceInternalDefault implements PublishingServiceInternal {
+public class PublisherDispatchServiceDefault implements PublisherDispatchService {
 
 
     @Override
@@ -176,7 +176,8 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
 
     // -- injected services
     @Inject List<PublisherService> publisherServices;
-    @Inject ChangedObjectsServiceInternal changedObjectsServiceInternal;
+    @Inject
+    ChangedObjectsService changedObjectsServiceInternal;
     @Inject CommandContext commandContext;
     @Inject InteractionContext interactionContext;
     @Inject ClockService clockService;
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java
index d815307..a5096e0 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -36,8 +37,9 @@ import lombok.val;
 
 @Service
 @Named("isisRuntimeServices.SessionManagementServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class SessionManagementServiceDefault implements SessionManagementService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sudo/SudoServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sudo/SudoServiceDefault.java
index 0168093..4cf0e44 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sudo/SudoServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sudo/SudoServiceDefault.java
@@ -27,18 +27,18 @@ import java.util.concurrent.Callable;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.sudo.SudoService;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisRuntimeServices.SudoServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class SudoServiceDefault implements SudoService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userprof/UserProfileServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userprof/UserProfileServiceDefault.java
index 9aa19f7..990c8e1 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userprof/UserProfileServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userprof/UserProfileServiceDefault.java
@@ -23,20 +23,20 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.userprof.UserProfileService;
 import org.apache.isis.security.api.authentication.AuthenticationSessionProvider;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisRuntimeServices.UserProfileServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class UserProfileServiceDefault implements UserProfileService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userreg/EmailNotificationServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userreg/EmailNotificationServiceDefault.java
index 22d678f..5d74176 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userreg/EmailNotificationServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/userreg/EmailNotificationServiceDefault.java
@@ -30,8 +30,6 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.email.EmailService;
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
@@ -39,6 +37,7 @@ import org.apache.isis.applib.services.userreg.events.EmailEventAbstract;
 import org.apache.isis.applib.services.userreg.events.EmailRegistrationEvent;
 import org.apache.isis.applib.services.userreg.events.PasswordResetEvent;
 import org.apache.isis.commons.internal.resources._Resources;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -51,8 +50,9 @@ import static java.util.regex.Pattern.quote;
  */
 @Service
 @Named("isisRuntimeServices.EmailNotificationServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class EmailNotificationServiceDefault implements EmailNotificationService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/WrapperFactoryDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/WrapperFactoryDefault.java
index 8d78a9d..38d60ea 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/WrapperFactoryDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/WrapperFactoryDefault.java
@@ -33,6 +33,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -80,8 +81,9 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisRuntimeServices.WrapperFactoryDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class WrapperFactoryDefault implements WrapperFactory {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java
index 4c00bf4..9eb0ef8 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java
@@ -25,6 +25,7 @@ import javax.annotation.Nonnull;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -46,8 +47,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisRuntimeServices.TransactionServiceSpring")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Spring")
 @Log4j2
 public class TransactionServiceSpring implements TransactionService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java
index 07579fe..0940b8a 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -45,8 +46,9 @@ import org.apache.isis.metamodel.util.snapshot.XmlSnapshot;
  */
 @Service
 @Named("isisRuntimeServices.XmlSnapshotServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class XmlSnapshotServiceDefault extends XmlSnapshotServiceAbstract {
     
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/IsisModuleRuntime.java b/core/runtime/src/main/java/org/apache/isis/runtime/IsisModuleRuntime.java
index 389ab00..f859396 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/IsisModuleRuntime.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/IsisModuleRuntime.java
@@ -28,8 +28,8 @@ import org.apache.isis.runtime.system.persistence.events.PersistenceEventService
 import org.apache.isis.runtime.system.persistence.events.PersistenceEventService_Spring;
 import org.apache.isis.runtime.system.persistence.events.TimestampService;
 import org.apache.isis.runtime.system.session.IsisSessionFactoryDefault;
-import org.apache.isis.runtime.system.transaction.AuditingServiceInternal;
-import org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal;
+import org.apache.isis.runtime.system.transaction.AuditerDispatchService;
+import org.apache.isis.runtime.system.transaction.ChangedObjectsService;
 
 @Configuration
 @Import({
@@ -41,8 +41,8 @@ import org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal;
         PersistenceEventService.class,
         TimestampService.class,
         IsisSessionFactoryDefault.class,
-        AuditingServiceInternal.class,
-        ChangedObjectsServiceInternal.class,
+        AuditerDispatchService.class,
+        ChangedObjectsService.class,
 
         // @Configuration's
         RuntimeEventSupport_Spring.class,
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java
index a934ad2..fa5ea6f 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -39,8 +40,9 @@ import org.apache.isis.runtime.system.session.IsisSession;
  */
 @Service
 @Named("isisRuntime.RuntimeEventService")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class RuntimeEventService {
     
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java
index b840bab..8bde4d5 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java
@@ -25,6 +25,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -36,8 +37,9 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @Named("isisRuntime.PersistenceEventService")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class PersistenceEventService {
     
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/TimestampService.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/TimestampService.java
index 78c36cc..1d60bcf 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/TimestampService.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/TimestampService.java
@@ -22,6 +22,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.EventListener;
 import org.springframework.core.annotation.Order;
@@ -32,14 +33,14 @@ import org.apache.isis.applib.mixins.timestamp.HoldsUpdatedBy;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.user.UserService;
 
-import lombok.extern.java.Log;
 import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 @Service
 @Named("isisRuntime.TimestampService")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class TimestampService {
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
index ee9df7b..bdd018c 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
@@ -28,6 +28,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.context.event.EventListener;
@@ -68,8 +69,9 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisRuntime.IsisSessionFactoryDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class IsisSessionFactoryDefault implements IsisSessionFactory {
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditerDispatchService.java
similarity index 93%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java
rename to core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditerDispatchService.java
index ce43ea1..f53a331 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditerDispatchService.java
@@ -27,6 +27,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -47,14 +48,15 @@ import lombok.val;
  * Wrapper around {@link org.apache.isis.applib.services.audit.AuditerService}.
  */
 @Service
-@Named("isisRuntime.AuditingServiceInternal")
+@Named("isisRuntime.AuditerDispatchService")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("Default")
 @Log4j2
-public class AuditingServiceInternal {
+public class AuditerDispatchService {
     
     @Inject private List<AuditerService> auditerServices;
-    @Inject private ChangedObjectsServiceInternal changedObjectsServiceInternal;
+    @Inject private ChangedObjectsService changedObjectsService;
     @Inject private UserService userService;
     @Inject private ClockService clockService;
     @Inject private TransactionService transactionService;
@@ -82,7 +84,7 @@ public class AuditingServiceInternal {
             return;
         }
         final Set<Map.Entry<AdapterAndProperty, PreAndPostValues>> changedObjectProperties =
-                changedObjectsServiceInternal.getChangedObjectProperties();
+                changedObjectsService.getChangedObjectProperties();
 
         final String currentUser = userService.getUser().getName();
         final java.sql.Timestamp currentTime = clockService.nowAsJavaSqlTimestamp();
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsService.java
similarity index 98%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsServiceInternal.java
rename to core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsService.java
index 88e3ca6..243dd31 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/ChangedObjectsService.java
@@ -29,6 +29,7 @@ import javax.enterprise.context.RequestScoped;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+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,12 +49,13 @@ import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 @Service
-@Named("isisRuntime.ChangedObjectsServiceInternal")
+@Named("isisRuntime.ChangedObjectsService")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("Default")
 @RequestScoped
 @Log4j2
-public class ChangedObjectsServiceInternal implements WithTransactionScope {
+public class ChangedObjectsService implements WithTransactionScope {
 
     /**
      * Used for auditing: this contains the pre- values of every property of every object enlisted.
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PreAndPostValues.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PreAndPostValues.java
index f8a49c4..9ffbe14 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PreAndPostValues.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PreAndPostValues.java
@@ -54,7 +54,7 @@ public class PreAndPostValues {
     private PreAndPostValues(Object pre, Object post) {
         this.pre = pre;
         this.post = post;
-        this.preString = ChangedObjectsServiceInternal.asString(pre);
+        this.preString = ChangedObjectsService.asString(pre);
     }
 
     /**
@@ -82,7 +82,7 @@ public class PreAndPostValues {
 
     public void setPost(Object post) {
         this.post = post;
-        this.postString = ChangedObjectsServiceInternal.asString(post);
+        this.postString = ChangedObjectsService.asString(post);
     }
 
     @Override
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/IsisModuleSecurityApi.java b/core/security/api/src/main/java/org/apache/isis/security/api/IsisModuleSecurityApi.java
index 85cc6d2..fbe7609 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/IsisModuleSecurityApi.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/IsisModuleSecurityApi.java
@@ -18,14 +18,14 @@
  */
 package org.apache.isis.security.api;
 
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerStandard;
+import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
 @Configuration
 @Import({
         // @Service's
-        AuthenticationManagerStandard.class
+        AuthenticationManagerDefault.class
 })
 public class IsisModuleSecurityApi {
 }
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/AuthenticationSession.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/AuthenticationSession.java
index c6ee9f9..14fc5e6 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/AuthenticationSession.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/AuthenticationSession.java
@@ -27,7 +27,7 @@ import java.util.stream.Stream;
 import org.apache.isis.applib.security.UserMemento;
 import org.apache.isis.commons.internal.encoding.Encodable;
 import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerStandard;
+import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
 
 /**
  * The representation within the system of an authenticated user.
@@ -102,7 +102,7 @@ public interface AuthenticationSession extends Encodable, Serializable {
     public enum Type {
         DEFAULT,
         /**
-         * Instructs the {@link AuthenticationManagerStandard} to not cache this session in its internal map of
+         * Instructs the {@link AuthenticationManagerDefault} to not cache this session in its internal map of
          * sessions by validation code, and therefore to ignore this aspect when considering if an
          * {@link AuthenticationSession} is
          * {@link AuthenticationManager#isSessionValid(AuthenticationSession) valid} or not.
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/fixtures/AuthenticationRequestLogonFixture.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/fixtures/AuthenticationRequestLogonFixture.java
index ba95b49..3d62f58 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/fixtures/AuthenticationRequestLogonFixture.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/fixtures/AuthenticationRequestLogonFixture.java
@@ -24,13 +24,13 @@ import java.util.Collections;
 
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.security.api.authentication.AuthenticationRequestAbstract;
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerStandard;
+import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
 
 /**
  * For testing purposes, request corresponding to a {@link LogonFixture}.
  *
  * <p>
- * Understood directly by {@link AuthenticationManagerStandard}.
+ * Understood directly by {@link AuthenticationManagerDefault}.
  */
 public class AuthenticationRequestLogonFixture extends AuthenticationRequestAbstract {
 
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerStandard.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerDefault.java
similarity index 92%
rename from core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerStandard.java
rename to core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerDefault.java
index 3d0ae67..59a7f42 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerStandard.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerDefault.java
@@ -39,6 +39,7 @@ import org.apache.isis.security.api.authentication.AuthenticationRequest;
 import org.apache.isis.security.api.authentication.AuthenticationSession;
 import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
 import org.apache.isis.security.api.authentication.manager.RegistrationDetails;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -50,11 +51,12 @@ import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
 @Service
-@Named("isisSecurityApi.AuthenticationManagerStandard")
-@Order(OrderPrecedence.DEFAULT)
+@Named("isisSecurityApi.AuthenticationManagerDefault")
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
-public class AuthenticationManagerStandard implements AuthenticationManager {
+public class AuthenticationManagerDefault implements AuthenticationManager {
 
     @Inject private ServiceRegistry serviceRegistry;
 
@@ -178,8 +180,8 @@ public class AuthenticationManagerStandard implements AuthenticationManager {
 
     // -- DEBUGGING
  
-    private final static ToString<AuthenticationManagerStandard> toString =
-            ToString.<AuthenticationManagerStandard>toString("class", obj->obj.getClass().getSimpleName())
+    private final static ToString<AuthenticationManagerDefault> toString =
+            ToString.<AuthenticationManagerDefault>toString("class", obj->obj.getClass().getSimpleName())
             .thenToString("authenticators", obj->""+obj.authenticators.size())
             .thenToString("users", obj->""+obj.userByValidationCode.size());
 
@@ -194,8 +196,8 @@ public class AuthenticationManagerStandard implements AuthenticationManager {
      * @param mockAuthenticator
      * @return
      */
-    public static AuthenticationManagerStandard instanceForTesting(Authenticator authenticator) {
-        val manager = new AuthenticationManagerStandard();
+    public static AuthenticationManagerDefault instanceForTesting(Authenticator authenticator) {
+        val manager = new AuthenticationManagerDefault();
         manager.authenticators = Can.ofSingleton(authenticator);
         return manager;
     }
diff --git a/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java b/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java
index 5656222..200d9c0 100644
--- a/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java
+++ b/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.security.authentication.standard;
 
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerStandard;
+import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
 import org.apache.isis.security.api.authentication.standard.Authenticator;
 import org.apache.isis.security.api.authentication.standard.RandomCodeGenerator;
 import org.hamcrest.Description;
@@ -45,7 +45,7 @@ public class StandardAuthenticationManager_AuthenticationTest {
 
     private final Mockery mockery = new JUnit4Mockery();
 
-    private AuthenticationManagerStandard authenticationManager;
+    private AuthenticationManagerDefault authenticationManager;
 
     private RandomCodeGenerator mockRandomCodeGenerator;
     private Authenticator mockAuthenticator;
@@ -57,7 +57,7 @@ public class StandardAuthenticationManager_AuthenticationTest {
         mockAuthenticator = mockery.mock(Authenticator.class);
         mockAuthSession = mockery.mock(AuthenticationSession.class);
 
-        authenticationManager = AuthenticationManagerStandard.instanceForTesting(mockAuthenticator);
+        authenticationManager = AuthenticationManagerDefault.instanceForTesting(mockAuthenticator);
         authenticationManager.setRandomCodeGenerator(mockRandomCodeGenerator);
 
         mockery.checking(new Expectations() {
diff --git a/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticatorsTest.java b/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticatorsTest.java
index 439daee..b11a1a2 100644
--- a/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticatorsTest.java
+++ b/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticatorsTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.security.authentication.standard;
 
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerStandard;
+import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
 import org.apache.isis.security.api.authentication.standard.Authenticator;
 import org.apache.isis.security.api.authentication.standard.NoAuthenticatorException;
 import org.jmock.Mockery;
@@ -39,7 +39,7 @@ public class StandardAuthenticationManager_AuthenticatorsTest {
 
     private final Mockery mockery = new JUnit4Mockery();
 
-    private AuthenticationManagerStandard authenticationManager;
+    private AuthenticationManagerDefault authenticationManager;
     private Authenticator mockAuthenticator;
 
     @Before
@@ -56,7 +56,7 @@ public class StandardAuthenticationManager_AuthenticatorsTest {
     @Test(expected = NoAuthenticatorException.class)
     public void shouldNotBeAbleToAuthenticateWithNoAuthenticators() throws Exception {
         
-        authenticationManager = new AuthenticationManagerStandard();
+        authenticationManager = new AuthenticationManagerDefault();
         
         authenticationManager.authenticate(new AuthenticationRequestPassword("foo", "bar"));
     }
@@ -64,7 +64,7 @@ public class StandardAuthenticationManager_AuthenticatorsTest {
     @Test
     public void shouldBeAbleToUseAuthenticators() throws Exception {
         
-        authenticationManager = AuthenticationManagerStandard.instanceForTesting(mockAuthenticator);
+        authenticationManager = AuthenticationManagerDefault.instanceForTesting(mockAuthenticator);
         
         assertThat(authenticationManager.getAuthenticators().size(), is(1));
         assertThat(authenticationManager.getAuthenticators().getFirst().get(), is(sameInstance(mockAuthenticator)));
diff --git a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java
index 23c515e..1022d35 100644
--- a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java
+++ b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java
@@ -30,8 +30,7 @@ import javax.servlet.ServletException;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.Ordered;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -45,6 +44,7 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
 @Service
 @Named("isisSecKeycloak.WebModuleKeycloak")
 @Order(OrderPrecedence.HIGHEST + 100)
+@Qualifier("Keycloak")
 @Log4j2
 public final class WebModuleKeycloak implements WebModule  {
 
diff --git a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
index 3faf8c3..610820d 100644
--- a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
+++ b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
@@ -36,7 +36,7 @@ import org.apache.shiro.web.env.IniWebEnvironment;
 import org.apache.shiro.web.env.WebEnvironment;
 import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
 import org.apache.shiro.web.servlet.ShiroFilter;
-import org.springframework.core.Ordered;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ReflectionUtils;
@@ -65,6 +65,7 @@ import lombok.val;
 @Service
 @Named("isisSecKeycloak.WebModuleKeycloak")
 @Order(OrderPrecedence.HIGHEST + 200)
+@Qualifier("Shiro")
 @Log4j2
 public class WebModuleShiro implements WebModule  {
     
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index cfca5ff..b028ffe 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -31,6 +31,7 @@ import javax.inject.Singleton;
 import com.fasterxml.jackson.databind.node.NullNode;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -59,6 +60,7 @@ import lombok.val;
 @Named("isisRoRendering.JsonValueEncoder")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("Default")
 @Singleton
 @Log4j2
 public class JsonValueEncoder {
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
index 320c910..8124645 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
@@ -30,6 +30,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -49,6 +50,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.ContentNeg
 @Named("isisRoRendering.RepresentationServiceContentNegotiator")
 @Order(OrderPrecedence.HIGH)
 @Primary
+@Qualifier("ContentNegotiator")
 @Log4j2
 public class RepresentationServiceContentNegotiator implements RepresentationService {
 
@@ -64,12 +66,8 @@ public class RepresentationServiceContentNegotiator implements RepresentationSer
             final IResourceContext renderContext,
             final ManagedObject objectAdapter) {
 
-        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
-            @Override
-            public ResponseBuilder apply(final ContentNegotiationService connegService) {
-                return connegService.buildResponse(renderContext, objectAdapter);
-            }
-        });
+        final ResponseBuilder responseBuilder = buildResponse(
+                connegService -> connegService.buildResponse(renderContext, objectAdapter));
 
         assertContentNegotiationServiceHandled(responseBuilder);
         return buildResponse(responseBuilder);
@@ -81,12 +79,8 @@ public class RepresentationServiceContentNegotiator implements RepresentationSer
             final ObjectAndProperty objectAndProperty,
             final MemberReprMode memberReprMode) {
 
-        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
-            @Override
-            public ResponseBuilder apply(final ContentNegotiationService connegService) {
-                return connegService.buildResponse(renderContext, objectAndProperty);
-            }
-        });
+        final ResponseBuilder responseBuilder = buildResponse(
+                connegService -> connegService.buildResponse(renderContext, objectAndProperty));
 
         assertContentNegotiationServiceHandled(responseBuilder);
         return buildResponse(responseBuilder);
@@ -99,12 +93,8 @@ public class RepresentationServiceContentNegotiator implements RepresentationSer
             final ObjectAndCollection objectAndCollection,
             final MemberReprMode memberReprMode) {
 
-        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
-            @Override
-            public ResponseBuilder apply(final ContentNegotiationService connegService) {
-                return connegService.buildResponse(renderContext, objectAndCollection);
-            }
-        });
+        final ResponseBuilder responseBuilder = buildResponse(
+                connegService -> connegService.buildResponse(renderContext, objectAndCollection));
 
         assertContentNegotiationServiceHandled(responseBuilder);
         return buildResponse(responseBuilder);
@@ -118,12 +108,8 @@ public class RepresentationServiceContentNegotiator implements RepresentationSer
             final IResourceContext renderContext,
             final ObjectAndAction objectAndAction) {
 
-        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
-            @Override
-            public ResponseBuilder apply(final ContentNegotiationService connegService) {
-                return connegService.buildResponse(renderContext, objectAndAction);
-            }
-        });
+        final ResponseBuilder responseBuilder = buildResponse(
+                connegService -> connegService.buildResponse(renderContext, objectAndAction));
 
         assertContentNegotiationServiceHandled(responseBuilder);
         return buildResponse(responseBuilder);
@@ -136,12 +122,8 @@ public class RepresentationServiceContentNegotiator implements RepresentationSer
             final ObjectAndActionInvocation objectAndActionInvocation,
             final SelfLink selfLink) {
 
-        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
-            @Override
-            public ResponseBuilder apply(final ContentNegotiationService connegService) {
-                return connegService.buildResponse(renderContext, objectAndActionInvocation);
-            }
-        });
+        final ResponseBuilder responseBuilder = buildResponse(
+                connegService -> connegService.buildResponse(renderContext, objectAndActionInvocation));
 
         assertContentNegotiationServiceHandled(responseBuilder);
         return buildResponse(responseBuilder);
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/acceptheader/AcceptHeaderServiceForRest.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/acceptheader/AcceptHeaderServiceForRest.java
index 6860b52..75ff0af 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/acceptheader/AcceptHeaderServiceForRest.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/acceptheader/AcceptHeaderServiceForRest.java
@@ -33,11 +33,10 @@ import javax.ws.rs.container.ContainerResponseFilter;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Provider;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.acceptheader.AcceptHeaderService;
 import org.apache.isis.commons.internal.base._NullSafe;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -46,8 +45,9 @@ import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
 @Service
 @Named("isisRoRendering.AcceptHeaderServiceForRest")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("ForRest")
 @RequestScoped
 @Log4j2
 public class AcceptHeaderServiceForRest implements AcceptHeaderService {
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
index 7d1f993..1840685 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
@@ -30,8 +30,6 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.domain.DomainObjectList;
 import org.apache.isis.config.IsisConfiguration;
@@ -60,6 +58,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndPr
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectCollectionReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectPropertyReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -69,8 +68,9 @@ import lombok.val;
 
 @Service
 @Named("isisRoRendering.ContentNegotiationServiceForRestfulObjectsV1_0")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("RestfulObjectsV1_0")
 @Log4j2
 public class ContentNegotiationServiceForRestfulObjectsV1_0 implements ContentNegotiationService {
 
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java
index 1e18248..4065b48 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java
@@ -27,11 +27,9 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.springframework.context.annotation.Primary;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.client.SuppressionType;
 import org.apache.isis.metamodel.consent.Consent;
@@ -58,7 +56,8 @@ import lombok.val;
 
 @Service
 @Named("isisRoRendering.ContentNegotiationServiceOrgApacheIsisV1")
-@Order(OrderPrecedence.DEFAULT + 200)
+@Order(OrderPrecedence.MIDPOINT + 200)
+@Qualifier("OrgApacheIsisV1")
 @Log4j2
 public class ContentNegotiationServiceOrgApacheIsisV1 extends ContentNegotiationServiceAbstract {
 
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java
index 4e99b2b..bf97fcb 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java
@@ -28,6 +28,7 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -38,7 +39,6 @@ import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
 import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext;
 import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndActionInvocation;
-import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 
 /**
  * Handles content negotiation for accept headers requiring <code>application/json</code> or <code>application/xml</code>and specifying an x-ro-domain-type; will delegate to
@@ -56,7 +56,8 @@ import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationSer
  */
 @Service
 @Named("isisRoRendering.ContentNegotiationServiceXRoDomainType")
-@Order(OrderPrecedence.DEFAULT + 100)
+@Order(OrderPrecedence.MIDPOINT + 100)
+@Qualifier("XRoDomainType")
 @Log4j2
 public class ContentNegotiationServiceXRoDomainType extends ContentNegotiationServiceAbstract {
 
diff --git a/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/WebModuleRestfulObjects.java b/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/WebModuleRestfulObjects.java
index 9e46a37..80d0b28 100644
--- a/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/WebModuleRestfulObjects.java
+++ b/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/WebModuleRestfulObjects.java
@@ -27,10 +27,9 @@ import javax.servlet.ServletException;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.viewer.restfulobjects.viewer.webmodule.auth.AuthenticationSessionStrategyBasicAuth;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
 import org.springframework.stereotype.Service;
@@ -53,7 +52,8 @@ import lombok.val;
  */
 @Service
 @Named("isisRoViewer.WebModuleRestfulObjects")
-@Order(OrderPrecedence.DEFAULT - 80)
+@Order(OrderPrecedence.MIDPOINT - 80)
+@Qualifier("RestfulObjects")
 @Log4j2
 public final class WebModuleRestfulObjects implements WebModule  {
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java
index d691265..88156bf 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -47,8 +48,9 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisWicketUi.IsisWicketThemeSupportDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class IsisWicketThemeSupportDefault implements IsisWicketThemeSupport {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index f96b2d0..bdce54d 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -26,6 +26,7 @@ import java.util.ServiceLoader;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -103,8 +104,9 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.Enti
  */
 @Service
 @Named("isisWicketViewer.ComponentFactoryRegistrarDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistrar {
     
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java
index d1505a5..f9ec480 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.model.IModel;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -58,8 +59,9 @@ import lombok.val;
  */
 @Service
 @Named("isisWicketViewer.ComponentFactoryRegistryDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class ComponentFactoryRegistryDefault implements ComponentFactoryRegistry {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java
index dd79c1c..4604536 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java
@@ -25,6 +25,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Page;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -50,8 +51,9 @@ import org.apache.isis.viewer.wicket.ui.pages.voidreturn.VoidReturnPage;
  */
 @Service
 @Named("isisWicketViewer.PageClassListDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class PageClassListDefault implements PageClassList {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
index 5853bfc..ca0df2d 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
@@ -29,6 +29,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Page;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -45,8 +46,9 @@ import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistrySpi;
  */
 @Service
 @Named("isisWicketViewer.PageClassRegistryDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class PageClassRegistryDefault implements PageClassRegistry, PageClassRegistrySpi {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java
index 1a62e97..ab23439 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java
@@ -30,6 +30,7 @@ import org.apache.wicket.RestartResponseAtInterceptPageException;
 import org.apache.wicket.RestartResponseException;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -43,8 +44,9 @@ import org.apache.isis.viewer.wicket.ui.pages.PageNavigationService;
  */
 @Service
 @Named("isisWicketViewer.PageNavigationServiceDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class PageNavigationServiceDefault implements PageNavigationService {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/BookmarkUiServiceWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/BookmarkUiServiceWicket.java
index 86d8fa1..62e4c68 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/BookmarkUiServiceWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/BookmarkUiServiceWicket.java
@@ -21,6 +21,7 @@ package org.apache.isis.viewer.wicket.viewer.services;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -33,7 +34,7 @@ import lombok.extern.log4j.Log4j2;
 @Service
 @Named("isisWicketViewer.BookmarkUiServiceWicket")
 @Order(OrderPrecedence.HIGH)
-@Primary
+@Qualifier("Wicket")
 @Log4j2
 public class BookmarkUiServiceWicket implements BookmarkUiService {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java
index 9bd6e93..e1d5fef 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java
@@ -31,6 +31,7 @@ import org.apache.wicket.Page;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -49,7 +50,7 @@ import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
 @Service
 @Named("isisWicketViewer.DeepLinkServiceWicket")
 @Order(OrderPrecedence.HIGH)
-@Primary
+@Qualifier("Wicket")
 @Log4j2
 public class DeepLinkServiceWicket implements DeepLinkService {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
index 82f703d..8984da7 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
@@ -26,6 +26,7 @@ import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Session;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -39,7 +40,7 @@ import lombok.extern.log4j.Log4j2;
 @Service
 @Named("isisWicketViewer.HintStoreUsingWicketSession")
 @Order(OrderPrecedence.HIGH)
-@Primary
+@Qualifier("Wicket")
 @Log4j2
 public class HintStoreUsingWicketSession implements HintStore {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java
index 54f393d..f98a782 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.request.resource.PackageResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -55,8 +56,9 @@ import javax.inject.Named;
  */
 @Service
 @Named("isisWicketViewer.ImageResourceCacheClassPath")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("ClassPath")
 @Log4j2
 public class ImageResourceCacheClassPath implements ImageResourceCache {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
index 86813f02..5fc9a23 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.Application;
 import org.apache.wicket.Session;
 import org.apache.wicket.request.cycle.RequestCycle;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -40,8 +41,8 @@ import org.apache.isis.applib.services.i18n.LocaleProvider;
  */
 @Service
 @Named("isisWicketViewer.LocaleProviderWicket")
-@Order(OrderPrecedence.DEFAULT)
-@Primary
+@Order(OrderPrecedence.MIDPOINT)
+@Qualifier("Wicket")
 @Log4j2
 public class LocaleProviderWicket implements LocaleProvider {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
index 132c4cd..2bd1d87 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
@@ -33,6 +33,7 @@ import javax.inject.Named;
 import javax.servlet.ServletContext;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -50,8 +51,8 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisWicketViewer.TranslationsResolverWicket")
-@Order(OrderPrecedence.DEFAULT)
-@Primary
+@Order(OrderPrecedence.MIDPOINT)
+@Qualifier("Wicket")
 @Log4j2
 public class TranslationsResolverWicket implements TranslationsResolver {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/WicketViewerSettingsDefault.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/WicketViewerSettingsDefault.java
index 0295da3..caabe8c 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/WicketViewerSettingsDefault.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/WicketViewerSettingsDefault.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -36,8 +37,9 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisWicketViewer.WicketViewerSettingsDefault")
-@Order(OrderPrecedence.DEFAULT)
+@Order(OrderPrecedence.MIDPOINT)
 @Primary
+@Qualifier("Default")
 @Log4j2
 public class WicketViewerSettingsDefault implements WicketViewerSettings {
 
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java
index ff840c2..9d10693 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java
@@ -26,6 +26,7 @@ import javax.inject.Named;
 import javax.inject.Singleton;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -53,11 +54,10 @@ import lombok.val;
  */
 @Service
 @Named("isisWicketViewer.ObjectMementoServiceWicket")
-@Order(OrderPrecedence.DEFAULT)
-@Primary
+@Order(OrderPrecedence.MIDPOINT)
+@Qualifier("Wicket")
 @Singleton
-public class ObjectMementoServiceWicket
-implements ObjectMementoService {
+public class ObjectMementoServiceWicket implements ObjectMementoService {
 
     @Inject @Getter private SpecificationLoader specificationLoader;
     @Inject private ObjectManager objectManager;
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/webmodule/WebModuleWicket.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/webmodule/WebModuleWicket.java
index b5cb7cb..468ec6a 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/webmodule/WebModuleWicket.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/webmodule/WebModuleWicket.java
@@ -30,6 +30,7 @@ import javax.servlet.ServletException;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.wicket.protocol.http.WicketFilter;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -52,8 +53,8 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
  */
 @Service
 @Named("isisWicketViewer.WebModuleWicket")
-@Order(OrderPrecedence.DEFAULT - 80)
-@Primary
+@Order(OrderPrecedence.MIDPOINT - 80)
+@Qualifier("Wicket")
 @Log4j2
 public final class WebModuleWicket implements WebModule  {
 
diff --git a/core/webapp/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java b/core/webapp/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java
index 1088e18..e3b7efe 100644
--- a/core/webapp/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java
+++ b/core/webapp/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java
@@ -27,8 +27,9 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.webapp.diagnostics.IsisLogOnExceptionFilter;
-import org.springframework.core.Ordered;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -47,7 +48,8 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
  */
 @Service
 @Named("isisWebapp.WebModuleLogOnExceptionLogger")
-@Order(Ordered.LOWEST_PRECEDENCE) // TODO: should this not be the highest precedence, ie first in stack?
+@Order(OrderPrecedence.LOWEST) // TODO: should this not be the highest precedence, ie first in stack?
+@Qualifier("LogOnExceptionLogger")
 @Log4j2
 public final class WebModuleLogOnExceptionLogger implements WebModule  {
 
diff --git a/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/WebModuleTemplateResources.java b/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/WebModuleTemplateResources.java
index 316fce4..48b7617 100644
--- a/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/WebModuleTemplateResources.java
+++ b/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/WebModuleTemplateResources.java
@@ -27,6 +27,7 @@ import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -40,7 +41,8 @@ import org.apache.isis.webapp.modules.WebModuleContext;
  */
 @Service
 @Named("isisWebapp.WebModuleTemplateResources")
-@Order(OrderPrecedence.DEFAULT - 100)
+@Order(OrderPrecedence.MIDPOINT - 100)
+@Qualifier("TemplateResources")
 @Log4j2
 public final class WebModuleTemplateResources implements WebModule  {
 
diff --git a/examples/smoketests/src/main/java/org/apache/isis/testdomain/rest/RestEndpointService.java b/examples/smoketests/src/main/java/org/apache/isis/testdomain/rest/RestEndpointService.java
index 5dfe449..85e3769 100644
--- a/examples/smoketests/src/main/java/org/apache/isis/testdomain/rest/RestEndpointService.java
+++ b/examples/smoketests/src/main/java/org/apache/isis/testdomain/rest/RestEndpointService.java
@@ -36,7 +36,8 @@ import org.apache.isis.testdomain.ldap.LdapConstants;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Service @Log4j2
+@Service
+@Log4j2
 public class RestEndpointService {
     
     @Inject private Environment environment;
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-IsisBoot.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-IsisBoot.list
index 855dc9d..6f2f0d3 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-IsisBoot.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-IsisBoot.list
@@ -65,7 +65,7 @@ org.apache.isis.runtime.services.menubars.MenuBarsLoaderServiceDefault
 org.apache.isis.runtime.services.menubars.bootstrap3.MenuBarsServiceBS3
 org.apache.isis.runtime.services.message.MessageServiceDefault
 org.apache.isis.runtime.services.persist.ObjectAdapterServiceDefault
-org.apache.isis.runtime.services.publish.PublishingServiceInternalDefault
+PublisherDispatchServiceDefault
 org.apache.isis.runtime.services.routing.RoutingServiceDefault
 org.apache.isis.runtime.services.sessmgmt.SessionManagementServiceDefault
 org.apache.isis.runtime.services.sse.EventStreamServiceDefault
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
index e4a0e0b..dd5ffdc 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
@@ -19,7 +19,7 @@ org.apache.isis.runtime.services.confmenu.ConfigurationViewServiceDefault
 org.apache.isis.runtime.services.email.EmailServiceDefault
 org.apache.isis.runtime.services.i18n.po.TranslationServicePoMenu
 org.apache.isis.runtime.services.ixn.InteractionDtoServiceInternalDefault
-org.apache.isis.runtime.services.publish.PublishingServiceInternalDefault
+PublisherDispatchServiceDefault
 org.apache.isis.runtime.services.sudo.SudoServiceDefault
 org.apache.isis.runtime.services.userprof.UserProfileServiceDefault
 org.apache.isis.runtime.services.userreg.EmailNotificationServiceDefault
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-requestscoped.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-requestscoped.list
index 13a4d7e..5dfef67 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-requestscoped.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-requestscoped.list
@@ -4,5 +4,5 @@ org.apache.isis.applib.services.queryresultscache.QueryResultsCacheInternal
 org.apache.isis.applib.services.scratchpad.Scratchpad
 org.apache.isis.runtime.services.changes.ChangedObjectsServiceInternal
 org.apache.isis.runtime.services.metrics.MetricsServiceDefault
-org.apache.isis.runtime.services.publish.PublishingServiceInternalDefault
+PublisherDispatchServiceDefault
 org.apache.isis.objectstore.jdo.datanucleus.service.support.TimestampService
\ No newline at end of file
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
index 5b4041f..1102cbb 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
@@ -66,7 +66,7 @@ org.apache.isis.runtime.services.menubars.MenuBarsLoaderServiceDefault
 org.apache.isis.runtime.services.menubars.bootstrap3.MenuBarsServiceBS3
 org.apache.isis.runtime.services.message.MessageServiceDefault
 org.apache.isis.runtime.services.persist.ObjectAdapterServiceDefault
-org.apache.isis.runtime.services.publish.PublishingServiceInternalDefault
+PublisherDispatchServiceDefault
 org.apache.isis.runtime.services.routing.RoutingServiceDefault
 org.apache.isis.runtime.services.sessmgmt.SessionManagementServiceDefault
 org.apache.isis.runtime.services.sudo.SudoServiceDefault
diff --git a/extensions/core/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java b/extensions/core/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java
index 532014e..a04f60f 100644
--- a/extensions/core/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java
+++ b/extensions/core/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java
@@ -25,8 +25,11 @@ import java.util.*;
 
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 /**
@@ -34,6 +37,8 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @Named("isisExtSpring.SpringBeansService")
+@Order(OrderPrecedence.MIDPOINT)
+@Qualifier("Default")
 @Log4j2
 public class SpringBeansService {
 
diff --git a/extensions/lib/base/impl/src/main/java/org/apache/isis/extensions/base/dom/services/calendar/CalendarService.java b/extensions/lib/base/impl/src/main/java/org/apache/isis/extensions/base/dom/services/calendar/CalendarService.java
index 79f3ad4..74c1a0e 100644
--- a/extensions/lib/base/impl/src/main/java/org/apache/isis/extensions/base/dom/services/calendar/CalendarService.java
+++ b/extensions/lib/base/impl/src/main/java/org/apache/isis/extensions/base/dom/services/calendar/CalendarService.java
@@ -7,13 +7,18 @@ import java.time.LocalDate;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisExtBase.calendarService")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
 @Log4j2
 public class CalendarService {
 
diff --git a/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/ExcelService.java b/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/ExcelService.java
index 237e20c..e94fc53 100644
--- a/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/ExcelService.java
+++ b/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/ExcelService.java
@@ -11,6 +11,7 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 
@@ -23,10 +24,16 @@ import org.apache.isis.applib.value.Blob;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.excel.dom.util.ExcelServiceImpl;
 import org.apache.isis.extensions.excel.dom.util.Mode;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisExtExcel.ExcelService")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
 @Log4j2
 public class ExcelService {
 
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/apache/isis/extensions/fakedata/dom/services/FakeDataService.java b/extensions/lib/fakedata/impl/src/main/java/org/apache/isis/extensions/fakedata/dom/services/FakeDataService.java
index 37fc981..b38b5ab 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/apache/isis/extensions/fakedata/dom/services/FakeDataService.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/apache/isis/extensions/fakedata/dom/services/FakeDataService.java
@@ -12,14 +12,19 @@ import com.github.javafaker.Faker;
 import com.github.javafaker.service.FakeValuesService;
 import com.github.javafaker.service.RandomService;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.repository.RepositoryService;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 @Service
 @Named("isisExtFakeData.FakeDataService")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
 @Log4j2
 public class FakeDataService {
 
diff --git a/extensions/persistence/h2console/src/main/java/org/apache/isis/extensions/h2console/dom/webmodule/WebModuleH2Console.java b/extensions/persistence/h2console/src/main/java/org/apache/isis/extensions/h2console/dom/webmodule/WebModuleH2Console.java
index 9d0132a..aa4cb89 100644
--- a/extensions/persistence/h2console/src/main/java/org/apache/isis/extensions/h2console/dom/webmodule/WebModuleH2Console.java
+++ b/extensions/persistence/h2console/src/main/java/org/apache/isis/extensions/h2console/dom/webmodule/WebModuleH2Console.java
@@ -24,6 +24,8 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -41,7 +43,8 @@ import lombok.val;
 
 @Service
 @Named("isisExtH2Console.WebModuleH2Console")
-@Order(0)
+@Order(OrderPrecedence.MIDPOINT)
+@Qualifier("H2Console")
 @Log4j2
 public class WebModuleH2Console implements WebModule  {
 
diff --git a/extensions/security/secman/encryption-jbcrypt/src/main/java/org/apache/isis/extensions/secman/encryption/jbcrypt/services/PasswordEncryptionServiceUsingJBcrypt.java b/extensions/security/secman/encryption-jbcrypt/src/main/java/org/apache/isis/extensions/secman/encryption/jbcrypt/services/PasswordEncryptionServiceUsingJBcrypt.java
index 754afc2..80e61dd 100644
--- a/extensions/security/secman/encryption-jbcrypt/src/main/java/org/apache/isis/extensions/secman/encryption/jbcrypt/services/PasswordEncryptionServiceUsingJBcrypt.java
+++ b/extensions/security/secman/encryption-jbcrypt/src/main/java/org/apache/isis/extensions/secman/encryption/jbcrypt/services/PasswordEncryptionServiceUsingJBcrypt.java
@@ -22,13 +22,18 @@ import lombok.extern.log4j.Log4j2;
 
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.mindrot.jbcrypt.BCrypt;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.extensions.secman.api.encryption.PasswordEncryptionService;
 
 @Service
 @Named("isisExtSecman.PasswordEncryptionServiceUsingJBcrypt")
+@Order(OrderPrecedence.MIDPOINT)
+@Qualifier("JBCrypt")
 @Log4j2
 public class PasswordEncryptionServiceUsingJBcrypt implements PasswordEncryptionService {
 
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionFactory.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionFactory.java
index cef4df4..dee0308 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionFactory.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionFactory.java
@@ -24,7 +24,9 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.springframework.core.Ordered;
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -61,7 +63,9 @@ public interface ApplicationPermissionFactory {
 
     @Service
     @Named("isisExtSecman.ApplicationPermissionFactory.Default")
-    @Order(Ordered.LOWEST_PRECEDENCE)
+    @Order(OrderPrecedence.MIDPOINT)
+    @Primary
+    @Qualifier("Default")
     @Log4j2
     public static class Default implements ApplicationPermissionFactory {
 
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleFactory.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleFactory.java
index 230d4e4..21674fe 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleFactory.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleFactory.java
@@ -23,6 +23,9 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -60,7 +63,9 @@ public interface ApplicationRoleFactory {
 
     @Service
     @Named("isisExtSecman.ApplicationRoleFactory.Default")
-    @Order(Ordered.LOWEST_PRECEDENCE)
+    @Order(OrderPrecedence.MIDPOINT)
+    @Primary
+    @Qualifier("Default")
     @Log4j2
     public static class Default implements ApplicationRoleFactory {
 
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyFactory.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyFactory.java
index 9e7759c..1043349 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyFactory.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyFactory.java
@@ -23,6 +23,9 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -60,7 +63,9 @@ public interface ApplicationTenancyFactory {
 
     @Service
     @Named("isisExtSecman.ApplicationTenancyFactory.Default")
-    @Order(Ordered.LOWEST_PRECEDENCE)
+    @Order(OrderPrecedence.MIDPOINT)
+    @Primary
+    @Qualifier("Default")
     @Log4j2
     public static class Default implements ApplicationTenancyFactory {
 
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserFactory.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserFactory.java
index fcb3121..591bb26 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserFactory.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserFactory.java
@@ -23,6 +23,9 @@ import lombok.extern.log4j.Log4j2;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -60,7 +63,9 @@ public interface ApplicationUserFactory {
 
     @Service
     @Named("isisExtSecman.ApplicationUserFactory.Default")
-    @Order(Ordered.LOWEST_PRECEDENCE)
+    @Order(OrderPrecedence.MIDPOINT)
+    @Primary
+    @Qualifier("Default")
     @Log4j2
     public static class Default implements ApplicationUserFactory {
 
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java
index a542e92..86d9522 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java
@@ -21,7 +21,11 @@ package org.apache.isis.extensions.secman.jdo.seed;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.event.EventListener;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -33,6 +37,8 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisExtSecman.SeedSecurityModuleService")
+@Order(OrderPrecedence.MIDPOINT)
+@Qualifier("Default")
 @Log4j2
 public class SeedSecurityModuleService {
 
diff --git a/extensions/security/secman/realm-shiro/src/main/java/org/apache/isis/extensions/secman/shiro/services/SecurityRealmServiceUsingShiro.java b/extensions/security/secman/realm-shiro/src/main/java/org/apache/isis/extensions/secman/shiro/services/SecurityRealmServiceUsingShiro.java
index a7605d2..029350c 100644
--- a/extensions/security/secman/realm-shiro/src/main/java/org/apache/isis/extensions/secman/shiro/services/SecurityRealmServiceUsingShiro.java
+++ b/extensions/security/secman/realm-shiro/src/main/java/org/apache/isis/extensions/secman/shiro/services/SecurityRealmServiceUsingShiro.java
@@ -21,7 +21,10 @@ package org.apache.isis.extensions.secman.shiro.services;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.extensions.secman.shiro.util.ShiroUtils;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
@@ -33,6 +36,8 @@ import lombok.val;
 
 @Service
 @Named("isisExtSecman.SecurityRealmServiceUsingShiro")
+@Order(OrderPrecedence.MIDPOINT)
+@Qualifier("Shiro")
 @Log4j2
 public class SecurityRealmServiceUsingShiro implements SecurityRealmService {
     
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecycleService.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecycleService.java
index 2bf8292..52a6bc0 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecycleService.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecycleService.java
@@ -25,16 +25,22 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.clock.Clock;
-import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.extensions.fixtures.legacy.FixtureClock;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 
 @Service
 @Named("isisExtFixtures.FixturesLifecycleService")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
 @Log4j2
 public class FixturesLifecycleService {
 
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisModuleExtFixtures.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisModuleExtFixtures.java
index ab0a011..eb9bd5f 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisModuleExtFixtures.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisModuleExtFixtures.java
@@ -20,7 +20,7 @@ package org.apache.isis.extensions.fixtures;
 
 import org.apache.isis.extensions.fixtures.fixturescripts.ExecutionParametersService;
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
-import org.apache.isis.extensions.fixtures.legacy.queryresultscache.QueryResultsCacheControlInternal;
+import org.apache.isis.extensions.fixtures.legacy.queryresultscache.QueryResultsCacheControlDefault;
 import org.apache.isis.extensions.fixtures.modules.ModuleWithFixturesService;
 import org.apache.isis.extensions.spring.IsisModuleExtSpring;
 import org.springframework.context.annotation.Configuration;
@@ -35,7 +35,7 @@ import org.springframework.context.annotation.Import;
         FixturesLifecycleService.class,
         ExecutionParametersService.class,
         ModuleWithFixturesService.class,
-        QueryResultsCacheControlInternal.class,
+        QueryResultsCacheControlDefault.class,
 
         // @DomainService's
         FixtureScripts.class,
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java
index 05f92f3..49255cb 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java
@@ -22,6 +22,10 @@ import lombok.extern.log4j.Log4j2;
 
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 
@@ -37,6 +41,9 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @Named("isisExtFixtures.ExecutionParametersService")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
 @Log4j2
 public class ExecutionParametersService {
 
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlDefault.java
similarity index 81%
rename from extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java
rename to extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlDefault.java
index b2dd303..4009ef9 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlDefault.java
@@ -22,7 +22,11 @@ import lombok.extern.log4j.Log4j2;
 
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.queryresultscache.QueryResultCacheControl;
@@ -35,9 +39,12 @@ import org.apache.isis.extensions.fixtures.events.FixturesInstallingEvent;
  * In separate class because {@link QueryResultsCache} itself is request-scoped
  */
 @Service
-@Named("isisExtFixtures.QueryResultsCacheControlInternal")
+@Named("isisExtFixtures.QueryResultsCacheControlDefault")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
 @Log4j2
-public class QueryResultsCacheControlInternal implements QueryResultCacheControl {
+public class QueryResultsCacheControlDefault implements QueryResultCacheControl {
 
     @EventListener(FixturesInstallingEvent.class)
     public void onFixturesInstallingEvent(FixturesInstallingEvent ev) {
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixturesService.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixturesService.java
index 5a674c0..0c3f9d9 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixturesService.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/modules/ModuleWithFixturesService.java
@@ -26,12 +26,16 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Primary;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.extensions.spring.service.BeanDescriptor;
@@ -47,6 +51,9 @@ import javax.inject.Named;
 
 @Service
 @Named("isisExtFixtures.ModuleService")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
 @Log4j2
 public class ModuleWithFixturesService {
 
diff --git a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/services/SseServiceDefault.java b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/services/SseServiceDefault.java
index 201221f..42a8da0 100644
--- a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/services/SseServiceDefault.java
+++ b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/services/SseServiceDefault.java
@@ -34,6 +34,10 @@ import java.util.function.Predicate;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.xactn.TransactionService;
@@ -41,7 +45,6 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.sse.api.SseChannel;
 import org.apache.isis.extensions.sse.api.SseService;
 import org.apache.isis.extensions.sse.api.SseSource;
-import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.runtime.system.transaction.IsisTransactionAspectSupport;
 
@@ -61,6 +64,9 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service
 @Named("isisExtSse.SseServiceDefault")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
 @Log4j2
 public class SseServiceDefault implements SseService {
 
diff --git a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/WebModuleServerSentEvents.java b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/WebModuleServerSentEvents.java
index 7e5d26b..2de8068 100644
--- a/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/WebModuleServerSentEvents.java
+++ b/extensions/vw/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/WebModuleServerSentEvents.java
@@ -23,6 +23,8 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
@@ -39,7 +41,8 @@ import lombok.val;
  */
 @Service
 @Named("isisExtSse.WebModuleServerSentEvents")
-@Order(-99)
+@Qualifier("ServerSentEvents")
+@Order(OrderPrecedence.MIDPOINT-99)
 @Log4j2
 public final class WebModuleServerSentEvents implements WebModule  {
 
diff --git a/legacy/core/applib/src/main/java/org/apache/isis/legacy/applib/DomainObjectContainer.java b/legacy/core/applib/src/main/java/org/apache/isis/legacy/applib/DomainObjectContainer.java
index 3818c81..f65103f 100644
--- a/legacy/core/applib/src/main/java/org/apache/isis/legacy/applib/DomainObjectContainer.java
+++ b/legacy/core/applib/src/main/java/org/apache/isis/legacy/applib/DomainObjectContainer.java
@@ -25,8 +25,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.isis.applib.ViewModel;
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.legacy.applib.filter.Filter;
 import org.apache.isis.applib.query.Query;
@@ -44,12 +43,18 @@ import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.config.IsisConfiguration;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import com.google.common.base.Predicate;
 
 @Service
 @Named("isisLegacyApplib.domainObjectContainer")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
 @Deprecated
 public class DomainObjectContainer {