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

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

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

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

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

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

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