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:34 UTC

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

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 {