You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/03/20 20:04:20 UTC

[isis] branch 2033-IoC_spring updated: ISIS-2033: major: replacing EventBusService by CDI Events

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

ahuber pushed a commit to branch 2033-IoC_spring
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/2033-IoC_spring by this push:
     new ff407a8  ISIS-2033: major: replacing EventBusService by CDI Events
ff407a8 is described below

commit ff407a829fe7e12d0f1c294156aacb7af67c4ee8
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 20 21:04:10 2019 +0100

    ISIS-2033: major: replacing EventBusService by CDI Events
    
    + using much simple services for framework internal events
    + fixing some provisioning failures
    + working towards having spring boot taking over the bootstrapping
    
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
 .../org/apache/isis/applib/AbstractSubscriber.java |  72 -----------
 .../fixturescripts/ExecutionParametersService.java |  10 +-
 .../isis/applib/services/clock/ClockService.java   |  22 +---
 .../applib/services/command/CommandContext.java    |  20 ---
 .../exceprecog/ExceptionRecognizerAbstract.java    |   9 +-
 .../fixturespec/FixtureScriptsDefault.java         |  17 ++-
 .../applib/services/i18n/TranslationService.java   |   4 +-
 .../isis/applib/services/iactn/Interaction.java    |   1 -
 .../applib/services/metrics/MetricsService.java    |  25 +++-
 .../QueryResultsCacheControlInternal.java          |  27 ++--
 .../applib/services/registry/ServiceRegistry.java  |  31 +++--
 .../org/apache/isis/commons/internal/cdi/_CDI.java | 142 +++++----------------
 .../commons/internal/exceptions/_Exceptions.java   |  10 ++
 .../apache/isis/core/commons/collections/Bin.java  |  49 ++++++-
 .../isis/core/commons/collections/Bin_Empty.java   |   7 +
 .../core/commons/collections/Bin_Multiple.java     |   7 +
 .../core/commons/collections/Bin_Singleton.java    |   7 +
 .../org/apache/isis/config/AppConfigLocator.java   |  22 +---
 .../isis/config/builder/ModulePackageHelper.java   |   8 +-
 ...TypeRegistry.java => IsisBeanTypeRegistry.java} |  43 +++++--
 .../apache/isis/config/registry/TypeMetaData.java  |   9 +-
 .../isis/core/metamodel/MetaModelContexts.java     |  25 ++--
 .../core/metamodel/facetapi/MetaModelRefiner.java  |   7 +-
 .../core/metamodel/facets/DomainEventHelper.java   |  33 ++---
 .../invocation/ActionDomainEventFacetAbstract.java |   2 +-
 ...ctionInvocationFacetForDomainEventAbstract.java |   2 +-
 ...ectionAddToFacetForDomainEventFromAbstract.java |   3 +-
 .../modify/CollectionDomainEventFacetAbstract.java |   2 +-
 ...nRemoveFromFacetForDomainEventFromAbstract.java |   3 +-
 ...assFacetOnActionFromConfiguredRegexFactory.java |   2 +-
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |  31 +++--
 ...wModelLayoutAnnotationUsingCssClassUiEvent.java |  19 ++-
 .../DomainObjectLayoutFacetFactory.java            |  21 +--
 ...mainObjectLayoutAnnotationUsingIconUiEvent.java |  20 +--
 ...aViewModelLayoutAnnotationUsingIconUiEvent.java |  22 ++--
 ...inObjectLayoutAnnotationUsingLayoutUiEvent.java |  27 ++--
 ...iewModelLayoutAnnotationUsingLayoutUiEvent.java |  27 ++--
 ...ainObjectLayoutAnnotationUsingTitleUiEvent.java |  24 ++--
 ...ViewModelLayoutAnnotationUsingTitleUiEvent.java |  27 ++--
 .../modify/PropertyDomainEventFacetAbstract.java   |   2 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java |   2 +-
 .../metamodel/services/ServiceInjectorDefault.java |  23 ++--
 .../services/events/MetamodelEventService.java     |  63 +++++++++
 .../metamodel/MetaModelServiceDefault.java         |   2 +-
 .../services/registry/ServiceRegistryDefault.java  |   7 +-
 .../metamodel/specloader/SpecificationLoader.java  |   4 +-
 .../specimpl/ObjectSpecificationAbstract.java      |   6 +-
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |  21 ++-
 ...nEventHelperTest_newActionInteractionEvent.java |   9 +-
 ...HelperTest_newCollectionDomainEvent_forAdd.java |   6 +-
 ...perTest_newCollectionDomainEvent_forRemove.java |   6 +-
 ...HelperTest_newPropertyDomainEvent_forClear.java |  10 +-
 ...elperTest_newPropertyDomainEvent_forModify.java |  10 +-
 .../apache/isis/core/metamodel/facets/Utils.java   |   4 +
 .../SpecificationLoaderTestAbstract.java           |   2 +-
 .../isis/core/plugins/ioc/weld/WeldFactory.java    |   4 +-
 .../SeamConversationContextSupport.java            |   2 +-
 .../ClassDiscoveryServiceDefault.java              |   4 +-
 .../applib/services/eventbus/EventBusService.java  |   0
 .../applib/services/eventbus/package-info.java     |   0
 .../isis/core/runtime/headless/IsisSystem.java     |   2 +-
 .../core/webapp/IsisWebAppContextListener.java     |  44 ++++---
 .../confmenu}/ConfigurationViewServiceDefault.java |   2 +-
 .../services/i18n/po/TranslationServicePo.java     |   5 +-
 .../publish/PublishingServiceInternalDefault.java  |   4 -
 .../fixtures/FixturesInstallerDelegate.java        |  33 +++--
 .../core/runtime/system/context/IsisContext.java   |  14 +-
 .../context/managers/ManagedObjectResolver.java    |   7 +-
 .../context/managers/UniversalContextManager.java  |   3 +-
 .../context/managers/UniversalObjectManager.java   |   8 +-
 .../managers/builtin/MixinContextManager.java      |   6 +-
 .../managers/builtin/ValueContextManager.java      |   7 +-
 .../managers/builtin/ViewModelContextManager.java  |   5 +-
 .../context/managers/cdi/CDIContextManager.java    |  12 +-
 .../context/session/RuntimeEventService.java       |  41 ++++--
 .../system/session/IsisSessionFactoryDefault.java  |   8 +-
 .../system/transaction/IsisTransaction.java        |   7 +-
 .../wicket/viewer/IsisWicketApplication.java       |  12 +-
 .../integration/wicket/WebRequestCycleForIsis.java |   7 +-
 .../viewer/wicket/model/models/ActionModel.java    |   2 +-
 .../CollectionContentsAsAjaxTablePanel.java        |  18 ++-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   2 +-
 example/application/springapp/pom.xml              |   6 +
 .../incubator/BeanScanInterceptorForSpring.java    |   9 +-
 .../src/main/java/isis/incubator/IsisBoot.java     |  97 ++++++++++++--
 .../boot/web/SpringBootTomcatApplication.java      |  17 +--
 .../springapp/src/main/webapp/WEB-INF/shiro.ini    |  58 +++++++++
 88 files changed, 770 insertions(+), 694 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/AbstractSubscriber.java b/core/applib/src/main/java/org/apache/isis/applib/AbstractSubscriber.java
deleted file mode 100644
index f16c3de..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/AbstractSubscriber.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  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;
-
-import javax.annotation.PostConstruct;
-
-import org.apache.isis.applib.annotation.DomainServiceLayout;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.factory.FactoryService;
-import org.apache.isis.applib.services.message.MessageService;
-import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.applib.services.title.TitleService;
-import org.apache.isis.applib.services.user.UserService;
-import org.apache.isis.applib.services.xactn.TransactionService;
-
-/**
- * Convenience class for services that act as subscribers.
- */
-@DomainServiceLayout(
-        menuOrder = "1"
-        )
-public abstract class AbstractSubscriber {
-
-    @PostConstruct
-    public void postConstruct() {
-        eventBusService.register(this);
-    }
-
-    @Programmatic
-    public void preDestroy() {
-        eventBusService.unregister(this);
-    }
-
-    @javax.inject.Inject
-    protected MessageService messageService;
-
-    @javax.inject.Inject
-    protected TitleService titleService;
-
-    @javax.inject.Inject
-    protected RepositoryService repositoryService;
-
-    @javax.inject.Inject
-    protected FactoryService factoryService;
-
-    @javax.inject.Inject
-    protected UserService userService;
-
-    @javax.inject.Inject
-    protected TransactionService transactionService;
-
-    @javax.inject.Inject
-    protected EventBusService eventBusService;
-
-}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/ExecutionParametersService.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/ExecutionParametersService.java
index e119a6e..89dd947 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/ExecutionParametersService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/ExecutionParametersService.java
@@ -18,9 +18,7 @@
  */
 package org.apache.isis.applib.fixturescripts;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Programmatic;
+import javax.inject.Singleton;
 
 
 /**
@@ -34,13 +32,9 @@ import org.apache.isis.applib.annotation.Programmatic;
  * </p>
  * it
  */
-@DomainService(
-        nature = NatureOfService.DOMAIN,
-        menuOrder = "" + Integer.MAX_VALUE
-        )
+@Singleton
 public class ExecutionParametersService {
 
-    @Programmatic
     public ExecutionParameters newExecutionParameters(final String parameters) {
         return new ExecutionParameters(parameters);
     }
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 c1ef0bc..8c3193f 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
@@ -18,51 +18,37 @@ package org.apache.isis.applib.services.clock;
 
 import java.sql.Timestamp;
 
+import javax.inject.Singleton;
+
+import org.apache.isis.applib.clock.Clock;
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
 
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.clock.Clock;
-
 /**
  * This service allows an application to be decoupled from the system time.  The most common use case is in support of
  * testing scenarios, to &quot;mock the clock&quot;.  Use of this service also opens up the use of centralized
  * co-ordinated time management through a centralized time service.
- *
- * <p>
- * This service has only one implementation and so is automatically registered. and available for use; no further
- * configuration is required.
  */
-@DomainService(
-        nature = NatureOfService.DOMAIN,
-        menuOrder = "" + Integer.MAX_VALUE
-        )
+@Singleton
 public class ClockService {
 
-    @Programmatic
     public LocalDate now() {
         return Clock.getTimeAsLocalDate();
     }
 
-    @Programmatic
     public LocalDateTime nowAsLocalDateTime() {
         return Clock.getTimeAsLocalDateTime();
     }
 
-    @Programmatic
     public DateTime nowAsDateTime() {
         return Clock.getTimeAsDateTime();
     }
 
-    @Programmatic
     public Timestamp nowAsJavaSqlTimestamp() {
         return Clock.getTimeAsJavaSqlTimestamp();
     }
 
-    @Programmatic
     public long nowAsMillis() {
         return Clock.getTime();
     }
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 1ae1719..0b26c09 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
@@ -18,33 +18,14 @@ package org.apache.isis.applib.services.command;
 
 import javax.enterprise.context.RequestScoped;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Programmatic;
-
 /**
  * This service (API and implementation) provides access to context information about any {@link Command}.
- *
- * This implementation has no UI and there is only one implementation (this class) in applib, so it is annotated with
- * {@link org.apache.isis.applib.annotation.DomainService}.  This means that it is automatically registered and
- * available for use; no further configuration is required.
  */
-@DomainService(
-        nature = NatureOfService.DOMAIN,
-        menuOrder = "" + Integer.MAX_VALUE
-        )
 @RequestScoped
 public class CommandContext {
 
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(CommandContext.class);
-
     private Command command;
 
-    @Programmatic
     public Command getCommand() {
         return command;
     }
@@ -52,7 +33,6 @@ public class CommandContext {
     /**
      * <b>NOT API</b>: intended to be called only by the framework.
      */
-    @Programmatic
     public void setCommand(final Command command) {
         this.command = command;
     }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java
index 1e2e3b4..3a45519 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java
@@ -24,14 +24,14 @@ import java.util.function.Predicate;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Abstract implementation of {@link ExceptionRecognizer} that looks
@@ -155,7 +155,6 @@ public abstract class ExceptionRecognizerAbstract implements ExceptionRecognizer
         return Recognition.of(category, recognize(ex));
     }
 
-    @javax.inject.Inject
-    protected TranslationService translationService;
+    @Inject protected TranslationService translationService;
     
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/fixturespec/FixtureScriptsDefault.java b/core/applib/src/main/java/org/apache/isis/applib/services/fixturespec/FixtureScriptsDefault.java
index 7665d3d..55cd6b3 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/fixturespec/FixtureScriptsDefault.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/fixturespec/FixtureScriptsDefault.java
@@ -21,9 +21,11 @@ package org.apache.isis.applib.services.fixturespec;
 import java.util.List;
 
 import javax.annotation.PostConstruct;
+import javax.enterprise.event.Event;
 import javax.enterprise.inject.Any;
 import javax.enterprise.inject.Instance;
 import javax.inject.Inject;
+import javax.inject.Singleton;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -41,7 +43,6 @@ import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.applib.fixturescripts.FixtureScripts;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstalledEvent;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstallingEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
 
 /**
  * Default instance of {@link FixtureScripts}, instantiated automatically by the framework if no custom user-defined instance was
@@ -73,6 +74,7 @@ import org.apache.isis.applib.services.eventbus.EventBusService;
         menuBar = DomainServiceLayout.MenuBar.SECONDARY,
         menuOrder = "500.10"
         )
+@Singleton
 public class FixtureScriptsDefault extends FixtureScripts {
 
     // -- constructor, init
@@ -82,6 +84,9 @@ public class FixtureScriptsDefault extends FixtureScripts {
      */
     public static final String PACKAGE_PREFIX = FixtureScriptsDefault.class.getPackage().getName();
 
+    @Inject private Event<FixturesInstallingEvent> fixturesInstallingEvent;
+    @Inject private Event<FixturesInstalledEvent> fixturesInstalledEvent;
+    
     public FixtureScriptsDefault() {
         super(FixtureScriptsSpecification.builder(PACKAGE_PREFIX)
                 .build());
@@ -97,8 +102,7 @@ public class FixtureScriptsDefault extends FixtureScripts {
         setSpecification(fixtureScriptsSpecificationProviders.get().getSpecification());
     }
 
-
-
+    
     // -- runFixtureScript (using choices as the drop-down policy)
     @Action(
             restrictTo = RestrictTo.PROTOTYPING
@@ -118,10 +122,10 @@ public class FixtureScriptsDefault extends FixtureScripts {
             @Parameter(optionality = Optionality.OPTIONAL)
             final String parameters) {
         try {
-            eventBusService.post(new FixturesInstallingEvent(this));
+        	fixturesInstallingEvent.fire(new FixturesInstallingEvent(this));
             return super.runFixtureScript(fixtureScript, parameters);
         } finally {
-            eventBusService.post(new FixturesInstalledEvent(this));
+        	fixturesInstalledEvent.fire(new FixturesInstalledEvent(this));
         }
     }
 
@@ -239,7 +243,6 @@ public class FixtureScriptsDefault extends FixtureScripts {
     // -- injected services
     
     @Inject @Any Instance<FixtureScriptsSpecificationProvider> fixtureScriptsSpecificationProviders;
-    @Inject EventBusService eventBusService;
-
+ 
 
 }
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java
index 97fdc83..d4d163d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java
@@ -58,8 +58,8 @@ public interface TranslationService {
                 ("disable".equalsIgnoreCase(configValue) ||
                         "disabled".equalsIgnoreCase(configValue))),
         READ(configValue->configValue != null &&
-        ("read".equalsIgnoreCase(configValue) ||
-                "reader".equalsIgnoreCase(configValue))),
+        		("read".equalsIgnoreCase(configValue) ||
+        				"reader".equalsIgnoreCase(configValue))),
         // default
         WRITE(configValue->!READ.matches(configValue) && !DISABLED.matches(configValue));
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
index 176c446..ba8ffe8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
@@ -38,7 +38,6 @@ import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.metrics.MetricsService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.xactn.Transaction;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java b/core/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java
index 7a3ac57..ac099a8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java
@@ -18,7 +18,10 @@
  */
 package org.apache.isis.applib.services.metrics;
 
-import org.apache.isis.applib.annotation.Programmatic;
+import javax.annotation.Priority;
+import javax.enterprise.inject.Alternative;
+import javax.inject.Singleton;
+
 import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.schema.ixn.v1.MemberExecutionDto;
 
@@ -35,7 +38,6 @@ public interface MetricsService {
      *     Is captured within {@link MemberExecutionDto#getMetrics()} (accessible from {@link InteractionContext#getInteraction()}).
      * </p>
      */
-    @Programmatic
     int numberObjectsLoaded();
 
     /**
@@ -50,10 +52,27 @@ public interface MetricsService {
      *     Is captured within {@link MemberExecutionDto#getMetrics()} (accessible from {@link InteractionContext#getInteraction()}).
      * </p>
      */
-    @Programmatic
     int numberObjectsDirtied();
 
 
+    /**
+     * @since 2.0.0-M3
+     */
+    @Singleton @Alternative @Priority(-10)
+    public static class MetricsServiceNoop implements MetricsService {
+
+		@Override
+		public int numberObjectsLoaded() {
+			return 0;
+		}
+
+		@Override
+		public int numberObjectsDirtied() {
+			return 0;
+		}
+    	
+    }
+    
 }
 
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheControlInternal.java b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheControlInternal.java
index ec6752f..450a99e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheControlInternal.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheControlInternal.java
@@ -16,11 +16,9 @@
  */
 package org.apache.isis.applib.services.queryresultscache;
 
-import javax.annotation.PostConstruct;
+import javax.enterprise.event.Observes;
 import javax.inject.Singleton;
 
-import org.apache.isis.applib.AbstractSubscriber;
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstalledEvent;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstallingEvent;
 
@@ -29,27 +27,18 @@ import org.apache.isis.applib.fixturescripts.events.FixturesInstallingEvent;
  * In separate class because {@link QueryResultsCache} itself is request-scoped
  */
 @Singleton
-public class QueryResultsCacheControlInternal extends AbstractSubscriber implements QueryResultCacheControl {
-
-    @PostConstruct
-    @Override
-    public void postConstruct() {
-
-        super.postConstruct();
-
-        eventBusService.addEventListener(FixturesInstallingEvent.class, ev->{
-            fixturesInstalling = true;
-        });
-
-        eventBusService.addEventListener(FixturesInstalledEvent.class, ev->{
-            fixturesInstalling = false;
-        });
+public class QueryResultsCacheControlInternal implements QueryResultCacheControl {
 
+    void onFixturesInstalling(@Observes FixturesInstallingEvent event){
+    	fixturesInstalling = true;
+    }
+    
+    void onFixturesInstalled(@Observes FixturesInstalledEvent event){
+    	fixturesInstalling = false;
     }
 
     private boolean fixturesInstalling;
 
-    @Programmatic
     @Override
     public boolean isFixturesInstalling() {
         return fixturesInstalling;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java b/core/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java
index 3e6771a..8431393 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java
@@ -33,6 +33,7 @@ import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.base._Reduction;
 import org.apache.isis.commons.internal.cdi._CDI;
 import org.apache.isis.commons.internal.reflection._Reflect;
+import org.apache.isis.core.commons.collections.Bin;
 
 import lombok.Value;
 import lombok.val;
@@ -59,18 +60,18 @@ public interface ServiceRegistry {
      * @return an optional, empty if passed two instances of the same qualifier type, or an 
      * instance of an annotation that is not a qualifier type
      */
-    default public <T> Instance<T> getInstance(
+    default public <T> Bin<T> select(
             final Class<T> type, Annotation[] qualifiers){
         
-        val optionalInstance = qualifiers!=null
-                ? _CDI.getInstance(type, _CDI.filterQualifiers(qualifiers))
-                    : _CDI.getInstance(type);
+        val bin = qualifiers!=null
+                ? _CDI.select(type, _CDI.filterQualifiers(qualifiers))
+                    : _CDI.select(type);
                 
-        return optionalInstance.orElse(_CDI.InstanceFactory.empty());
+        return bin;
     }
     
-    default public <T> Instance<T> getInstance(final Class<T> type){
-        return getInstance(type, _Constants.emptyAnnotations);
+    default public <T> Bin<T> select(final Class<T> type){
+        return select(type, _Constants.emptyAnnotations);
     }
     
     /**
@@ -94,12 +95,12 @@ public interface ServiceRegistry {
      */
     default public <T> Optional<T> lookupService(final Class<T> serviceClass) {
     	
-    	val instance = getInstance(serviceClass);
-    	if(instance.isUnsatisfied()) {
+    	val bin = select(serviceClass);
+    	if(bin.isEmpty()) {
     		return Optional.empty();
     	}
-    	if(instance.isResolvable()) {
-    		return Optional.of(instance.get());
+    	if(bin.isCardinalityOne()) {
+    		return bin.getSingleton();
     	}
     	// dealing with ambiguity, get the one, with highest priority annotated
     	
@@ -108,7 +109,7 @@ public interface ServiceRegistry {
     			//TODO [2033] not tested yet, whether the 'direction' is correct < vs >
     			_Reduction.<T>of((max, next)-> prioComparator.leftIsHigherThanRight(next, max) ? next : max);
 		
-    	instance.forEach(toMaxPrioReduction);
+    	bin.forEach(toMaxPrioReduction);
     	
     	return toMaxPrioReduction.getResult();
     }
@@ -169,11 +170,9 @@ public interface ServiceRegistry {
         private final Bean<?> bean;
         private final boolean domainService;
         
-        public Instance<?> getInstance() {
+        public Bin<?> getInstance() {
             val type = bean.getBeanClass();
-            val instance = _CDI.getInstance(type, bean.getQualifiers())
-                    .orElse(_CDI.InstanceFactory.empty());
-            return instance;
+            return _CDI.select(type, bean.getQualifiers());
         }
         
         public boolean isCandidateFor(Class<?> requiredType) {
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI.java b/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI.java
index 4d22988..9d1e2cd 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI.java
@@ -27,16 +27,13 @@ import java.util.Collection;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Optional;
-import java.util.Queue;
 import java.util.Set;
-import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 import javax.enterprise.inject.Any;
-import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.CDI;
@@ -44,14 +41,12 @@ import javax.enterprise.inject.spi.CDIProvider;
 import javax.enterprise.util.AnnotationLiteral;
 import javax.inject.Qualifier;
 
-import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.functions._Functions.CheckedRunnable;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.plugins.ioc.IocPlugin;
 
-import lombok.val;
-
 /**
  * <h1>- internal use only -</h1>
  * <p>
@@ -63,7 +58,7 @@ import lombok.val;
  * @since 2.0.0-M2
  */
 public final class _CDI {
-
+	
     /**
      * Bootstrap CDI if not already present.
      * @param onDiscover - Packages of the specified (stream of) classes will be scanned and found classes 
@@ -108,54 +103,31 @@ public final class _CDI {
      * Obtains a child Instance for the given required type and additional required qualifiers. 
      * @param subType
      * @param qualifiers
-     * @return an optional, empty if passed two instances of the same qualifier type, or an 
-     * instance of an annotation that is not a qualifier type
-     */
-    public static <T> Optional<T> getManagedBean(final Class<T> subType, Collection<Annotation> qualifiers) {
-        return getInstance(subType, qualifiers)
-                .map(instance->tryGet(instance::get));
-    }
-
-    /**
-     * Obtains a child Instance for the given required type and additional required qualifiers. 
-     * @param subType
-     * @param qualifiers
-     * @return an optional, empty if passed two instances of the same qualifier type, or an 
-     * instance of an annotation that is not a qualifier type
-     */
-    public static <T> Optional<T> getManagedBean(final Class<T> subType) {
-        return getInstance(subType)
-                .map(instance->tryGet(instance::get));
-    }
-    
-    /**
-     * Obtains a child Instance for the given required type and additional required qualifiers. 
-     * @param subType
-     * @param qualifiers
-     * @return an optional, empty if passed two instances of the same qualifier type, or an 
-     * instance of an annotation that is not a qualifier type
+     * @return non-null {@code Bin}
      */
-    public static <T> Optional<Instance<T>> getInstance(final Class<T> subType, Collection<Annotation> qualifiers) {
+    public static <T> Bin<T> select(final Class<T> subType, Collection<Annotation> qualifiers) {
         if(isEmpty(qualifiers)) {
-            return getInstance(subType);
+            return select(subType);
         }
         
         final Annotation[] _qualifiers = qualifiers.toArray(new Annotation[] {});
         
         return cdi()
-                .map(cdi->tryGet(()->cdi.select(subType, _qualifiers)));
+                .map(cdi->tryGet(()->cdi.select(subType, _qualifiers)))
+                .map(instance->Bin.ofInstance(instance))
+                .orElse(Bin.empty());
     }
     
     /**
      * Obtains a child Instance for the given required type and additional required qualifiers. 
      * @param subType
-     * @param qualifiers
-     * @return an optional, empty if passed two instances of the same qualifier type, or an 
-     * instance of an annotation that is not a qualifier type
+     * @return non-null {@code Bin}
      */
-    public static <T> Optional<Instance<T>> getInstance(final Class<T> subType) {
+    public static <T> Bin<T> select(final Class<T> subType) {
         return cdi()
-                .map(cdi->tryGet(()->cdi.select(subType)));
+                .map(cdi->tryGet(()->cdi.select(subType)))
+                .map(instance->Bin.ofInstance(instance))
+                .orElse(Bin.empty());
     }
     
     
@@ -185,34 +157,23 @@ public final class _CDI {
     // -- GENERIC SINGLETON RESOLVING
     
     /**
-     * @return framework's managed singleton
-     * @throws NoSuchElementException - if the singleton is not resolvable
+     * @return CDI managed singleton wrapped in an Optional
      */
-    public static <T> T getSingleton(Class<T> type) {
-        // first lookup CDI, then lookup _Context; the latter to support unit testing 
-        return _CDI.getManagedBean(type)
-                .orElseGet(()->getMockedSingleton(type));
+    public static <T> Optional<T> getSingleton(@Nullable Class<T> type) {
+    	if(type==null) {
+    		return Optional.empty();
+    	}
+        return _CDI.select(type).getSingleton();
     }
-        
-    // -- UNIT TESTING SUPPORT
-    
-//    public static void putMockedSingletons(Collection<?> mockedServices) {
-//        stream(mockedServices)
-//        .forEach(_CDI::putMockedSingleton);
-//    }
-//    
-//    public static <T> T putMockedSingleton(T mockedService) {
-//        return putMockedSingleton(_Casts.uncheckedCast(mockedService.getClass()), mockedService);
-//    }
-//    
-//    public static <T> T putMockedSingleton(Class<T> type, T mockedService) {
-//        _Context.putSingleton(type, mockedService);
-//        return mockedService;
-//    }
     
-    private static <T> T getMockedSingleton(Class<T> type) {
-        requires(type, "type");        
-        return _Context.getElseFail(type);
+    /**
+     * @return CDI managed singleton
+     * @throws NoSuchElementException - if the singleton is not resolvable
+     */
+    public static <T> T getSingletonElseFail(@Nullable Class<T> type) {
+        return getSingleton(type)
+        		.orElseThrow(()->_Exceptions.noSuchElement("Cannot resolve singleton '%s'", type));
+        				
     }
     
     // -- ENUMERATE BEANS
@@ -226,53 +187,6 @@ public final class _CDI {
         Set<Bean<?>> beans = beanManager.getBeans(Object.class, _CDI.QUALIFIER_ANY);
         return beans.stream();
 	}
-    
-    // -- FACTORIES
-    
-	public static class InstanceFactory {
-
-		public static <T> Instance<T> empty() {
-			return new _CDI_EmptyInstance<>();
-		}
-		
-		public static <T> Instance<T> singleton(@Nullable T pojo) {
-			if(pojo==null) {
-				return empty();
-			}
-			return _CDI_SingletonInstance.of(pojo);
-		}
-
-		public static <T> Instance<T> ambiguous(@Nullable Collection<T> collection) {
-			val size = _NullSafe.size(collection);
-			if(size==0) {
-				return empty();
-			} 
-			if(size==1) {
-				if(collection instanceof List) {
-					// just to reduce heap pollution when collection is a list
-					return singleton(((List<T>)collection).get(0));
-				} 
-				return singleton(collection.iterator().next());
-			}
-			return _CDI_AmbiguousInstance.of(collection);
-		}
-
-        public static <T, R> Instance<R> mapElements(Instance<T> instance, Function<T, R> elementMapper) {
-            
-            if(instance.isUnsatisfied()) {
-                return empty();
-            }
-            if(instance.isResolvable()) {
-                val element = instance.get();
-                return singleton(elementMapper.apply(element));
-            }
-            val elements = instance.stream()
-            .map(elementMapper)
-            .collect(Collectors.toList());
-            return _CDI_AmbiguousInstance.of(elements);
-        }
-		
-	}
         
     // -- HELPER
     
@@ -298,6 +212,8 @@ public final class _CDI {
             return null;
         }
     }
+
+
 	
 
 
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/exceptions/_Exceptions.java b/core/commons/src/main/java/org/apache/isis/commons/internal/exceptions/_Exceptions.java
index 7365047..c191db3 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/exceptions/_Exceptions.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/exceptions/_Exceptions.java
@@ -25,6 +25,7 @@ import static org.apache.isis.commons.internal.base._With.requires;
 import java.io.PrintStream;
 import java.util.Collections;
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -73,7 +74,16 @@ public final class _Exceptions {
         requires(format, "format");
         return new IllegalArgumentException(String.format(format, _case));
     }
+    
+    public static final NoSuchElementException noSuchElement(String msg) {
+        return new NoSuchElementException(msg);
+    }
 
+    public static final NoSuchElementException noSuchElement(String format, Object ...args) {
+        requires(format, "format");
+        return noSuchElement(String.format(format, args));
+    }
+    
     public static final IllegalStateException unexpectedCodeReach() {
         return new IllegalStateException("internal error: code was reached, that is expected unreachable");
     }
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin.java b/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin.java
index 7cd511c..2d565a0 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin.java
@@ -6,11 +6,14 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
+import javax.enterprise.inject.Instance;
 
 import org.apache.isis.commons.internal.base._NullSafe;
 
@@ -23,7 +26,7 @@ import lombok.val;
  * @param <T>
  * @since 2.0.0-M3
  */
-public interface Bin<T> {
+public interface Bin<T> extends Iterable<T> {
 
 	Cardinality getCardinality();
 	int size();
@@ -79,6 +82,21 @@ public interface Bin<T> {
 		return Bin_Multiple.of(nonNullElements);
 	}
 	
+	public static <T> Bin<T> ofInstance(@Nullable Instance<T> instance) {
+		if(instance==null || instance.isUnsatisfied()) {
+			return empty();
+		}
+		if(instance.isResolvable()) { 
+			return Bin_Singleton.of(instance.get());
+		}
+		val nonNullElements = instance.stream()
+				.collect(Collectors.toCollection(()->new ArrayList<>()));
+		
+		return Bin_Multiple.of(nonNullElements);
+		
+	}
+	
+	
 	// -- OPERATORS
 	
 	public default Bin<T> filter(@Nullable Predicate<? super T> predicate) {
@@ -121,6 +139,29 @@ public interface Bin<T> {
     	return Bin_Multiple.of(union);
     }
 	
+    default <R> Bin<R> map(Function<? super T, R> mapper) {
+    	
+        if(isEmpty()) {
+            return empty();
+        }
+        
+        requires(mapper, "mapper");
+        
+        val mappedElements = 
+        		stream()
+        		.map(mapper)
+        		.filter(_NullSafe::isPresent)
+        		.collect(Collectors.toCollection(ArrayList::new));
+        
+        return ofCollection(mappedElements);
+    }
+	
+	// -- TRAVERSAL
+	
+    default void forEach(Consumer<? super T> action) {
+        requires(action, "action");
+        stream().forEach(action);
+    }
 	
 	// -- SHORTCUTS FOR PREDICATES
 	
@@ -140,11 +181,5 @@ public interface Bin<T> {
 		return getCardinality().isMultiple();
 	}
 	
-
-	
-	
-	// -- SHORTCUTS FOR ELEMENT ACCESS
-	
-	
 	
 }
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Empty.java b/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Empty.java
index c419fdb..c6b9783 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Empty.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Empty.java
@@ -1,5 +1,7 @@
 package org.apache.isis.core.commons.collections;
 
+import java.util.Collections;
+import java.util.Iterator;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -35,4 +37,9 @@ final class Bin_Empty<T> implements Bin<T> {
 		return 0;
 	}
 
+	@Override
+	public Iterator<T> iterator() {
+		return Collections.<T>emptyList().iterator();
+	}
+
 }
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Multiple.java b/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Multiple.java
index 47af06d..7d6fc5f 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Multiple.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Multiple.java
@@ -1,5 +1,7 @@
 package org.apache.isis.core.commons.collections;
 
+import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Stream;
@@ -35,4 +37,9 @@ final class Bin_Multiple<T> implements Bin<T> {
 		return elements.size();
 	}
 
+	@Override
+	public Iterator<T> iterator() {
+		return Collections.unmodifiableList(elements).iterator();
+	}
+
 }
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Singleton.java b/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Singleton.java
index acb92a6..11ef069 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Singleton.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/collections/Bin_Singleton.java
@@ -1,5 +1,7 @@
 package org.apache.isis.core.commons.collections;
 
+import java.util.Collections;
+import java.util.Iterator;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -34,4 +36,9 @@ final class Bin_Singleton<T> implements Bin<T> {
 		return 1;
 	}
 
+	@Override
+	public Iterator<T> iterator() {
+		return Collections.singletonList(element).iterator();
+	}
+
 }
diff --git a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
index c6789e3..e478769 100644
--- a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
+++ b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
@@ -32,15 +32,12 @@ import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.context._Plugin;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.config.registry.BeanTypeRegistry;
 import org.apache.isis.core.commons.exceptions.IsisException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import lombok.val;
 import lombok.extern.slf4j.Slf4j;
 
-@Slf4j
+@Slf4j @Deprecated //TODO [2033] was introduced for refactoring, remove 
 public final class AppConfigLocator {
     
     private AppConfigLocator() { }
@@ -118,7 +115,7 @@ public final class AppConfigLocator {
 			try {
 				val type = _Context.loadClassAndInitialize(serviceClassName);
 				
-				if(!_CDI.getManagedBean(type).isPresent()) {
+				if(_CDI.select(type).isEmpty()) {
 					throw new NoSuchElementException(String.format("No such bean known to CDI."));
 				};
 				
@@ -157,15 +154,6 @@ public final class AppConfigLocator {
         
         AppConfig appConfig;
         
-        appConfig = lookupAppConfig_UsingFrameworkContext();
-        if(appConfig!=null) {
-            log.info(String.format("Located AppConfig on framework's context '%s'.", appConfig.getClass().getName()));
-            
-            // assuming, we need to bootstrap CDI ourself
-            _CDI.init(()->BeanTypeRegistry.current().streamInbox());
-            return appConfig;
-        }
-        
         appConfig = lookupAppConfig_UsingCDI();
         if(appConfig!=null) {
             log.info(String.format("Located AppConfig '%s' via CDI.", appConfig.getClass().getName()));
@@ -201,12 +189,8 @@ public final class AppConfigLocator {
         throw new IsisException("Failed to locate the AppConfig");
     }
     
-    private static AppConfig lookupAppConfig_UsingFrameworkContext() {
-        return _Context.getIfAny(AppConfig.class);
-    }
-    
     private static AppConfig lookupAppConfig_UsingCDI() {
-        return _CDI.getManagedBean(AppConfig.class).orElse(null);
+        return _CDI.select(AppConfig.class).getSingleton().orElse(null);
     }
     
     private static AppConfig lookupAppConfig_UsingServiceLoader() {
diff --git a/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java b/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
index 4ce5d67..71d423a 100644
--- a/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
+++ b/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
@@ -46,7 +46,7 @@ import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.reflection._Reflect;
-import org.apache.isis.config.registry.BeanTypeRegistry;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.core.plugins.classdiscovery.ClassDiscovery;
 import org.apache.isis.core.plugins.classdiscovery.ClassDiscoveryPlugin;
 
@@ -98,7 +98,7 @@ class ModulePackageHelper {
         
         
         val typesForScanning = new HashSet<Class<?>>();
-        BeanTypeRegistry.FRAMEWORK_PROVIDED_TYPES_FOR_SCANNING.stream()
+        IsisBeanTypeRegistry.FRAMEWORK_PROVIDED_TYPES_FOR_SCANNING.stream()
         .map(name -> {
 			try {
 				return _Context.loadClass(name);
@@ -116,10 +116,10 @@ class ModulePackageHelper {
         //FIXME [2033] at this point we should have all we need, let CDI take over
         // and let the CDI Bean intercepter make entries into the registry 
         
-        final BeanTypeRegistry registry = BeanTypeRegistry.current();
+        final IsisBeanTypeRegistry registry = IsisBeanTypeRegistry.current();
 
         final Set<String> moduleAndFrameworkPackages = new HashSet<>();
-        moduleAndFrameworkPackages.addAll(BeanTypeRegistry.FRAMEWORK_PROVIDED_SERVICE_PACKAGES);
+        moduleAndFrameworkPackages.addAll(IsisBeanTypeRegistry.FRAMEWORK_PROVIDED_SERVICE_PACKAGES);
         modulePackageNamesFrom(appManifest)
             .forEach(moduleAndFrameworkPackages::add);
         moduleAndFrameworkPackages.add(appManifest.getClass().getPackage().getName());
diff --git a/core/config/src/main/java/org/apache/isis/config/registry/BeanTypeRegistry.java b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
similarity index 77%
rename from core/config/src/main/java/org/apache/isis/config/registry/BeanTypeRegistry.java
rename to core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
index 1409b03..45f0a6e 100644
--- a/core/config/src/main/java/org/apache/isis/config/registry/BeanTypeRegistry.java
+++ b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
@@ -10,6 +10,7 @@ import java.util.stream.Stream;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.debug._Probe;
 
 import lombok.Getter;
 
@@ -17,14 +18,18 @@ import lombok.Getter;
  * Holds the set of domain services, persistent entities and fixture scripts.services etc.
  * @since 2.0.0-M3
  */
-public final class BeanTypeRegistry implements AutoCloseable {
+public final class IsisBeanTypeRegistry implements AutoCloseable {
 
-    public static BeanTypeRegistry current() {
-        return _Context.computeIfAbsent(BeanTypeRegistry.class, BeanTypeRegistry::new);
+	private final static _Probe probe = _Probe.unlimited().label(IsisBeanTypeRegistry.class.getSimpleName());
+	
+    public static IsisBeanTypeRegistry current() {
+        return _Context.computeIfAbsent(IsisBeanTypeRegistry.class, IsisBeanTypeRegistry::new);
     }
     
     private final Set<Class<?>> inbox = new HashSet<>();
-    
+
+    //TODO replace this getters: don't expose the sets for modification!?
+    @Getter private final Set<Class<?>> cdiManaged = new HashSet<>();
     @Getter private final Set<Class<?>> entityTypes = new HashSet<>();
     @Getter private final Set<Class<?>> mixinTypes = new HashSet<>();
     @Getter private final Set<Class<? extends FixtureScript>> fixtureScriptTypes = new HashSet<>();
@@ -53,7 +58,9 @@ public final class BeanTypeRegistry implements AutoCloseable {
 
 	public Stream<Class<?>> streamAllTypes() {
 
-		return _Lists.of(entityTypes,
+		return _Lists.of(
+				cdiManaged,
+				entityTypes,
 				mixinTypes,
 				fixtureScriptTypes,
 				domainServiceTypes,
@@ -61,6 +68,7 @@ public final class BeanTypeRegistry implements AutoCloseable {
 				viewModelTypes,
 				xmlElementTypes)
 				.stream()
+				.distinct()
 				.flatMap(Collection::stream)
 				;
 	}
@@ -77,7 +85,7 @@ public final class BeanTypeRegistry implements AutoCloseable {
 	 * Implemented as a one-shot, that clears the inbox afterwards.
 	 * @return
 	 */
-    public Stream<Class<?>> streamInbox() {
+    public Stream<Class<?>> streamAndClearInbox() {
         
         final List<Class<?>> defensiveCopy;
         
@@ -86,16 +94,24 @@ public final class BeanTypeRegistry implements AutoCloseable {
             inbox.clear();
         }
         
+        defensiveCopy.forEach(cls->{
+        	probe.println("stream inbox: " + cls.getName());
+        });
+        
         return defensiveCopy.stream();
     }
     
+    public Stream<Class<?>> streamCdiManaged() {
+    	return cdiManaged.stream();
+    }
+    
     // -- FILTER
 
     //FIXME[2033] don't categorize this early, instead push candidate classes onto a queue for 
     // later processing when the SpecLoader initializes.
     public boolean isManagedType(TypeMetaData typeMetaData) {
         boolean toInbox = false;
-        boolean manage = false;
+        boolean toCdi = false;
         
         if(typeMetaData.hasDomainServiceAnnotation()) {
             //domainServiceTypes.add(typeMetaData.getUnderlyingClass());
@@ -112,12 +128,19 @@ public final class BeanTypeRegistry implements AutoCloseable {
             toInbox = true;
         }
         
-        if(typeMetaData.hasSingletonAnnotation()) {
-            manage = true;
+        if(typeMetaData.hasSingletonAnnotation() || 
+        		typeMetaData.hasRequestScopedAnnotation()) {
+        	toCdi = true;
+        }
+        
+        if(toCdi) {
+        	cdiManaged.add(typeMetaData.getUnderlyingClass());
+            probe.println("addTo CDI: " + typeMetaData.getUnderlyingClass().getName());
         }
         
         if(toInbox) {
             addToInbox(typeMetaData.getUnderlyingClass());
+            probe.println("addTo inbox: " + typeMetaData.getUnderlyingClass().getName());
         }
         
         return false;
@@ -147,7 +170,7 @@ public final class BeanTypeRegistry implements AutoCloseable {
             "org.apache.isis.core.metamodel.MetamodelModule",
             "org.apache.isis.core.runtime.RuntimeModule",
             "org.apache.isis.core.runtime.services.RuntimeServicesModule",
-            "org.apache.isis.jdo.JdoModule",
+//            "org.apache.isis.jdo.JdoModule",
             "org.apache.isis.viewer.restfulobjects.rendering.RendererContext"
             );
 
diff --git a/core/config/src/main/java/org/apache/isis/config/registry/TypeMetaData.java b/core/config/src/main/java/org/apache/isis/config/registry/TypeMetaData.java
index bb0657d..5171899 100644
--- a/core/config/src/main/java/org/apache/isis/config/registry/TypeMetaData.java
+++ b/core/config/src/main/java/org/apache/isis/config/registry/TypeMetaData.java
@@ -25,6 +25,10 @@ public class TypeMetaData {
         return annotationTypes.contains(singletonAnnotation);
     }
     
+    public boolean hasRequestScopedAnnotation() {
+        return annotationTypes.contains(requestScopedAnnotation);
+    }
+    
     public boolean hasDomainServiceAnnotation() {
         return annotationTypes.contains(domainServiceAnnotation);
     }
@@ -53,7 +57,10 @@ public class TypeMetaData {
         }
     }
     
-    private final static String singletonAnnotation = javax.inject.Singleton.class.getName(); 
+    private final static String singletonAnnotation = 
+    		javax.inject.Singleton.class.getName();
+    private final static String requestScopedAnnotation = 
+    		javax.enterprise.context.RequestScoped.class.getName();
     private final static String domainServiceAnnotation = 
             org.apache.isis.applib.annotation.DomainService.class.getName();
     private final static String domainObjectAnnotation = 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
index 47a8c17..681912d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
@@ -35,7 +35,6 @@ import org.apache.isis.commons.internal.cdi._CDI;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.internal._Config;
-import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
@@ -65,51 +64,51 @@ public final class MetaModelContexts {
 
         @Getter(lazy=true) 
         private final ObjectAdapterProvider objectAdapterProvider =
-        _CDI.getSingleton(ObjectAdapterProvider.class);
+        _CDI.getSingletonElseFail(ObjectAdapterProvider.class);
 
         @Getter(lazy=true) 
         private final ServiceInjector serviceInjector =
-        _CDI.getSingleton(ServiceInjector.class);
+        _CDI.getSingletonElseFail(ServiceInjector.class);
 
         @Getter(lazy=true) 
         private final ServiceRegistry serviceRegistry =
-        _CDI.getSingleton(ServiceRegistry.class);
+        _CDI.getSingletonElseFail(ServiceRegistry.class);
 
         @Getter(lazy=true) 
         private final SpecificationLoader specificationLoader = 
-        _CDI.getSingleton(SpecificationLoader.class);
+        _CDI.getSingletonElseFail(SpecificationLoader.class);
 
         @Getter(lazy=true) 
         private final AuthenticationSessionProvider authenticationSessionProvider =
-        _CDI.getSingleton(AuthenticationSessionProvider.class);
+        _CDI.getSingletonElseFail(AuthenticationSessionProvider.class);
 
         @Getter(lazy=true) 
         private final TranslationService translationService =
-        _CDI.getSingleton(TranslationService.class);
+        _CDI.getSingletonElseFail(TranslationService.class);
 
         @Getter(lazy=true) 
         private final AuthorizationManager authorizationManager =
-        _CDI.getSingleton(AuthorizationManager.class); 
+        _CDI.getSingletonElseFail(AuthorizationManager.class); 
 
         @Getter(lazy=true) 
         private final AuthenticationManager authenticationManager =
-        _CDI.getSingleton(AuthenticationManager.class);
+        _CDI.getSingletonElseFail(AuthenticationManager.class);
 
         @Getter(lazy=true) 
         private final TitleService titleService =
-        _CDI.getSingleton(TitleService.class);
+        _CDI.getSingletonElseFail(TitleService.class);
 
         @Getter(lazy=true) 
         private final ObjectAdapterService objectAdapterService =
-        _CDI.getSingleton(ObjectAdapterService.class);
+        _CDI.getSingletonElseFail(ObjectAdapterService.class);
 
         @Getter(lazy=true) 
         private final RepositoryService repositoryService =
-        _CDI.getSingleton(RepositoryService.class);
+        _CDI.getSingletonElseFail(RepositoryService.class);
         
         @Getter(lazy=true) 
         private final TransactionService transactionService =
-        _CDI.getSingleton(TransactionService.class);
+        _CDI.getSingletonElseFail(TransactionService.class);
         
 
         @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MetaModelRefiner.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MetaModelRefiner.java
index 98d56c0..c30d6db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MetaModelRefiner.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MetaModelRefiner.java
@@ -45,9 +45,10 @@ public interface MetaModelRefiner extends MetaModelValidatorRefiner {
 		
 		val context = MetaModelContext.current();
 		val serviceRegistry = context.getServiceRegistry();
-		val instance = serviceRegistry.getInstance(MetaModelRefiner.class);
-		val refiners = instance.stream()
-		.collect(Collectors.toList());
+		
+		val refiners = serviceRegistry.select(MetaModelRefiner.class)
+				.stream()
+				.collect(Collectors.toList());
 		
 		return refiners;
 	}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
index a26da48..57c8a11 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
@@ -35,22 +35,26 @@ import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
-public class DomainEventHelper {
-
-    private final ServiceRegistry serviceRegistry;
+import lombok.RequiredArgsConstructor;
+import lombok.val;
 
+@RequiredArgsConstructor(staticName = "ofEventService")
+public class DomainEventHelper {
 
-    public DomainEventHelper(final ServiceRegistry serviceRegistry) {
-        this.serviceRegistry = serviceRegistry;
-    }
+	public static DomainEventHelper ofServiceRegistry(final ServiceRegistry serviceRegistry) {
+		val eventService = serviceRegistry.lookupServiceElseFail(MetamodelEventService.class);
+		return ofEventService(eventService);
+	}
+	
+    private final MetamodelEventService metamodelEventService;
 
     // -- postEventForAction, newActionDomainEvent
     
@@ -110,7 +114,7 @@ public class DomainEventHelper {
                 event.setReturnValue(ObjectAdapter.Util.unwrapPojo(resultAdapter));
             }
 
-            getEventBusService().post(event);
+            metamodelEventService.fireActionDomainEvent(event);
             return event;
         } catch (Exception e) {
             throw new FatalException(e);
@@ -203,7 +207,7 @@ public class DomainEventHelper {
             // just in case the actual new value held by the object is different from that applied
             setEventNewValue(event, newValue);
 
-            this.getEventBusService().post(event);
+            metamodelEventService.firePropertyDomainEvent(event);
             return event;
         } catch (Exception e) {
             throw new FatalException(e);
@@ -293,7 +297,7 @@ public class DomainEventHelper {
 
             event.setEventPhase(phase);
 
-            getEventBusService().post(event);
+            metamodelEventService.fireCollectionDomainEvent(event);
             return event;
         } catch (Exception e) {
             throw new FatalException(e);
@@ -396,14 +400,5 @@ public class DomainEventHelper {
         throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object)");
     }
 
-    // -- eventBusService
-
-    private EventBusService getEventBusService() {
-        // previously this method used to cache, however it prevents integration tests
-        // from switching out the EventBusService with a mock.
-        return this.serviceRegistry.lookupService(EventBusService.class).orElse(null);
-    }
-
-
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
index 7a5a047..a05a3a2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
@@ -66,7 +66,7 @@ extends SingleClassValueFacetAbstract implements ActionDomainEventFacet {
         // sadness: same as in TranslationFactory
         this.translationContext = ((IdentifiedHolder)holder).getIdentifier().toClassAndNameIdentityString();
 
-        domainEventHelper = new DomainEventHelper(getServiceRegistry());
+        domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 6e6530d..595df41 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -98,7 +98,7 @@ implements ImperativeFacet {
         this.onType = onType;
         this.returnType = returnType;
         this.serviceRegistry = getServiceRegistry();
-        this.domainEventHelper = new DomainEventHelper(this.serviceRegistry);
+        this.domainEventHelper = DomainEventHelper.ofServiceRegistry(serviceRegistry);
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java
index 5e3c6a5..5cce7d0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java
@@ -56,10 +56,11 @@ implements CollectionAddToFacet {
                     final CollectionDomainEventFacetAbstract collectionDomainEventFacet,
                     final ServiceRegistry serviceRegistry,
                     final FacetHolder holder) {
+    	
         super(type(), eventType, holder);
         this.getterFacet = getterFacet;
         this.collectionAddToFacet = collectionAddToFacet;
-        this.domainEventHelper = new DomainEventHelper(serviceRegistry);
+        this.domainEventHelper = DomainEventHelper.ofServiceRegistry(serviceRegistry);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
index 0444b0a..84685e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
@@ -54,7 +54,7 @@ public abstract class CollectionDomainEventFacetAbstract extends SingleClassValu
         // sadness: same as in TranslationFactory
         this.translationContext = ((IdentifiedHolder)holder).getIdentifier().toClassAndNameIdentityString();
 
-        domainEventHelper = new DomainEventHelper(getServiceRegistry());
+        domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry());
     }
 
     private Class<? extends CollectionDomainEvent<?, ?>> eventType;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java
index 9eb87e7..de1f1db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java
@@ -58,10 +58,11 @@ implements CollectionRemoveFromFacet {
                     final CollectionDomainEventFacetAbstract collectionDomainEventFacet,
                     final ServiceRegistry serviceRegistry,
                     final FacetHolder holder) {
+    	
         super(type(), eventType, holder);
         this.getterFacet = getterFacet;
         this.collectionRemoveFromFacet = collectionRemoveFromFacet;
-        this.domainEventHelper = new DomainEventHelper(serviceRegistry);
+        this.domainEventHelper = DomainEventHelper.ofServiceRegistry(serviceRegistry);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java
index 7db0ea8..09d53e4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java
@@ -62,7 +62,7 @@ public class CssClassFacetOnActionFromConfiguredRegexFactory extends FacetFactor
         // if we don't do this, then any contributed properties or collections end up picking 
         // up the CssClass; almost certainly not what is expected/required.
         final Class<?> owningType = facetHolder.getOwningType();
-        if(!getServiceRegistry().getInstance(owningType).isUnsatisfied()) {
+        if(getServiceRegistry().select(owningType).isNotEmpty()) {
             return;
         }
         CssClassFacet cssClassFacet = createFromConfiguredRegexIfPossible(name, facetHolder);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
index 174f6df..31db1e4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
@@ -25,8 +25,6 @@ import java.util.Map;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.events.ui.CssClassUiEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -34,18 +32,19 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.util.EventUtil;
 
-public class CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent extends FacetAbstract implements
-CssClassFacet {
-
-    //private static final Logger LOG = LoggerFactory.getLogger(CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.class);
+public class CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent 
+extends FacetAbstract 
+implements CssClassFacet {
 
     public static Facet create(
             final List<DomainObjectLayout> domainObjectLayouts,
-            final ServiceInjector servicesInjector,
-            final IsisConfiguration configuration, final FacetHolder facetHolder) {
+            final MetamodelEventService metamodelEventService,
+            final IsisConfiguration configuration, 
+            final FacetHolder facetHolder) {
 
         return domainObjectLayouts.stream()
                 .map(DomainObjectLayout::cssClassUiEvent)
@@ -57,24 +56,24 @@ CssClassFacet {
                         configuration))
                 .findFirst()
                 .map(cssClassUiEventClass -> {
-                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
                     return new CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent(
-                            cssClassUiEventClass, eventBusService, facetHolder);
+                            cssClassUiEventClass, metamodelEventService, facetHolder);
                 })
                 .orElse(null);
 
     }
 
     private final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass;
-    private final EventBusService eventBusService;
+    private final MetamodelEventService metamodelEventService;
 
     public CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent(
-            final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass,
-                    final EventBusService eventBusService,
-                    final FacetHolder holder) {
+    				final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass,
+    				final MetamodelEventService metamodelEventService,
+    				final FacetHolder holder) {
+    	
         super(CssClassFacetAbstract.type(), holder, Derivation.NOT_DERIVED);
         this.cssClassUiEventClass = cssClassUiEventClass;
-        this.eventBusService = eventBusService;
+        this.metamodelEventService = metamodelEventService;
     }
 
     @Override
@@ -86,7 +85,7 @@ CssClassFacet {
 
         final CssClassUiEvent<Object> cssClassUiEvent = newCssClassUiEvent(owningAdapter);
 
-        eventBusService.post(cssClassUiEvent);
+        metamodelEventService.fireCssClassUiEvent(cssClassUiEvent);
 
         final String cssClass = cssClassUiEvent.getCssClass();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
index 0fffcd0..b41b683 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
@@ -25,8 +25,6 @@ import java.util.Map;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.applib.events.ui.CssClassUiEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -34,6 +32,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.util.EventUtil;
 
@@ -44,8 +43,9 @@ public class CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent exten
 
     public static Facet create(
             final List<ViewModelLayout> viewModelLayouts,
-            final ServiceInjector serviceInjector,
-            final IsisConfiguration configuration, final FacetHolder facetHolder) {
+            final MetamodelEventService metamodelEventService,
+            final IsisConfiguration configuration, 
+            final FacetHolder facetHolder) {
 
         return viewModelLayouts.stream()
                 .map(ViewModelLayout::cssClassUiEvent)
@@ -57,23 +57,22 @@ public class CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent exten
                         configuration))
                 .findFirst()
                 .map(cssClassUiEventClass -> {
-                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
                     return new CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent(
-                            cssClassUiEventClass, eventBusService, facetHolder);
+                            cssClassUiEventClass, metamodelEventService, facetHolder);
                 })
                 .orElse(null);
     }
 
     private final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass;
-    private final EventBusService eventBusService;
+    private final MetamodelEventService metamodelEventService;
 
     public CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent(
             final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass,
-            final EventBusService eventBusService,
+            final MetamodelEventService metamodelEventService,
             final FacetHolder holder) {
         super(CssClassFacetAbstract.type(), holder, Derivation.NOT_DERIVED);
         this.cssClassUiEventClass = cssClassUiEventClass;
-        this.eventBusService = eventBusService;
+        this.metamodelEventService = metamodelEventService;
     }
 
     @Override
@@ -85,7 +84,7 @@ public class CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent exten
 
         final CssClassUiEvent<Object> cssClassUiEvent = newCssClassUiEvent(owningAdapter);
 
-        eventBusService.post(cssClassUiEvent);
+        metamodelEventService.fireCssClassUiEvent(cssClassUiEvent);
 
         final String cssClass = cssClassUiEvent.getCssClass();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
index c769757..dea8344 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
@@ -25,6 +25,9 @@ import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
+
+import lombok.val;
 
 public class DomainObjectLayoutFacetFactory extends FacetFactoryAbstract {
 
@@ -41,34 +44,36 @@ public class DomainObjectLayoutFacetFactory extends FacetFactoryAbstract {
 
         final List<DomainObjectLayout> domainObjectLayouts = Annotations.getAnnotations(cls, DomainObjectLayout.class);
         final List<ViewModelLayout> viewModelLayouts = Annotations.getAnnotations(cls, ViewModelLayout.class);
+        
+        val metamodelEventService = getServiceRegistry().lookupServiceElseFail(MetamodelEventService.class);
 
         FacetUtil.addFacet(
                 TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.create(
-                        domainObjectLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+                        domainObjectLayouts, metamodelEventService, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.create(
-                        viewModelLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+                        viewModelLayouts, metamodelEventService, getConfiguration(), facetHolder));
 
         FacetUtil.addFacet(
                 IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.create(
-                        domainObjectLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+                        domainObjectLayouts, metamodelEventService, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.create(
-                        viewModelLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+                        viewModelLayouts, metamodelEventService, getConfiguration(), facetHolder));
 
         FacetUtil.addFacet(
                 CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.create(
-                        domainObjectLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+                        domainObjectLayouts, metamodelEventService, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.create(
-                        viewModelLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+                        viewModelLayouts, metamodelEventService, getConfiguration(), facetHolder));
 
         FacetUtil.addFacet(
                 LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.create(
-                        domainObjectLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+                        domainObjectLayouts, metamodelEventService, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.create(
-                        viewModelLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+                        viewModelLayouts, metamodelEventService, getConfiguration(), facetHolder));
 
         FacetUtil.addFacet(
                 CssClassFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
index 410b8c3..09ebb4c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
@@ -25,24 +25,21 @@ import java.util.Map;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.events.ui.IconUiEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacetAbstract;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.util.EventUtil;
 
 public class IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent extends IconFacetAbstract {
 
-    //private static final Logger LOG = LoggerFactory.getLogger(IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.class);
-
     public static Facet create(
             final List<DomainObjectLayout> domainObjectLayouts,
-            final ServiceInjector servicesInjector,
+            final MetamodelEventService metamodelEventService,
             final IsisConfiguration configuration,
             final FacetHolder facetHolder) {
 
@@ -56,25 +53,22 @@ public class IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent extends Ic
                         configuration))
                 .findFirst()
                 .map(iconUiEvent -> {
-
-                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
-
                     return new IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent(
-                            iconUiEvent, eventBusService, facetHolder);
+                            iconUiEvent, metamodelEventService, facetHolder);
                 })
                 .orElse(null);
     }
 
     private final Class<? extends IconUiEvent<?>> iconUiEventClass;
-    private final EventBusService eventBusService;
+    private final MetamodelEventService metamodelEventService;
 
     public IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent(
             final Class<? extends IconUiEvent<?>> iconUiEventClass,
-                    final EventBusService eventBusService,
+                    final MetamodelEventService metamodelEventService,
                     final FacetHolder holder) {
         super(holder);
         this.iconUiEventClass = iconUiEventClass;
-        this.eventBusService = eventBusService;
+        this.metamodelEventService = metamodelEventService;
     }
 
     @Override
@@ -86,7 +80,7 @@ public class IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent extends Ic
 
         final IconUiEvent<Object> iconUiEvent = newIconUiEvent(owningAdapter);
 
-        eventBusService.post(iconUiEvent);
+        metamodelEventService.fireIconUiEvent(iconUiEvent);
 
         final String iconName = iconUiEvent.getIconName();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java
index 4f0f647..19718ab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java
@@ -25,25 +25,23 @@ import java.util.Map;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.applib.events.ui.IconUiEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacetAbstract;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.util.EventUtil;
 
 public class IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent extends IconFacetAbstract {
 
-    //private static final Logger LOG = LoggerFactory.getLogger(IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.class);
-
     public static Facet create(
             final List<ViewModelLayout> viewModelLayouts,
-            final ServiceInjector serviceInjector,
-            final IsisConfiguration configuration, final FacetHolder facetHolder) {
+            final MetamodelEventService metamodelEventService,
+            final IsisConfiguration configuration, 
+            final FacetHolder facetHolder) {
 
         return viewModelLayouts.stream()
                 .map(ViewModelLayout::iconUiEvent)
@@ -56,24 +54,22 @@ public class IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent extends IconF
                 .findFirst()
                 .map(iconUiEvent -> {
 
-                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
-
                     return new IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent(
-                            iconUiEvent, eventBusService, facetHolder);
+                            iconUiEvent, metamodelEventService, facetHolder);
                 })
                 .orElse(null);
     }
 
     private final Class<? extends IconUiEvent<?>> iconUiEventClass;
-    private final EventBusService eventBusService;
+    private final MetamodelEventService metamodelEventService;
 
     public IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent(
             final Class<? extends IconUiEvent<?>> iconUiEventClass,
-            final EventBusService eventBusService,
+            final MetamodelEventService metamodelEventService,
             final FacetHolder holder) {
         super(holder);
         this.iconUiEventClass = iconUiEventClass;
-        this.eventBusService = eventBusService;
+        this.metamodelEventService = metamodelEventService;
     }
 
     @Override
@@ -85,7 +81,7 @@ public class IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent extends IconF
 
         final IconUiEvent<Object> iconUiEvent = newIconUiEvent(owningAdapter);
 
-        eventBusService.post(iconUiEvent);
+        metamodelEventService.fireIconUiEvent(iconUiEvent);
 
         final String iconName = iconUiEvent.getIconName();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java
index d780870..e1a84e0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java
@@ -25,25 +25,24 @@ import java.util.Map;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.events.ui.LayoutUiEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
 import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetAbstract;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.util.EventUtil;
 
-public class LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent extends LayoutFacetAbstract implements
-        LayoutFacet {
-
-    //private static final Logger LOG = LoggerFactory.getLogger(LayoutFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.class);
+public class LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent 
+extends LayoutFacetAbstract 
+implements LayoutFacet {
 
     public static Facet create(
             final List<DomainObjectLayout> domainObjectLayouts,
-            final ServiceInjector serviceInjector,
-            final IsisConfiguration configuration, final FacetHolder facetHolder) {
+            final MetamodelEventService metamodelEventService,
+            final IsisConfiguration configuration, 
+            final FacetHolder facetHolder) {
 
         return domainObjectLayouts.stream()
                 .map(DomainObjectLayout::layoutUiEvent)
@@ -56,24 +55,22 @@ public class LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent extend
                 .findFirst()
                 .map(layoutUiEvent -> {
 
-                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
-
                     return new LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
-                            layoutUiEvent, eventBusService, facetHolder);
+                            layoutUiEvent, metamodelEventService, facetHolder);
                 })
                 .orElse(null);
     }
 
     private final Class<? extends LayoutUiEvent<?>> layoutUiEventClass;
-    private final EventBusService eventBusService;
+    private final MetamodelEventService metamodelEventService;
 
     public LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
             final Class<? extends LayoutUiEvent<?>> layoutUiEventClass,
-            final EventBusService eventBusService,
+            final MetamodelEventService metamodelEventService,
             final FacetHolder holder) {
         super(holder);
         this.layoutUiEventClass = layoutUiEventClass;
-        this.eventBusService = eventBusService;
+        this.metamodelEventService = metamodelEventService;
     }
 
     @Override
@@ -85,7 +82,7 @@ public class LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent extend
 
         final LayoutUiEvent<Object> layoutUiEvent = newLayoutUiEvent(owningAdapter);
 
-        eventBusService.post(layoutUiEvent);
+        metamodelEventService.fireLayoutUiEvent(layoutUiEvent);
 
         final String layout = layoutUiEvent.getLayout();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
index 221e7ec..772696f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
@@ -25,25 +25,24 @@ import java.util.Map;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.applib.events.ui.LayoutUiEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
 import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetAbstract;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.util.EventUtil;
 
-public class LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent extends LayoutFacetAbstract implements
-        LayoutFacet {
-
-    //private static final Logger LOG = LoggerFactory.getLogger(LayoutFacetViaViewModelLayoutAnnotationUsingIconUiEvent.class);
+public class LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent 
+extends LayoutFacetAbstract 
+implements LayoutFacet {
 
     public static Facet create(
             final List<ViewModelLayout> viewModelLayouts,
-            final ServiceInjector serviceInjector,
-            final IsisConfiguration configuration, final FacetHolder facetHolder) {
+            final MetamodelEventService metamodelEventService,
+            final IsisConfiguration configuration, 
+            final FacetHolder facetHolder) {
 
         return viewModelLayouts.stream()
                 .map(ViewModelLayout::layoutUiEvent)
@@ -56,24 +55,22 @@ public class LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent extends L
                 .findFirst()
                 .map(layoutUiEvent -> {
 
-                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
-
                     return new LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
-                            layoutUiEvent, eventBusService, facetHolder);
+                            layoutUiEvent, metamodelEventService, facetHolder);
                 })
                 .orElse(null);
     }
 
     private final Class<? extends LayoutUiEvent<?>> layoutUiEventClass;
-    private final EventBusService eventBusService;
+    private final MetamodelEventService metamodelEventService;
 
     public LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent(
             final Class<? extends LayoutUiEvent<?>> layoutUiEventClass,
-            final EventBusService eventBusService,
+            		final MetamodelEventService metamodelEventService,
             final FacetHolder holder) {
         super(holder);
         this.layoutUiEventClass = layoutUiEventClass;
-        this.eventBusService = eventBusService;
+        this.metamodelEventService = metamodelEventService;
     }
 
     @Override
@@ -85,7 +82,7 @@ public class LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent extends L
 
         final LayoutUiEvent<Object> layoutUiEvent = newLayoutUiEvent(owningAdapter);
 
-        eventBusService.post(layoutUiEvent);
+        metamodelEventService.fireLayoutUiEvent(layoutUiEvent);
 
         final String layout = layoutUiEvent.getLayout();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
index be1ed91..bce283b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
@@ -25,27 +25,24 @@ import java.util.Map;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.events.ui.TitleUiEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.util.EventUtil;
 
 public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends TitleFacetAbstract {
 
-    //private static final Logger LOG = LoggerFactory.getLogger(TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.class);
-
     public static Facet create(
             final List<DomainObjectLayout> domainObjectLayouts,
-            final ServiceInjector servicesInjector,
+            final MetamodelEventService metamodelEventService,
             final IsisConfiguration configuration, 
             final FacetHolder facetHolder) {
 
@@ -59,8 +56,6 @@ public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends
                         configuration))
                 .findFirst()
                 .map(titleUiEventClass -> {
-                    final TranslationService translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);
-                    
                     final String translationContext;
                     if(facetHolder instanceof ObjectSpecification) {
                         final ObjectSpecification facetHolderAsSpec = (ObjectSpecification) facetHolder; // bit naughty...
@@ -69,10 +64,8 @@ public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends
                         translationContext = null;
                     }
                     
-                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
-
                     return new TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent(
-                            titleUiEventClass, translationService, translationContext, eventBusService, facetHolder);
+                            titleUiEventClass, translationContext, metamodelEventService, facetHolder);
                 })
                 .orElse(null);
     }
@@ -80,19 +73,18 @@ public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends
     private final Class<? extends TitleUiEvent<?>> titleUiEventClass;
     private final TranslationService translationService;
     private final String translationContext;
-    private final EventBusService eventBusService;
+    private final MetamodelEventService metamodelEventService;
 
     public TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent(
             final Class<? extends TitleUiEvent<?>> titleUiEventClass,
-                    final TranslationService translationService,
                     final String translationContext,
-                    final EventBusService eventBusService,
+                    final MetamodelEventService metamodelEventService,
                     final FacetHolder holder) {
         super(holder);
         this.titleUiEventClass = titleUiEventClass;
-        this.translationService = translationService;
+        this.translationService = super.getTranslationService();
         this.translationContext = translationContext;
-        this.eventBusService = eventBusService;
+        this.metamodelEventService = metamodelEventService;
     }
 
     @Override
@@ -104,7 +96,7 @@ public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends
 
         final TitleUiEvent<Object> titleUiEvent = newTitleUiEvent(owningAdapter);
 
-        eventBusService.post(titleUiEvent);
+        metamodelEventService.fireTitleUiEvent(titleUiEvent);
 
         final TranslatableString translatedTitle = titleUiEvent.getTranslatableTitle();
         if(translatedTitle != null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java
index 7bf7056..191ba6c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java
@@ -25,28 +25,26 @@ import java.util.Map;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.applib.events.ui.TitleUiEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.util.EventUtil;
 
 public class TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent extends TitleFacetAbstract {
 
-    //private static final Logger LOG = LoggerFactory.getLogger(TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.class);
-
     public static Facet create(
             final List<ViewModelLayout> viewModelLayouts,
-            final ServiceInjector serviceInjector,
-            final IsisConfiguration configuration, final FacetHolder facetHolder) {
+            final MetamodelEventService metamodelEventService,
+            final IsisConfiguration configuration, 
+            final FacetHolder facetHolder) {
 
         return viewModelLayouts.stream()
                 .map(ViewModelLayout::titleUiEvent)
@@ -58,8 +56,6 @@ public class TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent extends Tit
                         configuration))
                 .findFirst()
                 .map(titleUiEventClass -> {
-                    final TranslationService translationService = serviceInjector.lookupService(TranslationService.class).orElse(null);
-
                     final String translationContext;
                     if(facetHolder instanceof ObjectSpecification) {
                         final ObjectSpecification facetHolderAsSpec = (ObjectSpecification) facetHolder; // bit naughty...
@@ -68,10 +64,8 @@ public class TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent extends Tit
                         translationContext = null;
                     }
 
-                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
-
                     return new TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent(
-                            titleUiEventClass, translationService, translationContext, eventBusService, facetHolder);
+                            titleUiEventClass, translationContext, metamodelEventService, facetHolder);
                 })
                 .orElse(null);
     }
@@ -79,19 +73,18 @@ public class TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent extends Tit
     private final Class<? extends TitleUiEvent<?>> titleUiEventClass;
     private final TranslationService translationService;
     private final String translationContext;
-    private final EventBusService eventBusService;
+    private final MetamodelEventService metamodelEventService;
 
     public TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent(
             final Class<? extends TitleUiEvent<?>> titleUiEventClass,
-            final TranslationService translationService,
             final String translationContext,
-            final EventBusService eventBusService,
+            final MetamodelEventService metamodelEventService,
             final FacetHolder holder) {
         super(holder);
         this.titleUiEventClass = titleUiEventClass;
-        this.translationService = translationService;
+        this.translationService = super.getTranslationService();
         this.translationContext = translationContext;
-        this.eventBusService = eventBusService;
+        this.metamodelEventService = metamodelEventService;
     }
 
     @Override
@@ -103,7 +96,7 @@ public class TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent extends Tit
 
         final TitleUiEvent<Object> titleUiEvent = newTitleUiEvent(owningAdapter);
 
-        eventBusService.post(titleUiEvent);
+        metamodelEventService.fireTitleUiEvent(titleUiEvent);
 
         final TranslatableString translatedTitle = titleUiEvent.getTranslatableTitle();
         if(translatedTitle != null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
index bdb78e0..ec477da 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
@@ -67,7 +67,7 @@ extends SingleClassValueFacetAbstract implements PropertyDomainEventFacet {
         // sadness: same as in TranslationFactory
         this.translationContext = ((IdentifiedHolder)holder).getIdentifier().toClassAndNameIdentityString();
 
-        domainEventHelper = new DomainEventHelper(getServiceRegistry());
+        domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry());
     }
 
     private Class<? extends PropertyDomainEvent<?, ?>> eventType;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
index bbe3028..04c1564 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
@@ -72,7 +72,7 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
         this.getterFacet = getterFacet;
         this.setterFacet = setterFacet;
         this.clearFacet = clearFacet;
-        this.domainEventHelper = new DomainEventHelper(getServiceRegistry());
+        this.domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry());
     }
 
     enum Style {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceInjectorDefault.java
index c93ec20..fc8a62b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceInjectorDefault.java
@@ -30,9 +30,6 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._NullSafe;
@@ -42,6 +39,8 @@ import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.commons.util.ToString;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.spec.InjectorMethodEvaluator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import lombok.val;
 
@@ -120,9 +119,9 @@ public class ServiceInjectorDefault implements ServiceInjector {
             return;
         }
         
-        val instance = serviceRegistry.getInstance(typeToBeInjected, field.getAnnotations());
-        if(instance.isResolvable()) {
-            val bean = instance.get();
+        val beans = serviceRegistry.select(typeToBeInjected, field.getAnnotations());
+        if(beans.isCardinalityOne()) {
+            val bean = beans.getSingleton().get();
             invokeInjectorField(field, targetPojo, bean);    
         }
 
@@ -137,9 +136,9 @@ public class ServiceInjectorDefault implements ServiceInjector {
         final Class<? extends Collection<Object>> collectionTypeToBeInjected =
                 (Class<? extends Collection<Object>>) field.getType();
         
-        val instance = serviceRegistry.getInstance(elementType, field.getAnnotations());
-        if(!instance.isUnsatisfied()) {
-            final Collection<Object> collectionOfServices = instance.stream()
+        val beans = serviceRegistry.select(elementType, field.getAnnotations());
+        if(!beans.isEmpty()) {
+            final Collection<Object> collectionOfServices = beans.stream()
                     .filter(isOfType(elementType))
                     .collect(_Collections.toUnmodifiableOfType(collectionTypeToBeInjected));
 
@@ -167,9 +166,9 @@ public class ServiceInjectorDefault implements ServiceInjector {
             return;
         }
         
-        val instance = serviceRegistry.getInstance(typeToBeInjected, setter.getAnnotations());
-        if(instance.isResolvable()) {
-            val bean = instance.get();
+        val instance = serviceRegistry.select(typeToBeInjected, setter.getAnnotations());
+        if(instance.isCardinalityOne()) {
+            val bean = instance.getSingleton().get();
             invokeInjectorMethod(setter, targetPojo, bean);    
         } 
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventService.java
new file mode 100644
index 0000000..df2ff2e
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventService.java
@@ -0,0 +1,63 @@
+package org.apache.isis.core.metamodel.services.events;
+
+import javax.enterprise.event.Event;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.apache.isis.applib.events.domain.ActionDomainEvent;
+import org.apache.isis.applib.events.domain.CollectionDomainEvent;
+import org.apache.isis.applib.events.domain.PropertyDomainEvent;
+import org.apache.isis.applib.events.ui.CssClassUiEvent;
+import org.apache.isis.applib.events.ui.IconUiEvent;
+import org.apache.isis.applib.events.ui.LayoutUiEvent;
+import org.apache.isis.applib.events.ui.TitleUiEvent;
+
+/**
+ * 
+ * @since 2.0.0-M3
+ *
+ */
+@Singleton
+public class MetamodelEventService {
+
+	@Inject Event<CssClassUiEvent<Object>> cssClassUiEvents;
+	@Inject Event<IconUiEvent<Object>> iconUiEvents;
+	@Inject Event<LayoutUiEvent<Object>> layoutUiEvents;
+	@Inject Event<TitleUiEvent<Object>> titleUiEvents;
+	
+	@Inject Event<ActionDomainEvent<?>> actionDomainEvents;
+	@Inject Event<PropertyDomainEvent<?, ?>> propertyDomainEvents;
+	@Inject Event<CollectionDomainEvent<?, ?>> collectionDomainEvents;
+	
+	// -- METAMODEL UI EVENTS
+	
+	public void fireCssClassUiEvent(CssClassUiEvent<Object> event) {
+		cssClassUiEvents.fire(event);
+	}
+
+	public void fireIconUiEvent(IconUiEvent<Object> event) {
+		iconUiEvents.fire(event);
+	}
+
+	public void fireLayoutUiEvent(LayoutUiEvent<Object> event) {
+		layoutUiEvents.fire(event);
+	}
+
+	public void fireTitleUiEvent(TitleUiEvent<Object> event) {
+		titleUiEvents.fire(event);
+	}
+
+	public void fireActionDomainEvent(ActionDomainEvent<?> event) {
+		actionDomainEvents.fire(event);
+	}
+
+	public void firePropertyDomainEvent(PropertyDomainEvent<?, ?> event) {
+		propertyDomainEvents.fire(event);
+	}
+
+	public void fireCollectionDomainEvent(CollectionDomainEvent<?, ?> event) {
+		collectionDomainEvents.fire(event);
+	}
+	
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index 15218a7..87ead6a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -89,7 +89,7 @@ public class MetaModelServiceDefault implements MetaModelService {
     public void rebuild(final Class<?> domainType) {
         specificationLoader.invalidateCache(domainType);
         
-        GridService gridService = _CDI.getManagedBean(GridService.class).get();
+        GridService gridService = _CDI.getSingletonElseFail(GridService.class);
         gridService.remove(domainType);
         specificationLoader.loadSpecification(domainType);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java
index b5b1c3c..7af881e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.services.registry;
 
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Stream;
 
@@ -31,6 +32,7 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.cdi._CDI;
 import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
 
 import lombok.val;
@@ -70,8 +72,9 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
             streamRegisteredBeans()
             .filter(BeanAdapter::isDomainService)
             .map(BeanAdapter::getInstance)
-            .filter(Instance::isResolvable)
-            .map(Instance::get)
+            .filter(Bin::isCardinalityOne)
+            .map(Bin::getSingleton)
+            .map(Optional::get)
             .forEach(serviceCache::add);
         }
         return serviceCache.stream();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index fd861cd..9c5a41d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -39,7 +39,7 @@ import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.config.property.ConfigPropertyBoolean;
 import org.apache.isis.config.property.ConfigPropertyEnum;
-import org.apache.isis.config.registry.BeanTypeRegistry;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.lang.ClassUtil;
@@ -156,7 +156,7 @@ public class SpecificationLoader {
         // need to completely load services and mixins (synchronously)
         LOG.info("Loading all specs (up to state of {})", IntrospectionState.NOT_INTROSPECTED);
 
-        val typeRegistry = BeanTypeRegistry.current(); 
+        val typeRegistry = IsisBeanTypeRegistry.current(); 
         
         final List<ObjectSpecification> specificationsFromRegistry = _Lists.newArrayList();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 5383f10..f8ee912 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -40,7 +40,7 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.config.registry.BeanTypeRegistry;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.core.commons.exceptions.UnknownTypeException;
 import org.apache.isis.core.commons.lang.ClassExtensions;
 import org.apache.isis.core.commons.util.ToString;
@@ -853,7 +853,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             return Collections.emptyList();
         }
 
-        val mixinTypes = BeanTypeRegistry.current().getMixinTypes();
+        val mixinTypes = IsisBeanTypeRegistry.current().getMixinTypes();
         if(_NullSafe.isEmpty(mixinTypes)) {
             return Collections.emptyList();
         }
@@ -1039,7 +1039,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             return Collections.emptyList();
         }
         
-        val mixinTypes = BeanTypeRegistry.current().getMixinTypes();
+        val mixinTypes = IsisBeanTypeRegistry.current().getMixinTypes();
         if(_NullSafe.isEmpty(mixinTypes)) {
             return Collections.emptyList();
         }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
index b2847dc..7bb93e8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
@@ -23,17 +23,9 @@ import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Optional;
 
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-
 import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -49,6 +41,11 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
 
 public abstract class AbstractFacetFactoryJUnit4TestCase {
 
@@ -83,8 +80,8 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
     protected OneToManyAssociation mockOneToManyAssociation;
     @Mock
     protected OneToOneActionParameter mockOneToOneActionParameter;
-    @Mock
-    protected EventBusService mockEventBusService;
+//    @Mock
+//    protected EventBusService mockEventBusService;
     @Mock
     protected ObjectAdapterProvider mockObjectAdapterProvider;
     
@@ -117,8 +114,8 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
             allowing(mockServicesInjector).lookupService(AuthenticationSessionProvider.class);
             will(returnValue(mockAuthenticationSessionProvider));
 
-            allowing(mockServicesInjector).lookupServiceElseFail(EventBusService.class);
-            will(returnValue(mockEventBusService));
+//            allowing(mockServicesInjector).lookupServiceElseFail(EventBusService.class);
+//            will(returnValue(mockEventBusService));
 
         }});
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java
index 604118d..2a5fe7b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java
@@ -43,7 +43,8 @@ public class DomainEventHelperTest_newActionInteractionEvent {
         final SomeDomainObject sdo = new SomeDomainObject();
         final Identifier identifier = Identifier.actionIdentifier(SomeDomainObject.class, "foo", new Class[]{int.class, String.class});
 
-        final ActionDomainEvent<Object> ev = new DomainEventHelper(null).newActionDomainEvent(
+        Utils.domainEventHelper();
+		final ActionDomainEvent<Object> ev = DomainEventHelper.newActionDomainEvent(
                 ActionDomainEvent.Default.class, identifier, sdo, new Object[]{1, "bar"});
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
@@ -57,7 +58,8 @@ public class DomainEventHelperTest_newActionInteractionEvent {
         final SomeDomainObject sdo = new SomeDomainObject();
         final Identifier identifier = Identifier.actionIdentifier(SomeDomainObject.class, "foo", new Class[]{int.class, String.class});
 
-        final ActionDomainEvent<Object> ev = new DomainEventHelper(null).newActionDomainEvent(
+        Utils.domainEventHelper();
+		final ActionDomainEvent<Object> ev = DomainEventHelper.newActionDomainEvent(
                 ActionDomainEvent.Default.class, identifier, sdo, new Object[]{1, "bar"});
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
@@ -71,7 +73,8 @@ public class DomainEventHelperTest_newActionInteractionEvent {
         final SomeDomainObject sdo = new SomeDomainObject();
         final Identifier identifier = Identifier.actionIdentifier(SomeDomainObject.class, "foo", new Class[]{int.class, String.class});
         
-        final ActionDomainEvent<SomeDomainObject> ev = new DomainEventHelper(null).newActionDomainEvent(
+        Utils.domainEventHelper();
+		final ActionDomainEvent<SomeDomainObject> ev = DomainEventHelper.newActionDomainEvent(
                 SomeDomainObjectFooInvokedDomainEvent.class, identifier, sdo, new Object[]{1, "bar"});
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
index acd3dbf..1cc4229 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
@@ -45,7 +45,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
         final SomeReferencedObject other = new SomeReferencedObject();
         final Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
 
-        final CollectionDomainEvent<Object, Object> ev = new DomainEventHelper(null).newCollectionDomainEvent(
+        final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
                 CollectionDomainEvent.Default.class, null, identifier, sdo, CollectionDomainEvent.Of.ADD_TO, other);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
@@ -59,7 +59,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
         final SomeReferencedObject other = new SomeReferencedObject();
         final Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
 
-        final CollectionDomainEvent<Object, Object> ev = new DomainEventHelper(null).newCollectionDomainEvent(
+        final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
                 CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.ADD_TO, other);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
@@ -73,7 +73,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
         final SomeReferencedObject other = new SomeReferencedObject();
         final Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
         
-        final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = new DomainEventHelper(null).newCollectionDomainEvent(
+        final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = Utils.domainEventHelper().newCollectionDomainEvent(
                 SomeDomainObjectCollectionDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.ADD_TO, other);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
index c73b68e..6d187ea 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
@@ -45,7 +45,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
         SomeReferencedObject other = new SomeReferencedObject();
         Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
 
-        final CollectionDomainEvent<Object, Object> ev = new DomainEventHelper(null).newCollectionDomainEvent(
+        final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
                 CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.REMOVE_FROM, other);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
@@ -59,7 +59,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
         SomeReferencedObject other = new SomeReferencedObject();
         Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
 
-        final CollectionDomainEvent<Object, Object> ev = new DomainEventHelper(null).newCollectionDomainEvent(
+        final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
                 CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.REMOVE_FROM, other);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
@@ -73,7 +73,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
         SomeReferencedObject other = new SomeReferencedObject();
         Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
 
-        final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = new DomainEventHelper(null).newCollectionDomainEvent(
+        final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = Utils.domainEventHelper().newCollectionDomainEvent(
                 SomeDomainObjectCollectionRemovedFromDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.REMOVE_FROM, other);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java
index 4086b62..bc2cf09 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java
@@ -43,8 +43,9 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forClear {
         LocalDate oldValue = new LocalDate(2013,4,1);
         LocalDate newValue = null;
         
-        final PropertyDomainEvent<Object, Object> ev =
-                new DomainEventHelper(null).newPropertyDomainEvent(PropertyDomainEvent.Default.class, identifier, sdo, oldValue, newValue);
+        Utils.domainEventHelper();
+		final PropertyDomainEvent<Object, Object> ev =
+        		DomainEventHelper.newPropertyDomainEvent(PropertyDomainEvent.Default.class, identifier, sdo, oldValue, newValue);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertEquals(ev.getOldValue(), oldValue);
@@ -60,8 +61,9 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forClear {
         LocalDate oldValue = new LocalDate(2013,4,1);
         LocalDate newValue = null;
         
-        final PropertyDomainEvent<SomeDomainObject, LocalDate> ev =
-                new DomainEventHelper(null).newPropertyDomainEvent(SomeDatePropertyChangedDomainEvent.class, identifier, sdo, oldValue, newValue);
+        Utils.domainEventHelper();
+		final PropertyDomainEvent<SomeDomainObject, LocalDate> ev =
+        		DomainEventHelper.newPropertyDomainEvent(SomeDatePropertyChangedDomainEvent.class, identifier, sdo, oldValue, newValue);
         assertSame(ev.getSource(), sdo);
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOldValue(), is(oldValue));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java
index 10b12a7..005e6ed 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java
@@ -39,8 +39,9 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forModify {
         LocalDate oldValue = new LocalDate(2013,4,1);
         LocalDate newValue = new LocalDate(2013,5,2);
         
-        final PropertyDomainEvent<Object, Object> ev =
-                new DomainEventHelper(null).newPropertyDomainEvent(PropertyDomainEvent.Default.class, identifier, sdo, oldValue, newValue);
+        Utils.domainEventHelper();
+		final PropertyDomainEvent<Object, Object> ev =
+        		DomainEventHelper.newPropertyDomainEvent(PropertyDomainEvent.Default.class, identifier, sdo, oldValue, newValue);
         assertThat(ev.getSource(), is((Object)sdo));
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOldValue(), is((Object)oldValue));
@@ -56,8 +57,9 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forModify {
         LocalDate oldValue = new LocalDate(2013,4,1);
         LocalDate newValue = new LocalDate(2013,5,2);
         
-        final PropertyDomainEvent<SomeDomainObject, LocalDate> ev =
-                new DomainEventHelper(null).newPropertyDomainEvent(SomeDatePropertyChangedDomainEvent.class, identifier, sdo, oldValue, newValue);
+        Utils.domainEventHelper();
+		final PropertyDomainEvent<SomeDomainObject, LocalDate> ev =
+        		DomainEventHelper.newPropertyDomainEvent(SomeDatePropertyChangedDomainEvent.class, identifier, sdo, oldValue, newValue);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOldValue(), is(oldValue));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Utils.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Utils.java
index 4db96c3..6e03318 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Utils.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Utils.java
@@ -27,6 +27,10 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 
 class Utils {
 
+	static DomainEventHelper domainEventHelper() {
+		return DomainEventHelper.ofEventService(null);
+	}
+	
     protected static boolean contains(final Class<?>[] array, final Class<?> val) {
         for (final Class<?> element : array) {
             if (element == val) {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
index 6935a5b..3963d2e 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -35,7 +35,7 @@ import org.apache.isis.applib.services.i18n.TranslationService.Mode;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.commons.internal.base._Timing;
 import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.config.registry.BeanTypeRegistry;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.core.metamodel.BeansForTesting;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
diff --git a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java
index b859e98..bae47c9 100644
--- a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java
+++ b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java
@@ -61,8 +61,8 @@ public class WeldFactory {
 	                    
 	                    "org.apache.isis.core.wrapper.WrapperFactoryDefault",
 	                    "org.apache.isis.viewer.wicket.viewer.IsisWicketModule",
-	                    "org.apache.isis.applib.services.jdosupport.IsisJdoSupportDN5",
-	                    "org.apache.isis.jdo.datanucleus.persistence.IsisLegacyJdoContextHandler",
+//	                    "org.apache.isis.applib.services.jdosupport.IsisJdoSupportDN5",
+//	                    "org.apache.isis.jdo.datanucleus.persistence.IsisLegacyJdoContextHandler",
 	                    
 	                    "org.apache.wicket.cdi.AutoConversation",
 	                    "org.apache.isis.viewer.restfulobjects.rendering.RendererContext"
diff --git a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/scopes/conversation/SeamConversationContextSupport.java b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/scopes/conversation/SeamConversationContextSupport.java
index 7495541..fc17ee8 100644
--- a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/scopes/conversation/SeamConversationContextSupport.java
+++ b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/scopes/conversation/SeamConversationContextSupport.java
@@ -73,7 +73,7 @@ public class SeamConversationContextSupport implements SeamConversationContext<H
 	// -- HELPER
 	
 	private HttpConversationContext httpConversationContext() {
-		return _CDI.getManagedBean(HttpConversationContext.class).get();
+		return _CDI.select(HttpConversationContext.class).getSingleton().orElse(null);
 	}
 	
 	
diff --git a/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java b/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java
index 9117374..b5797c2 100644
--- a/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java
+++ b/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.config.registry.BeanTypeRegistry;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.core.plugins.classdiscovery.ClassDiscoveryPlugin;
 
 /**
@@ -63,7 +63,7 @@ implements ClassDiscoveryService {
     // -- HELPER
 
     private static <T> Set<Class<? extends T>> getFixtureScriptTypes() {
-        Set<?> fixtureScriptTypes = BeanTypeRegistry.current().getFixtureScriptTypes();
+        Set<?> fixtureScriptTypes = IsisBeanTypeRegistry.current().getFixtureScriptTypes();
         if (fixtureScriptTypes != null) {
             return _Casts.uncheckedCast(fixtureScriptTypes);
         }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/EventBusService.java b/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/eventbus/EventBusService.java
similarity index 100%
rename from core/applib/src/main/java/org/apache/isis/applib/services/eventbus/EventBusService.java
rename to core/plugins/legacy/src/main/java/org/apache/isis/applib/services/eventbus/EventBusService.java
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/package-info.java b/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/eventbus/package-info.java
similarity index 100%
rename from core/applib/src/main/java/org/apache/isis/applib/services/eventbus/package-info.java
rename to core/plugins/legacy/src/main/java/org/apache/isis/applib/services/eventbus/package-info.java
diff --git a/core/runtime-extensions/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java b/core/runtime-extensions/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
index f6a4722..d4ee65d 100644
--- a/core/runtime-extensions/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
+++ b/core/runtime-extensions/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
@@ -129,7 +129,7 @@ public final class IsisSystem {
             _Blackhole.consume(AppConfigLocator.getAppConfig());
             
 
-            isisSessionFactory = _CDI.getSingleton(IsisSessionFactory.class);
+            isisSessionFactory = _CDI.getSingletonElseFail(IsisSessionFactory.class);
             // REVIEW: does no harm, but is this required?
             closeSession();
 
diff --git a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
index 4ef3885..f3a24e4 100644
--- a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
+++ b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
@@ -19,7 +19,6 @@
 package org.apache.isis.core.webapp;
 
 import static org.apache.isis.commons.internal.base._With.acceptIfPresent;
-import static org.apache.isis.commons.internal.resources._Resources.putContextPathIfPresent;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -29,15 +28,20 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
+import javax.servlet.annotation.WebListener;
 
 import org.apache.isis.commons.internal.base._Blackhole;
+import org.apache.isis.commons.internal.cdi._CDI;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.resources._Resources;
 import org.apache.isis.config.AppConfigLocator;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.webapp.modules.WebModule;
 import org.apache.isis.core.webapp.modules.WebModuleContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import lombok.val;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 
@@ -52,12 +56,13 @@ import org.slf4j.LoggerFactory;
  * @since 2.0.0-M2
  *
  */
-//@WebListener //[ahuber] to support Servlet 3.0 annotations @WebFilter, @WebListener or others 
+@WebListener //[ahuber] to support Servlet 3.0 annotations @WebFilter, @WebListener or others 
 //with skinny war deployment requires additional configuration, so for now we disable this annotation
+// ... but enabled for now, because we are running into this issue
+// https://stackoverflow.com/questions/44389716/spring-boot-embedded-tomcat-weblistener-scanned-by-servletcomponentscan
+@Slf4j
 public class IsisWebAppContextListener implements ServletContextListener {
     
-    private static final Logger LOG = LoggerFactory.getLogger(IsisWebAppContextListener.class);
-    
     private final List<ServletContextListener> activeListeners = new ArrayList<>();
 
     // -- INTERFACE IMPLEMENTATION
@@ -65,30 +70,33 @@ public class IsisWebAppContextListener implements ServletContextListener {
     @Override
     public void contextInitialized(ServletContextEvent event) {
 
-        final ServletContext servletContext = event.getServletContext();
+        val servletContext = event.getServletContext();
         
         // set the ServletContext initializing thread as preliminary default until overridden by
         // IsisWicketApplication#init() or others that better know what ClassLoader to use as application default.
         _Context.setDefaultClassLoader(Thread.currentThread().getContextClassLoader(), false);
         _Context.putSingleton(ServletContext.class, servletContext);
-        putContextPathIfPresent(servletContext.getContextPath());
+        _Resources.putContextPathIfPresent(servletContext.getContextPath());
         
-        LOG.info("=== PHASE 1 === Setting up IoC from AppManifest");
+        log.info("=== PHASE 1/3 === Setting up embedded CDI");
         
         // finalize the config (build and regard immutable)
         // as a side-effect bootstrap CDI, if the environment we are running on does not already have its own 
         _Blackhole.consume(AppConfigLocator.getAppConfig());
         
-        LOG.info("=== PHASE 2 === Preparing the ServletContext");
+        // expected post-condition: a BeanManager should be available
+        _Blackhole.consume(_CDI.getBeanManager());
+        
+        log.info("=== PHASE 2/3 === Preparing the ServletContext");
         
-        final WebModuleContext webModuleContext = new WebModuleContext(servletContext);
+        val webModuleContext = new WebModuleContext(servletContext);
         
         final List<WebModule> webModules =
                  WebModule.discoverWebModules()
                  .peek(module->module.prepare(webModuleContext)) // prepare context
                  .collect(Collectors.toList());
 
-        LOG.info("=== PHASE 3 === Initializing the ServletContext");
+        log.info("=== PHASE 3/3 === Initializing the ServletContext");
         
         webModules.stream()
         .filter(module->module.isApplicable(webModuleContext)) // filter those WebModules that are applicable
@@ -96,26 +104,26 @@ public class IsisWebAppContextListener implements ServletContextListener {
         
         activeListeners.forEach(listener->listener.contextInitialized(event));
         
-        LOG.info("=== DONE === ServletContext initialized.");
+        log.info("=== DONE === ServletContext initialized.");
     }
 
     @Override
     public void contextDestroyed(ServletContextEvent event) {
-        LOG.info("=== SHUTDOWN === Shutting down ServletContext");
+        log.info("=== SHUTDOWN === Shutting down ServletContext");
         activeListeners.forEach(listener->shutdownListener(event, listener));
         activeListeners.clear();
         IsisContext.clear();
-        LOG.info("=== DESTROYED === ServletContext destroyed");
+        log.info("=== DESTROYED === ServletContext destroyed");
     }
     
     // -- HELPER
     
     private void addListener(ServletContext context, WebModule module) {
-        LOG.info(String.format("Setup ServletContext, adding WebModule '%s'", module.getName()));
+        log.info(String.format("Setup ServletContext, adding WebModule '%s'", module.getName()));
         try {
             acceptIfPresent(module.init(context), activeListeners::add);
         } catch (ServletException e) {
-            LOG.error(String.format("Failed to add WebModule '%s' to the ServletContext.", module.getName()), e);
+            log.error(String.format("Failed to add WebModule '%s' to the ServletContext.", module.getName()), e);
         }  
     }
     
@@ -123,7 +131,7 @@ public class IsisWebAppContextListener implements ServletContextListener {
         try {
             listener.contextDestroyed(event);
         } catch (Exception e) {
-            LOG.error(String.format("Failed to shutdown WebListener '%s'.", listener.getClass().getName()), e);
+            log.error(String.format("Failed to shutdown WebListener '%s'.", listener.getClass().getName()), e);
         }
     }
 
diff --git a/core/config/src/main/java/org/apache/isis/config/services/view/ConfigurationViewServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/confmenu/ConfigurationViewServiceDefault.java
similarity index 97%
rename from core/config/src/main/java/org/apache/isis/config/services/view/ConfigurationViewServiceDefault.java
rename to core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/confmenu/ConfigurationViewServiceDefault.java
index eb2f484..895bf06 100644
--- a/core/config/src/main/java/org/apache/isis/config/services/view/ConfigurationViewServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/confmenu/ConfigurationViewServiceDefault.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.config.services.view;
+package org.apache.isis.core.runtime.services.confmenu;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java
index 3017ae8..eade1ca 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java
@@ -28,17 +28,14 @@ import org.apache.isis.applib.services.i18n.LocaleProvider;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.i18n.TranslationsResolver;
 import org.apache.isis.commons.internal.context._Context;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import lombok.AccessLevel;
 import lombok.Getter;
 
 @ApplicationScoped //FIXME [2033] cannot provision with @Singleton
+//@Slf4j
 public class TranslationServicePo implements TranslationService {
 
-    public static Logger LOG = LoggerFactory.getLogger(TranslationServicePo.class);
-
     public static final String KEY_PO_MODE = "isis.services.translation.po.mode";
 
     /**
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
index 91aabd1..097d092 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
@@ -30,7 +30,6 @@ import javax.enterprise.inject.Any;
 import javax.enterprise.inject.Instance;
 import javax.inject.Inject;
 
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.PublishingChangeKind;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
@@ -55,7 +54,6 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
 
 
     @Override
-    @Programmatic
     public void publishObjects() {
 
         if(suppress) {
@@ -109,7 +107,6 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
 
 
     @Override
-    @Programmatic
     public void publishAction(final Interaction.Execution<?,?> execution) {
 
         if(suppress) {
@@ -145,7 +142,6 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
 
     boolean suppress;
 
-    @Programmatic
     @Override
     public <T> T withPublishingSuppressed(final Block<T> block) {
         try {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
index 5b218d3..08b600e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
@@ -26,22 +26,21 @@ import org.apache.isis.applib.fixtures.FixtureType;
 import org.apache.isis.applib.fixtures.InstallableFixture;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstalledEvent;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstallingEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.lang.ObjectExtensions;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.context.session.RuntimeEventService;
 import org.apache.isis.core.runtime.system.session.IsisSession;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public class FixturesInstallerDelegate {
+import lombok.val;
+import lombok.extern.slf4j.Slf4j;
 
-    private static final Logger LOG = LoggerFactory.getLogger(FixturesInstallerDelegate.class);
+@Slf4j
+public class FixturesInstallerDelegate {
 
     // -- Constructor, fields
 
@@ -86,17 +85,17 @@ public class FixturesInstallerDelegate {
      * reused across multiple tests (REVIEW: does that make sense?)
      */
     public void installFixtures() {
-        final IsisConfiguration configuration = getConfiguration();
-        final boolean fireEvents = configuration.getBoolean("isis.fixtures.fireEvents", true);
-        final EventBusService eventBusService = getEventBusService();
+        val configuration = getConfiguration();
+        val fireEvents = configuration.getBoolean("isis.fixtures.fireEvents", true);
+        val eventService = getRuntimeEventService();
         try {
             if(fireEvents) {
-                eventBusService.post(new FixturesInstallingEvent(this));
+            	eventService.fireFixturesInstalling(new FixturesInstallingEvent(this));
             }
             installFixtures(getFixtures());
         } finally {
             if(fireEvents) {
-                eventBusService.post(new FixturesInstalledEvent(this));
+            	eventService.fireFixturesInstalled(new FixturesInstalledEvent(this));
             }
         }
     }
@@ -116,17 +115,17 @@ public class FixturesInstallerDelegate {
 
         // now, install the fixture itself
         try {
-            LOG.info("installing fixture: {}", fixture);
+            log.info("installing fixture: {}", fixture);
             getTransactionManager().startTransaction();
             installFixture(fixture);
             getTransactionManager().endTransaction();
-            LOG.info("fixture installed");
+            log.info("fixture installed");
         } catch (final RuntimeException e) {
-            LOG.error("installing fixture {} failed; aborting ", fixture.getClass().getName() , e);
+            log.error("installing fixture {} failed; aborting ", fixture.getClass().getName() , e);
             try {
                 getTransactionManager().abortTransaction();
             } catch (final Exception e2) {
-                LOG.error("failure during abort", e2);
+                log.error("failure during abort", e2);
             }
             throw e;
         }
@@ -162,8 +161,8 @@ public class FixturesInstallerDelegate {
         return IsisContext.getServiceInjector();
     }
 
-    private EventBusService getEventBusService() {
-        return IsisContext.getServiceRegistry().lookupServiceElseFail(EventBusService.class);
+    private RuntimeEventService getRuntimeEventService() {
+        return IsisContext.getServiceRegistry().lookupServiceElseFail(RuntimeEventService.class);
     }
 
     private IsisTransactionManager getTransactionManager() {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
index 3b251c3..de1e873 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
@@ -152,7 +152,7 @@ public interface IsisContext {
      * @throws NoSuchElementException - if SpecificationLoader not managed
      */
     public static SpecificationLoader getSpecificationLoader() {
-        return _CDI.getSingleton(SpecificationLoader.class);
+        return _CDI.getSingletonElseFail(SpecificationLoader.class);
     }
 
     /**
@@ -160,7 +160,7 @@ public interface IsisContext {
      * @throws NoSuchElementException - if ServicesInjector not managed
      */
     public static ServiceInjector getServiceInjector() {
-        return _CDI.getSingleton(ServiceInjector.class);
+        return _CDI.getSingletonElseFail(ServiceInjector.class);
     }
     
     /**
@@ -168,7 +168,7 @@ public interface IsisContext {
      * @throws NoSuchElementException - if ServiceRegistry not managed
      */
     public static ServiceRegistry getServiceRegistry() {
-        return _CDI.getSingleton(ServiceRegistry.class);
+        return _CDI.getSingletonElseFail(ServiceRegistry.class);
     }
     
     /**
@@ -176,7 +176,7 @@ public interface IsisContext {
      * @throws NoSuchElementException - if IsisSessionFactory not resolvable
      */
     public static IsisSessionFactory getSessionFactory() {
-        return _CDI.getSingleton(IsisSessionFactory.class);
+        return _CDI.getSingletonElseFail(IsisSessionFactory.class);
     }
     
     /**
@@ -211,7 +211,7 @@ public interface IsisContext {
      * @throws NoSuchElementException - if ServiceRegistry not managed
      */
     public static ObjectAdapterProvider getObjectAdapterProvider() {
-        return _CDI.getSingleton(ObjectAdapterService.class);
+        return _CDI.getSingletonElseFail(ObjectAdapterService.class);
     }
     
     public static Function<Object, ObjectAdapter> pojoToAdapter() {
@@ -232,11 +232,11 @@ public interface IsisContext {
     }
 
     public static AuthenticationManager getAuthenticationManager() {
-        return _CDI.getSingleton(AuthenticationManager.class);
+        return _CDI.getSingletonElseFail(AuthenticationManager.class);
     }
 
     public static AuthorizationManager getAuthorizationManager() {
-        return _CDI.getSingleton(AuthorizationManager.class);
+        return _CDI.getSingletonElseFail(AuthorizationManager.class);
     }
     
     // -- 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ManagedObjectResolver.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ManagedObjectResolver.java
index 02a4f84..23312af 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ManagedObjectResolver.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ManagedObjectResolver.java
@@ -3,8 +3,7 @@ package org.apache.isis.core.runtime.system.context.managers;
 import java.net.URI;
 import java.util.Optional;
 
-import javax.enterprise.inject.Instance;
-
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.metamodel.adapter.oid.UniversalOid;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjectState;
@@ -41,7 +40,7 @@ public interface ManagedObjectResolver {
 	 * @param uri
 	 * @return
 	 */
-	Instance<ManagedObject> resolve(ObjectSpecId specId, URI uri);
+	Bin<ManagedObject> resolve(ObjectSpecId specId, URI uri);
 	
 	
 	/**
@@ -50,7 +49,7 @@ public interface ManagedObjectResolver {
 	 * @param universalOid
 	 * @return reference to the ManagedObject as identified by the universalOid
 	 */
-	default Instance<ManagedObject> resolve(UniversalOid universalOid) {
+	default Bin<ManagedObject> resolve(UniversalOid universalOid) {
 		val spec = universalOid.getObjectSpecId();
 		return resolve(spec, universalOid.getObjectUri());
 	}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalContextManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalContextManager.java
index 588d23e..a961c6f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalContextManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalContextManager.java
@@ -10,6 +10,7 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjectState;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -41,7 +42,7 @@ public class UniversalContextManager implements ContextManager {
 	}
 
 	@Override
-	public Instance<ManagedObject> resolve(ObjectSpecId specId, URI identifier) {
+	public Bin<ManagedObject> resolve(ObjectSpecId specId, URI identifier) {
 		
 		requires(identifier, "identifier");
 		
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalObjectManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalObjectManager.java
index 7c214f5..f51d413 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalObjectManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalObjectManager.java
@@ -112,15 +112,15 @@ public interface UniversalObjectManager {
 		@Override
 		public ObjectAdapter resolve(URI objectUri) {
 			val contextManager = this.contextManager.get();
-			val instance = contextManager.resolve(UniversalOid.of(objectUri));
+			val bin = contextManager.resolve(UniversalOid.of(objectUri));
 			
-    		if(instance.isResolvable()) {
-    			val managedObject = instance.get();
+    		if(bin.isCardinalityOne()) {
+    			val managedObject = bin.getSingleton().get();
     			val isisSession = IsisSession.currentIfAny();
     			
     			return ResolveResult.of(objectUri, managedObject).toObjectAdapter(isisSession);
     			
-    		} else if(instance.isAmbiguous()) {
+    		} else if(bin.isCardinalityMultiple()) {
     			
     			//FIXME [2033] handle ambiguity
     			throw _Exceptions.notImplemented();
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/MixinContextManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/MixinContextManager.java
index 181b85b..264cea4 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/MixinContextManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/MixinContextManager.java
@@ -4,19 +4,17 @@ import java.lang.reflect.Array;
 import java.lang.reflect.Modifier;
 import java.net.URI;
 import java.util.Optional;
-import java.util.UUID;
 
 import javax.annotation.PostConstruct;
-import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.Vetoed;
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.uri._URI.ContainerType;
 import org.apache.isis.commons.internal.uri._URI.ContextType;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.PersistableTypeGuard;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -70,7 +68,7 @@ public class MixinContextManager implements ContextHandler {
 	}
 
 	@Override
-	public Instance<ManagedObject> resolve(ObjectSpecId specId, URI objectUri) {
+	public Bin<ManagedObject> resolve(ObjectSpecId specId, URI objectUri) {
 		
 		throw _Exceptions.notImplemented();
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/ValueContextManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/ValueContextManager.java
index ef14cdf..aef7417 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/ValueContextManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/ValueContextManager.java
@@ -5,20 +5,19 @@ import java.net.URI;
 import java.util.Optional;
 
 import javax.annotation.PostConstruct;
-import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.Vetoed;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.services.urlencoding.UrlEncodingService;
 import org.apache.isis.applib.services.urlencoding.UrlEncodingServiceWithCompression;
 import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.commons.internal.cdi._CDI;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.memento._Mementos;
 import org.apache.isis.commons.internal.memento._Mementos.SerializingAdapter;
 import org.apache.isis.commons.internal.uri._URI.ContainerType;
 import org.apache.isis.commons.internal.uri._URI.ContextType;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObject.SimpleManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjectState;
@@ -74,7 +73,7 @@ public class ValueContextManager implements ContextHandler {
 	}
 
 	@Override
-	public Instance<ManagedObject> resolve(ObjectSpecId specId, URI objectUri) {
+	public Bin<ManagedObject> resolve(ObjectSpecId specId, URI objectUri) {
 		
 		val serialized = objectUri.getQuery();
 		val spec = specLoader.lookupBySpecId(specId);
@@ -98,7 +97,7 @@ public class ValueContextManager implements ContextHandler {
 		
 			val value = parseMemento(serialized).get("val", expectedType);
 			val managedObject = SimpleManagedObject.of(spec, value);
-			return _CDI.InstanceFactory.singleton(managedObject);
+			return Bin.ofSingleton(managedObject);
 			
 		} catch (Exception cause) {
 			val errMsg = String.format("Failed to deserialize memento (container) holding expected type '%s' <- '%s'.",
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/ViewModelContextManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/ViewModelContextManager.java
index 0d133d6..d6ccc8d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/ViewModelContextManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/builtin/ViewModelContextManager.java
@@ -14,6 +14,7 @@ import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.uri._URI.ContainerType;
 import org.apache.isis.commons.internal.uri._URI.ContextType;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.PersistableTypeGuard;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -72,7 +73,7 @@ public class ViewModelContextManager implements ContextHandler {
 	}
 
 	@Override
-	public Instance<ManagedObject> resolve(ObjectSpecId specId, URI objectUri) {
+	public Bin<ManagedObject> resolve(ObjectSpecId specId, URI objectUri) {
 
 		val serialized = objectUri.getQuery();
 		val spec = specLoader.lookupBySpecId(specId);
@@ -89,7 +90,7 @@ public class ViewModelContextManager implements ContextHandler {
 
 		val managedObject = SimpleManagedObject.of(spec, viewModelPojo);
 
-		return _CDI.InstanceFactory.singleton(managedObject);
+		return Bin.ofSingleton(managedObject);
 	}
 
 	@Override
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/cdi/CDIContextManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/cdi/CDIContextManager.java
index 3957b18..79bb4a9 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/cdi/CDIContextManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/cdi/CDIContextManager.java
@@ -4,16 +4,15 @@ import java.net.URI;
 import java.util.Optional;
 
 import javax.annotation.PostConstruct;
-import javax.enterprise.inject.Instance;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal._Constants;
-import org.apache.isis.commons.internal.cdi._CDI;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.uri._URI.ContainerType;
 import org.apache.isis.commons.internal.uri._URI.ContextType;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObject.SimpleManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjectState;
@@ -63,21 +62,20 @@ public class CDIContextManager implements ContextHandler {
 	}
 
 	@Override
-	public Instance<ManagedObject> resolve(ObjectSpecId specId, URI objectUri) {
+	public Bin<ManagedObject> resolve(ObjectSpecId specId, URI objectUri) {
 		
 		val spec = specLoader.lookupBySpecId(specId);
 		val id = objectUri.getQuery(); 
 		//TODO [2033] future extension ... to refine, convert id to qualifiers
 		val qualifiers = _Constants.emptyAnnotations;
 		
-		val instance = serviceRegistry.getInstance(spec.getCorrespondingClass(), qualifiers);
+		val bin = serviceRegistry.select(spec.getCorrespondingClass(), qualifiers);
 		
 		probe.println("resolve spec='%s' -> '%s'", 
         		spec.getSpecId().asString(),
-        		instance);
+        		bin);
 		
-		return _CDI.InstanceFactory.mapElements(instance, 
-		        beanPojo->SimpleManagedObject.of(spec, beanPojo));
+		return bin.map(beanPojo->SimpleManagedObject.of(spec, beanPojo));
 	}
 
 	@Override
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventService.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventService.java
index 149c89d..6089a8a 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventService.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventService.java
@@ -4,6 +4,9 @@ import javax.enterprise.event.Event;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.apache.isis.applib.events.ui.CssClassUiEvent;
+import org.apache.isis.applib.fixturescripts.events.FixturesInstalledEvent;
+import org.apache.isis.applib.fixturescripts.events.FixturesInstallingEvent;
 import org.apache.isis.core.runtime.system.session.IsisSession;
 
 import lombok.Getter;
@@ -17,39 +20,57 @@ import lombok.Value;
 @Singleton
 public class RuntimeEventService {
 
-	@Inject Event<AppLifecycleEvent> appLifecycleEvent;
-	@Inject Event<SessionLifecycleEvent> sessionLifecycleEvent;
+	@Inject Event<AppLifecycleEvent> appLifecycleEvents;
+	@Inject Event<SessionLifecycleEvent> sessionLifecycleEvents;
+	@Inject Event<FixturesInstallingEvent> fixturesInstallingEvents;
+    @Inject Event<FixturesInstalledEvent> fixturesInstalledEvents;
 	
 	// -- APP
 	
 	public void fireAppPreMetamodel() {
-		appLifecycleEvent.fire(AppLifecycleEvent.of(AppLifecycleEvent.EventType.appPreMetamodel));
+		appLifecycleEvents.fire(AppLifecycleEvent.of(AppLifecycleEvent.EventType.appPreMetamodel));
 	}
 	
 	public void fireAppPostMetamodel() {
-		appLifecycleEvent.fire(AppLifecycleEvent.of(AppLifecycleEvent.EventType.appPostMetamodel));
+		appLifecycleEvents.fire(AppLifecycleEvent.of(AppLifecycleEvent.EventType.appPostMetamodel));
 	}
 	
 	public void fireAppPreDestroy() {
-		appLifecycleEvent.fire(AppLifecycleEvent.of(AppLifecycleEvent.EventType.appPreDestroy));
+		appLifecycleEvents.fire(AppLifecycleEvent.of(AppLifecycleEvent.EventType.appPreDestroy));
 	}
 	
 	// -- SESSION
 	
 	public void fireSessionOpened(IsisSession session) {
-		sessionLifecycleEvent.fire(SessionLifecycleEvent.of(session, SessionLifecycleEvent.EventType.sessionOpened));
+		sessionLifecycleEvents.fire(SessionLifecycleEvent.of(session, SessionLifecycleEvent.EventType.sessionOpened));
 	}
 	
 	public void fireSessionClosing(IsisSession session) {
-		sessionLifecycleEvent.fire(SessionLifecycleEvent.of(session, SessionLifecycleEvent.EventType.sessionClosing));
+		sessionLifecycleEvents.fire(SessionLifecycleEvent.of(session, SessionLifecycleEvent.EventType.sessionClosing));
 	}
 	
 //	public void fireSessionFlushing(IsisSession session) {
 //		sessionLifecycleEvent.fire(SessionLifecycleEvent.of(session, SessionLifecycleEvent.EventType.sessionClosing));
 //	}
 
+	// -- FIXTURES
 	
-	// -- EVENT CLASSES
+	public void fireFixturesInstalling(FixturesInstallingEvent fixturesInstallingEvent) {
+		fixturesInstallingEvents.fire(fixturesInstallingEvent);
+	}
+
+	public void fireFixturesInstalled(FixturesInstalledEvent fixturesInstalledEvent) {
+		fixturesInstalledEvents.fire(fixturesInstalledEvent);
+	}
+	
+	// -- METAMODEL EVENTS
+	
+	public void fireCssClassUiEvent(CssClassUiEvent<Object> cssClassUiEvent) {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	// -- APP EVENT CLASSES
 	
 	@Value(staticConstructor="of")
 	public static class AppLifecycleEvent {
@@ -65,6 +86,10 @@ public class RuntimeEventService {
 	}
 
 	
+
+
+
+	
 	
 	
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
index 8ef6652..15c58bd 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
@@ -21,11 +21,11 @@ package org.apache.isis.core.runtime.system.session;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
 import java.util.stream.Stream;
 
 import javax.annotation.PreDestroy;
-import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.Vetoed;
 import javax.inject.Inject;
 
@@ -37,6 +37,7 @@ import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.commons.internal.base._Blackhole;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.ServiceInitializer;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -154,8 +155,9 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
             final Stream<Object> domainServices = serviceRegistry.streamRegisteredBeans()
                     .filter(BeanAdapter::isDomainService)
                     .map(BeanAdapter::getInstance)
-                    .filter(Instance::isResolvable)
-                    .map(Instance::get)
+                    .filter(Bin::isCardinalityOne)
+                    .map(Bin::getSingleton)
+                    .map(Optional::get)
                     ;
             
             domainServices.forEach(domainService->{
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
index b635eaa..596e63d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
@@ -23,14 +23,13 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 
-import javax.enterprise.inject.Instance;
-
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.xactn.Transaction;
 import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.commons.components.TransactionScopedComponent;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.util.ToString;
@@ -156,7 +155,7 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
     private final PublishingServiceInternal publishingServiceInternal;
     private final AuditingServiceInternal auditingServiceInternal;
 
-    private final Instance<WithTransactionScope> withTransactionScopes;
+    private final Bin<WithTransactionScope> withTransactionScopes;
 
     private IsisException abortCause;
 
@@ -178,7 +177,7 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
         this.auditingServiceInternal = serviceRegistry.lookupServiceElseFail(AuditingServiceInternal.class);
 
         withTransactionScopes = serviceRegistry
-                .getInstance(WithTransactionScope.class);
+                .select(WithTransactionScope.class);
 
         this.state = State.IN_PROGRESS;
 
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index dd00cae..f08ad91 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -41,10 +41,8 @@ import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.resources._Resources;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.internal._Config;
-import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettingsAccessor;
@@ -176,7 +174,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
 //    @Inject private ImageResourceCache imageCache;
 //    @Inject private WicketViewerSettings wicketViewerSettings;
     @Inject private PageClassRegistry pageClassRegistry;
-    @Inject private IsisSessionFactory isisSessionFactory;
+//    @Inject private IsisSessionFactory isisSessionFactory;
     @Inject private WicketViewerSettings settings;
     
     private final IsisWicketApplication_Experimental experimental;
@@ -261,7 +259,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
 //            initWicketComponentInjection(injector);
 //            
 //            injector.injectMembers(this); // populates this.isisSessionFactory
-            Ensure.ensure("IsisSessionFactory should have been injected.", this.isisSessionFactory != null);
+//            Ensure.ensure("IsisSessionFactory should have been injected.", this.isisSessionFactory != null);
             
             if (requestCycleListenerForIsis instanceof WebRequestCycleForIsis) {
                 WebRequestCycleForIsis webRequestCycleForIsis = (WebRequestCycleForIsis) requestCycleListenerForIsis;
@@ -628,9 +626,9 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
     @Override
     protected void onDestroy() {
         try {
-            if (isisSessionFactory != null) {
-                isisSessionFactory.destroyServicesAndShutdown();
-            }
+//            if (isisSessionFactory != null) {
+//                isisSessionFactory.destroyServicesAndShutdown();
+//            }
             super.onDestroy();
             IsisContext.clear();
         } catch(final RuntimeException ex) {
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java
index 6d984b2..a383516 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java
@@ -91,7 +91,7 @@ public class WebRequestCycleForIsis implements IRequestCycleListener {
     private final static _Probe probe = _Probe.unlimited().label("WebRequestCycleForIsis");
     
     private _Lazy<RequestContextService> requestContextService = _Lazy.of(()->
-        _CDI.getSingleton(RequestContextService.class));
+        _CDI.getSingletonElseFail(RequestContextService.class));
     
     public final static MetaDataKey<RequestContextHandle> REQUEST_CONTEXT_HANDLE_KEY 
         = new MetaDataKey<RequestContextHandle>() {
@@ -242,7 +242,7 @@ public class WebRequestCycleForIsis implements IRequestCycleListener {
 
             // handle recognized exceptions gracefully also
             final Stream<ExceptionRecognizer> exceptionRecognizers = getServiceRegistry()
-                    .getInstance(ExceptionRecognizer.class)
+                    .select(ExceptionRecognizer.class)
                     .stream();
             
             String recognizedMessageIfAny = new ExceptionRecognizerComposite(exceptionRecognizers).recognize(ex);
@@ -324,8 +324,7 @@ public class WebRequestCycleForIsis implements IRequestCycleListener {
 
         if(inIsisSession()) {
             getServiceRegistry()
-                    .getInstance(ExceptionRecognizer.class)
-                    .stream()
+                    .select(ExceptionRecognizer.class)
                     .forEach(exceptionRecognizers::add);
         } else {
             val metaModelDeficiencies = IsisContext.getMetaModelDeficienciesIfAny();
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 9e2ae6f..d2baeeb 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -471,7 +471,7 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements For
         PersistableTypeGuard2.instate(resultAdapter);
         
         final Stream<RoutingService> routingServices = getServiceRegistry()
-                .getInstance(RoutingService.class)
+                .select(RoutingService.class)
                 .stream();
         
         final Object resultPojo = resultAdapter != null ? resultAdapter.getPojo() : null;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index d669b2d..287382c 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -28,19 +28,12 @@ import java.util.Map;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
-import javax.enterprise.inject.Instance;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
-import org.apache.wicket.model.Model;
-
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.grid.Grid;
 import org.apache.isis.applib.services.tablecol.TableColumnOrderService;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.core.commons.collections.Bin;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -63,6 +56,11 @@ import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterTitleColumn;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterToggleboxColumn;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.model.Model;
 
 /**
  * {@link PanelAbstract Panel} that represents a {@link EntityCollectionModel
@@ -244,8 +242,8 @@ extends PanelAbstract<EntityCollectionModel> implements CollectionCountProvider
         }
         
         // optional SPI to reorder
-        final Instance<TableColumnOrderService> tableColumnOrderServices =
-                getServiceRegistry().getInstance(TableColumnOrderService.class);
+        final Bin<TableColumnOrderService> tableColumnOrderServices =
+                getServiceRegistry().select(TableColumnOrderService.class);
 
         for (final TableColumnOrderService tableColumnOrderService : tableColumnOrderServices) {
             final List<String> propertyReorderedIds = reordered(tableColumnOrderService, propertyIds);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 5f4a5ed..b309e63 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -209,7 +209,7 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
 
             // REVIEW: similar code in WebRequestCycleForIsis
             final Stream<ExceptionRecognizer> exceptionRecognizers = getServiceRegistry()
-                    .getInstance(ExceptionRecognizer.class)
+                    .select(ExceptionRecognizer.class)
                     .stream();
                     
             final String recognizedMessageIfAny = new ExceptionRecognizerComposite(exceptionRecognizers).recognize(ex);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index 6434a6b..90c2473 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -486,7 +486,7 @@ implements FormExecutor {
         // see if the exception is recognized as being a non-serious error
         // (nb: similar code in WebRequestCycleForIsis, as a fallback)
         final Stream<ExceptionRecognizer> exceptionRecognizers = getServiceRegistry()
-                .getInstance(ExceptionRecognizer.class)
+                .select(ExceptionRecognizer.class)
                 .stream();
         String recognizedErrorIfAny = new ExceptionRecognizerComposite(exceptionRecognizers).recognize(ex);
         if (recognizedErrorIfAny != null) {
diff --git a/example/application/springapp/pom.xml b/example/application/springapp/pom.xml
index 26ce268..1bbccae 100644
--- a/example/application/springapp/pom.xml
+++ b/example/application/springapp/pom.xml
@@ -140,6 +140,12 @@
 
 		<!-- OTHER DEPENDENCIES -->
 
+		<dependency> <!-- TODO [2033] as long as isis depends on it we need to package it -->
+            <groupId>javax.jdo</groupId>
+            <artifactId>jdo-api</artifactId>
+            <version>3.1</version>
+        </dependency>
+
 		<dependency>
 			<groupId>com.h2database</groupId>
 			<artifactId>h2</artifactId>
diff --git a/example/application/springapp/src/main/java/isis/incubator/BeanScanInterceptorForSpring.java b/example/application/springapp/src/main/java/isis/incubator/BeanScanInterceptorForSpring.java
index ac1fba3..6168617 100644
--- a/example/application/springapp/src/main/java/isis/incubator/BeanScanInterceptorForSpring.java
+++ b/example/application/springapp/src/main/java/isis/incubator/BeanScanInterceptorForSpring.java
@@ -2,13 +2,12 @@ package isis.incubator;
 
 import java.io.IOException;
 
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+import org.apache.isis.config.registry.TypeMetaData;
 import org.springframework.core.type.classreading.MetadataReader;
 import org.springframework.core.type.classreading.MetadataReaderFactory;
 import org.springframework.core.type.filter.TypeFilter;
 
-import org.apache.isis.config.registry.BeanTypeRegistry;
-import org.apache.isis.config.registry.TypeMetaData;
-
 import lombok.Getter;
 import lombok.val;
 import lombok.extern.slf4j.Slf4j;
@@ -16,7 +15,7 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public class BeanScanInterceptorForSpring implements TypeFilter {
 	
-	@Getter(lazy=true) private final BeanTypeRegistry typeRegistry = BeanTypeRegistry.current();
+	@Getter(lazy=true) private final IsisBeanTypeRegistry typeRegistry = IsisBeanTypeRegistry.current();
 
 	@Override
 	public boolean match(
@@ -29,7 +28,7 @@ public class BeanScanInterceptorForSpring implements TypeFilter {
 			return false;
 		}
 		
-		if(log.isInfoEnabled()) log.info("scanning concrete type {}", classMetadata.getClassName());
+		if(log.isDebugEnabled()) log.debug("scanning concrete type {}", classMetadata.getClassName());
 		
 		val annotationMetadata = metadataReader.getAnnotationMetadata();
 		val annotationTypes = annotationMetadata.getAnnotationTypes();
diff --git a/example/application/springapp/src/main/java/isis/incubator/IsisBoot.java b/example/application/springapp/src/main/java/isis/incubator/IsisBoot.java
index 30d1e95..ccab27f 100644
--- a/example/application/springapp/src/main/java/isis/incubator/IsisBoot.java
+++ b/example/application/springapp/src/main/java/isis/incubator/IsisBoot.java
@@ -1,5 +1,19 @@
 package isis.incubator;
 
+import java.util.List;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.IsisApplibModule;
+import org.apache.isis.commons.internal.cdi._CDI;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.config.AppConfig;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+import org.apache.isis.core.metamodel.MetamodelModule;
+import org.apache.isis.core.runtime.RuntimeModule;
+import org.apache.isis.core.runtime.services.RuntimeServicesModule;
+import org.apache.isis.core.runtime.services.i18n.po.TranslationServicePo;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
@@ -8,33 +22,47 @@ import org.springframework.context.annotation.ComponentScan.Filter;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.FilterType;
 
-import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.config.AppConfig;
-import org.apache.isis.core.runtime.RuntimeModule;
-
 import lombok.val;
 import springapp.boot.web.SpringAppManifest;
 
 @Configuration 
-@ComponentScan(basePackageClasses={RuntimeModule.class}, includeFilters= {
-		@Filter(type = FilterType.CUSTOM, classes= {BeanScanInterceptorForSpring.class})
+@ComponentScan(
+		basePackageClasses= {
+				IsisApplibModule.class,
+				MetamodelModule.class,
+				RuntimeModule.class,
+				RuntimeServicesModule.class},
+		includeFilters= {
+				@Filter(type = FilterType.CUSTOM, classes= {BeanScanInterceptorForSpring.class})
 		})
 public class IsisBoot implements ApplicationContextAware {
+	
+	//TODO @Autowired AppConfig appConfig;
 
 	@Override
 	public void setApplicationContext(ApplicationContext springContext) throws BeansException {
 	    
-	    // TODO put AppConfig onto the _Context
-	    
 	    val appConfig = new SpringAppManifest();
 	    
 	    System.out.println("!!!!!!!!!!!!!!!!!!! finalizing config");
 	    appConfig.isisConfiguration();
 	    System.out.println("!!!!!!!!!!!!!!!!!!! finalized config");
 	    
-	    
 	    _Context.putSingleton(AppConfig.class, appConfig);
 	    
+	    // init CDI
+	    _CDI.init(()->
+	    	Stream.concat(
+	    			Stream.of(
+	    					appConfig.getClass(),
+	    					TranslationServicePo.class //FIXME [2033] cannot provision with @Singleton
+	    					),
+	    			IsisBeanTypeRegistry.current().streamCdiManaged())
+	    );
+	    
+	    System.out.println("!!!!!!!!!!!!!!!!!!! verify core services");
+	    verifyCoreServices();
+	    
 		// TODO Auto-generated method stub
 		System.out.println("!!!!!!!!!!!!!!!!!!! TODO bootstrap isis from context");
 		
@@ -52,10 +80,53 @@ public class IsisBoot implements ApplicationContextAware {
 		
 	}
 	
-//	@Bean 
-//	public AppConfig appConfig() {
-//        return AppConfig.empty();
-//	}
+	private final List<Class<?>> coreServices = _Lists.of(
+			
+			org.apache.isis.config.IsisConfiguration.class,
+			org.apache.isis.applib.services.registry.ServiceRegistry.class, 
+			org.apache.isis.core.runtime.system.session.IsisSessionFactory.class, 
+
+			org.apache.isis.core.security.authentication.manager.AuthenticationManager.class, 
+			org.apache.isis.core.security.authorization.manager.AuthorizationManager.class,
+			org.apache.isis.core.security.authentication.AuthenticationSessionProvider.class,
+
+			org.apache.isis.core.metamodel.specloader.SpecificationLoader.class,
+
+			//org.apache.isis.applib.services.eventbus.EventBusService.class,
+			org.apache.isis.applib.services.factory.FactoryService.class,
+
+			org.apache.isis.applib.services.i18n.LocaleProvider.class,
+			org.apache.isis.applib.services.i18n.TranslationsResolver.class,
+			org.apache.isis.applib.services.i18n.TranslationService.class,
+			org.apache.isis.applib.services.message.MessageService.class,
+
+			org.apache.isis.applib.services.repository.RepositoryService.class,
+			org.apache.isis.applib.services.title.TitleService.class,
+			org.apache.isis.applib.services.user.UserService.class,
+			org.apache.isis.applib.services.xactn.TransactionService.class,
+
+			org.apache.isis.core.metamodel.services.persistsession.ObjectAdapterService.class,
+
+			org.apache.isis.applib.services.wrapper.WrapperFactory.class,
+			org.apache.isis.core.runtime.services.bookmarks.BookmarkServiceInternalDefault.class,
+
+			org.apache.isis.applib.services.homepage.HomePageProviderService.class
+			
+			);
+	
+	private void verifyCoreServices() {
+		
+		coreServices.stream()
+		.forEach(type->{
+			val beans = _CDI.select(type);
+			if(!beans.isCardinalityOne()) {
+				throw _Exceptions.unrecoverable("Core Service not known to CDI: " + type );
+			}
+		});
+		
+	}
+	
+
 	
 //	@Bean
 //	public SpecificationLoader specificationLoader(IsisSessionProducerBean isisSessionProducerBean) {
diff --git a/example/application/springapp/src/main/java/springapp/boot/web/SpringBootTomcatApplication.java b/example/application/springapp/src/main/java/springapp/boot/web/SpringBootTomcatApplication.java
index 2700c3f..07aef56 100644
--- a/example/application/springapp/src/main/java/springapp/boot/web/SpringBootTomcatApplication.java
+++ b/example/application/springapp/src/main/java/springapp/boot/web/SpringBootTomcatApplication.java
@@ -2,11 +2,6 @@ package springapp.boot.web;
 
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-import org.springframework.context.annotation.Bean;
-
-import org.apache.isis.core.runtime.threadpool.ThreadPoolExecutionMode;
-import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
-import org.apache.isis.core.webapp.IsisWebAppContextListener;
 
 import isis.incubator.IsisBoot;
 import springapp.dom.DomainModule;
@@ -14,14 +9,10 @@ import springapp.dom.DomainModule;
 @SpringBootApplication(scanBasePackageClasses= {DomainModule.class, IsisBoot.class})
 public class SpringBootTomcatApplication extends SpringBootServletInitializer {
 
-	@Bean
-	public IsisWebAppContextListener isisWebAppContextListener() {
-
-		ThreadPoolSupport.HIGHEST_CONCURRENCY_EXECUTION_MODE_ALLOWED = 
-				ThreadPoolExecutionMode.SEQUENTIAL_WITHIN_CALLING_THREAD;
-
-		return new IsisWebAppContextListener();
-	}
+//	@Bean
+//	public IsisWebAppContextListener isisWebAppContextListener() {
+//		return new IsisWebAppContextListener();
+//	}
 
 
 }
diff --git a/example/application/springapp/src/main/webapp/WEB-INF/shiro.ini b/example/application/springapp/src/main/webapp/WEB-INF/shiro.ini
new file mode 100644
index 0000000..bc52895
--- /dev/null
+++ b/example/application/springapp/src/main/webapp/WEB-INF/shiro.ini
@@ -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.
+#
+
+[main]
+
+
+# to use .ini file
+securityManager.realms = $iniRealm
+
+
+# -----------------------------------------------------------------------------
+# Users and their assigned roles
+#
+# Each line conforms to the format defined in the
+# org.apache.shiro.realm.text.TextConfigurationRealm#setUserDefinitions JavaDoc
+# -----------------------------------------------------------------------------
+
+[users]
+# user = password, role1, role2, role3, ...
+
+
+sven = pass, admin_role
+dick = pass, user_role
+bob  = pass, user_role
+joe  = pass, user_role
+
+
+
+# -----------------------------------------------------------------------------
+# Roles with assigned permissions
+# 
+# Each line conforms to the format defined in the
+# org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions JavaDoc
+# -----------------------------------------------------------------------------
+
+[roles]
+# role = perm1, perm2, perm3, ...
+# perm in format: packageName:className:memberName:r,w
+
+user_role =   *:HelloWorldObjects:*:*,\
+              *:HelloWorldObject:*:*
+admin_role = *