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/05/09 11:10:39 UTC

[isis] branch 2112_SpringBoot created (now 16e8097)

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

ahuber pushed a change to branch 2112_SpringBoot
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at 16e8097  ISIS-2112: backporting from '2033-IoC_Spring' branch

This branch includes the following new commits:

     new 16e8097  ISIS-2112: backporting from '2033-IoC_Spring' branch

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



[isis] 01/01: ISIS-2112: backporting from '2033-IoC_Spring' branch

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

ahuber pushed a commit to branch 2112_SpringBoot
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 16e80975e0126cc26c276b9891c1dae0054c7022
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed May 8 11:39:36 2019 +0200

    ISIS-2112: backporting from '2033-IoC_Spring' branch
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2112
---
 .../apache/isis/applib/fixtures/FixtureType.java   |   12 +-
 .../fixturescripts/BuilderScriptAbstract.java      |    2 +-
 .../isis/applib/fixturescripts/FixtureScript.java  |    6 +-
 .../isis/applib/fixturescripts/FixtureScripts.java |   10 +-
 .../isis/applib/metamodel/ManagedObjectSort.java   |   85 ++
 .../exceprecog/ExceptionRecognizerComposite.java   |    7 +-
 .../applib/services/inject/ServiceInjector.java}   |   19 +-
 .../applib/services/jaxb/JaxbServiceDefault.java   |   12 +-
 .../isis/applib/services/layout/LayoutService.java |   11 +-
 .../services/metamodel/MetaModelService.java       |   59 +-
 .../applib/services/registry/ServiceRegistry.java  |  177 +++-
 .../applib/services/xactn/TransactionService.java  |    3 +
 .../java/org/apache/isis/applib/value/Blob.java    |    3 +-
 .../java/org/apache/isis/applib/value/Clob.java    |    3 +-
 .../isis/applib/value/NamedWithMimeType.java       |    4 +-
 core/commons/pom.xml                               |  235 ++---
 .../isis/commons/internal/cdi/BeanAdapterCDI.java  |   55 +
 .../org/apache/isis/commons/internal/cdi/_CDI.java |  182 +++-
 .../commons/internal/spring/BeanAdapterSpring.java |   38 +
 .../isis/commons/internal/spring/_Spring.java      |  119 +++
 .../org/apache/isis/commons/ioc/BeanAdapter.java}  |   18 +-
 .../apache/isis/commons/ioc/LifecycleContext.java  |   23 +
 .../apache/isis/core/commons/collections/Bin.java  |   25 +-
 .../plugins/ioc/ConversationContextHandle.java}    |   18 +-
 .../plugins/ioc/ConversationContextService.java}   |   21 +-
 .../ioc/ConversationContextServiceDefault.java}    |   23 +-
 .../apache/isis/core/plugins/ioc/IocPlugin.java}   |   36 +-
 .../core/plugins/ioc/RequestContextHandle.java}    |   16 +-
 .../core/plugins/ioc/RequestContextService.java}   |   19 +-
 .../plugins/ioc/RequestContextServiceDefault.java} |   29 +-
 .../org/apache/isis/config/AppConfigLocator.java   |    2 +-
 .../apache/isis/config/beans/WebAppConfigBean.java |   24 +
 .../config/builder/IsisConfigurationBuilder.java   |    5 +
 .../isis/config/registry/IsisBeanTypeRegistry.java |  177 ++++
 .../apache/isis/config/registry/TypeMetaData.java  |   74 ++
 core/detached-tests/pom.xml                        |   15 +-
 .../ServiceInjectorTestUsingCodegenPlugin.java     |   22 +-
 .../ServiceInstantiatorTestUsingCodegenPlugin.java |    4 +-
 .../isis/testdomain/jdo/JdoTestDomainPersona.java  |    4 +-
 .../isis/testdomain/tests/AuditerServiceTest.java  |    4 +-
 .../isis/testdomain/tests/BootstrappingTest.java   |   10 +-
 .../testdomain/tests/PublisherServiceTest.java     |    7 +-
 core/integtestsupport/pom.xml                      |  290 +++---
 .../ExceptionRecognizerTranslate.java              |   16 +-
 .../HeadlessTransactionSupportDefault.java         |   16 +-
 .../scenarios/ObjectFactoryForIntegration.java     |    4 +-
 .../apache/isis/applib/DomainObjectContainer.java  |   10 +-
 .../isis/tool/mavenplugin/IsisMojoAbstract.java    |   21 +-
 .../isis/tool/mavenplugin/IsisMojoSwagger.java     |    4 +-
 .../isis/tool/mavenplugin/IsisMojoValidate.java    |    5 +-
 .../apache/isis/tool/mavenplugin/IsisMojoXsd.java  |    6 +-
 .../apache/isis/core/commons/lang/ClassUtil.java   |   17 +-
 .../isis/core/metamodel/MetaModelContext.java      |  194 ++++
 .../isis/core/metamodel/MetaModelContexts.java     |  229 +++++
 .../isis/core/metamodel/MetamodelModule.java       |    5 +
 .../isis/core/metamodel/adapter/ObjectAdapter.java |   44 +-
 .../metamodel/adapter/ObjectAdapterPredicate.java  |   12 +
 .../metamodel/adapter/ObjectAdapterProvider.java   |   39 +-
 .../isis/core/metamodel/adapter/oid/Oid.java       |    4 +
 .../isis/core/metamodel/adapter/oid/Oid_Root.java  |   11 +
 .../persistence/ObjectNotFoundException.java}      |   27 +-
 .../persistence/ObjectPersistenceException.java}   |   17 +-
 .../persistence/PojoRecreationException.java}      |   13 +-
 .../persistence/PojoRefreshException.java}         |   17 +-
 .../core/metamodel/facetapi/FacetAbstract.java     |   21 +-
 .../core/metamodel/facetapi/FacetHolderImpl.java   |    5 +-
 .../metamodel/facetapi/FacetWithAttributes.java    |    2 +
 .../core/metamodel/facetapi/MetaModelRefiner.java  |   22 +-
 .../facetapi/MetaModelValidatorRefiner.java        |    2 -
 .../core/metamodel/facets/DomainEventHelper.java   |   35 +-
 .../metamodel/facets/FacetFactoryAbstract.java     |   35 +-
 .../isis/core/metamodel/facets/FacetedMethod.java  |   20 +-
 .../core/metamodel/facets/ImperativeFacet.java     |    2 +-
 .../facets/SingleClassValueFacetAbstract.java      |   10 +-
 .../facets/actcoll/typeof/TypeOfFacet.java         |   19 +-
 .../facets/actcoll/typeof/TypeOfFacetAbstract.java |    5 +-
 .../actcoll/typeof/TypeOfFacetDefaultToObject.java |    5 +-
 .../typeof/TypeOfFacetInferredFromArray.java       |    5 +-
 .../typeof/TypeOfFacetInferredFromGenerics.java    |    5 +-
 .../action/ActionAnnotationFacetFactory.java       |   23 +-
 .../command/CommandFacetForActionAnnotation.java   |    6 +-
 ...ommandFacetForActionAnnotationAsConfigured.java |    4 +-
 .../command/CommandFacetFromConfiguration.java     |    6 +-
 .../invocation/ActionDomainEventFacetAbstract.java |   14 +-
 .../invocation/ActionDomainEventFacetDefault.java  |    7 +-
 .../ActionDomainEventFacetForActionAnnotation.java |    7 +-
 ...ctionInvocationFacetForDomainEventAbstract.java |  100 +-
 ...ionFacetForDomainEventFromActionAnnotation.java |    8 +-
 ...onInvocationFacetForDomainEventFromDefault.java |    8 +-
 .../action/invocation/PersistableTypeGuard.java    |   57 ++
 .../typeof/TypeOfFacetForActionAnnotation.java     |    4 +-
 .../actions/command/CommandFacetAbstract.java      |    6 +-
 .../annotation/HomePageFacetAnnotationFactory.java |    4 +-
 .../ActionValidationFacetViaMethodFactory.java     |    4 +-
 .../facets/all/i18n/TranslationFacetFactory.java   |    6 +-
 .../CollectionAccessorFacetViaAccessor.java        |   10 +-
 .../CollectionAccessorFacetViaAccessorFactory.java |   16 +-
 .../clear/CollectionClearFacetFactory.java         |   18 +-
 .../clear/CollectionClearFacetViaAccessor.java     |   10 +-
 .../CollectionAnnotationFacetFactory.java          |   23 +-
 ...ectionAddToFacetForDomainEventFromAbstract.java |   10 +-
 ...acetForDomainEventFromCollectionAnnotation.java |    8 +-
 ...lectionAddToFacetForDomainEventFromDefault.java |    6 +-
 .../modify/CollectionDomainEventFacetAbstract.java |   13 +-
 .../modify/CollectionDomainEventFacetDefault.java  |    7 +-
 ...ionDomainEventFacetForCollectionAnnotation.java |   11 +-
 ...nRemoveFromFacetForDomainEventFromAbstract.java |   13 +-
 ...acetForDomainEventFromCollectionAnnotation.java |    8 +-
 ...onRemoveFromFacetForDomainEventFromDefault.java |    6 +-
 ...fFacetOnCollectionFromCollectionAnnotation.java |   11 +-
 .../javautilcollection/CollectionFacetFactory.java |   25 +-
 .../javautilcollection/JavaArrayFacet.java         |   23 +-
 .../javautilcollection/JavaCollectionFacet.java    |    9 +-
 .../layout/SortedByFacetForCollectionXml.java      |    6 +-
 ...tionAddToRemoveFromAndValidateFacetFactory.java |    6 +-
 .../TypeOfFacetInferredFromSupportingMethods.java  |    5 +-
 .../metamodel/facets/jaxb/JaxbFacetFactory.java    |   10 +-
 .../jaxb/XmlJavaTypeAdapterFacetAbstract.java      |    6 +-
 .../jaxb/XmlJavaTypeAdapterFacetDefault.java       |    6 +-
 .../members/cssclass/CssClassFacetAbstract.java    |    1 -
 .../members/cssclass/CssClassFacetAbstract2.java   |    3 -
 ...assFacetOnActionFromConfiguredRegexFactory.java |    9 +-
 .../forsession/DisableForSessionFacetAbstract.java |   12 +-
 .../forsession/DisableForSessionFacetNone.java     |    6 +-
 .../DisableForSessionFacetViaMethod.java           |    6 +-
 .../DisableForSessionFacetViaMethodFactory.java    |    3 +-
 .../DisableForContextFacetViaMethodFactory.java    |    2 +-
 .../forsession/HideForSessionFacetAbstract.java    |   11 +-
 .../hidden/forsession/HideForSessionFacetNone.java |    6 +-
 .../forsession/HideForSessionFacetViaMethod.java   |    5 +-
 .../HideForSessionFacetViaMethodFactory.java       |    3 +-
 .../order/annotprop/MemberOrderFacetFactory.java   |    3 +-
 .../ViewModelSemanticCheckingFacetFactory.java     |    1 -
 .../autocomplete/AutoCompleteFacetAbstract.java    |   22 +-
 ...fecycleEventFacetForDomainObjectAnnotation.java |    6 +-
 ...fecycleEventFacetForDomainObjectAnnotation.java |    6 +-
 ...fecycleEventFacetForDomainObjectAnnotation.java |    6 +-
 ...fecycleEventFacetForDomainObjectAnnotation.java |    6 +-
 ...fecycleEventFacetForDomainObjectAnnotation.java |    6 +-
 ...fecycleEventFacetForDomainObjectAnnotation.java |    6 +-
 ...fecycleEventFacetForDomainObjectAnnotation.java |    6 +-
 .../choices/ChoicesFacetFromBoundedAbstract.java   |   46 +-
 .../facets/object/choices/ChoicesFacetUtils.java   |    3 +
 .../facets/object/choices/QueryFindAllChoices.java |   37 +
 ...ingValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../choices/enums/EnumValueSemanticsProvider.java  |   10 +-
 .../object/defaults/DefaultedFacetAbstract.java    |   19 +-
 .../DefaultedFacetUsingDefaultsProvider.java       |   17 +-
 .../object/defaults/DefaultsProviderUtil.java      |    6 +-
 .../annotcfg/DefaultedFacetAnnotation.java         |   18 +-
 ...tedFacetAnnotationElseConfigurationFactory.java |    6 +-
 .../annotcfg/DefaultedFacetFromConfiguration.java  |    5 +-
 .../DisabledObjectFacetViaMethodFactory.java       |    2 +-
 .../DomainObjectAnnotationFacetFactory.java        |   76 +-
 ...AutoCompleteFacetForAutoCompleteAnnotation.java |    6 +-
 ...AutoCompleteFacetForDomainObjectAnnotation.java |    6 +-
 .../ChoicesFacetForDomainObjectAnnotation.java     |   18 +-
 ...EventDefaultFacetForDomainObjectAnnotation.java |    6 +-
 ...EventDefaultFacetForDomainObjectAnnotation.java |    6 +-
 ...EventDefaultFacetForDomainObjectAnnotation.java |    6 +-
 .../ImmutableFacetForDomainObjectAnnotation.java   |    1 -
 .../editing/ImmutableFacetFromConfiguration.java   |    2 +-
 ...atableObjectFacetForDomainObjectAnnotation.java |   12 +-
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |   31 +-
 ...wModelLayoutAnnotationUsingCssClassUiEvent.java |   19 +-
 .../DomainObjectLayoutFacetFactory.java            |   21 +-
 ...mainObjectLayoutAnnotationUsingIconUiEvent.java |   21 +-
 ...aViewModelLayoutAnnotationUsingIconUiEvent.java |   22 +-
 ...inObjectLayoutAnnotationUsingLayoutUiEvent.java |   27 +-
 ...iewModelLayoutAnnotationUsingLayoutUiEvent.java |   27 +-
 ...ainObjectLayoutAnnotationUsingTitleUiEvent.java |   25 +-
 ...ViewModelLayoutAnnotationUsingTitleUiEvent.java |   28 +-
 .../object/encodeable/EncodableFacetAbstract.java  |   29 +-
 .../annotcfg/EncodableFacetFromConfiguration.java  |   10 +-
 .../encoder/EncodableFacetUsingEncoderDecoder.java |   25 +-
 .../entity/EntityFacet.java}                       |   16 +-
 .../entity/EntityFacetSimple.java}                 |   16 +-
 .../facets/object/grid/GridFacetFactory.java       |    2 +-
 .../RemoveAnnotatedMethodsFacetFactory.java        |    9 +-
 .../ignore/javalang/RemoveMethodsFacetFactory.java |    7 +-
 .../facets/object/mixin/MixinFacetAbstract.java    |   22 +-
 .../mixin/MixinFacetForDomainObjectAnnotation.java |   17 +-
 .../object/mixin/MixinFacetForMixinAnnotation.java |   15 +-
 .../mixin/MixinFacetForMixinAnnotationFactory.java |    2 +-
 .../NavigableParentAnnotationFacetFactory.java     |   13 +-
 ...jectSpecIdFacetDerivedFromClassNameFactory.java |    6 +-
 .../object/parseable/ParseableFacetAbstract.java   |   12 +-
 .../annotcfg/ParseableFacetFromConfiguration.java  |    9 +-
 .../parser/ParseableFacetUsingParser.java          |   43 +-
 ...acetOnPropertyDerivedFromRecreatableObject.java |    3 -
 .../RecreatableObjectFacetAbstract.java            |    9 +-
 ...ObjectFacetDeclarativeInitializingAbstract.java |  184 ++--
 .../recreatable/RecreatableObjectFacetFactory.java |   18 +-
 ...ctFacetForRecreatableDomainObjectInterface.java |    6 +-
 ...eObjectFacetForRecreatableObjectAnnotation.java |    7 +-
 ...leObjectFacetForRecreatableObjectInterface.java |    6 +-
 ...creatableObjectFacetForViewModelAnnotation.java |    8 +-
 ...ableObjectFacetForXmlRootElementAnnotation.java |   10 +-
 .../annotation/TitleAnnotationFacetFactory.java    |   12 +-
 .../annotation/TitleFacetViaTitleAnnotation.java   |    7 +-
 .../title/methods/TitleFacetViaMethodsFactory.java |    2 +-
 .../object/title/parser/TitleFacetUsingParser.java |   21 +-
 ...cationFromMustSatisfyAnnotationOnTypeFacet.java |    6 +-
 .../method/ValidateObjectFacetMethodFactory.java   |    2 +-
 .../object/value/MaxLengthFacetUsingParser.java    |   17 +-
 .../value/TypicalLengthFacetUsingParser.java       |   20 +-
 .../facets/object/value/ValueFacetAbstract.java    |   46 +-
 .../value/annotcfg/ValueFacetAnnotation.java       |   14 +-
 ...ValueFacetAnnotationOrConfigurationFactory.java |    6 +-
 .../annotcfg/ValueFacetFromConfiguration.java      |   11 +-
 .../vsp/ValueFacetUsingSemanticsProvider.java      |    8 +-
 .../ValueFacetUsingSemanticsProviderFactory.java   |   10 +-
 .../ValueSemanticsProviderAndFacetAbstract.java    |   48 +-
 .../value/vsp/ValueSemanticsProviderUtil.java      |    6 +-
 .../facets/object/viewmodel/ViewModelFacet.java    |   24 +-
 .../mandatory/MandatoryFacetAbstract.java          |    2 +-
 .../MustSatisfySpecificationFacetAbstract.java     |    8 +-
 .../objectvalue/observe/ObserveFacetAbstract.java  |    2 +-
 .../ActionParameterAutoCompleteFacetAbstract.java  |   37 +-
 .../ActionParameterAutoCompleteFacetViaMethod.java |   14 +-
 ...ParameterAutoCompleteFacetViaMethodFactory.java |   19 +-
 .../ActionParameterChoicesFacetAbstract.java       |   37 +-
 .../choices/ActionParameterChoicesFacetNone.java   |   11 +-
 ...rameterChoicesFacetDerivedFromChoicesFacet.java |   11 +-
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   19 +-
 .../method/ActionChoicesFacetViaMethod.java        |   36 +-
 .../method/ActionChoicesFacetViaMethodFactory.java |   17 +-
 .../ActionParameterChoicesFacetViaMethod.java      |   10 +-
 ...ctionParameterChoicesFacetViaMethodFactory.java |   17 +-
 .../ActionParameterDefaultsFacetViaMethod.java     |   14 +-
 ...tionParameterDefaultsFacetViaMethodFactory.java |   16 +-
 ...tionParameterDisabledFacetViaMethodFactory.java |   10 +-
 ...ActionParameterHiddenFacetViaMethodFactory.java |    7 -
 .../parameter/ParameterAnnotationFacetFactory.java |    2 +-
 ...fySpecificationFacetForParameterAnnotation.java |    6 +-
 .../regex/RegExFacetForParameterAnnotation.java    |    2 +-
 ...onParameterValidationFacetViaMethodFactory.java |    2 +-
 .../PropertyOrCollectionAccessorFacetAbstract.java |   33 +-
 .../accessor/PropertyAccessorFacetViaAccessor.java |   11 +-
 .../PropertyAccessorFacetViaAccessorFactory.java   |   16 +-
 .../method/PropertyAutoCompleteFacetMethod.java    |   39 +-
 .../PropertyAutoCompleteFacetMethodFactory.java    |   18 +-
 .../properties/choices/PropertyChoicesFacet.java   |    2 -
 .../choices/PropertyChoicesFacetAbstract.java      |   14 +-
 ...ropertyChoicesFacetDerivedFromChoicesFacet.java |   10 +-
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   14 +-
 .../method/PropertyChoicesFacetViaMethod.java      |   22 +-
 .../PropertyChoicesFacetViaMethodFactory.java      |   17 +-
 ...pertyDefaultFacetDerivedFromDefaultedFacet.java |   13 +-
 ...PropertyDefaultFacetDerivedFromTypeFactory.java |   18 +-
 .../method/PropertyDefaultFacetViaMethod.java      |   22 +-
 .../PropertyDefaultFacetViaMethodFactory.java      |   17 +-
 .../property/PropertyAnnotationFacetFactory.java   |   16 +-
 .../command/CommandFacetForPropertyAnnotation.java |    6 +-
 ...mandFacetForPropertyAnnotationAsConfigured.java |    4 +-
 ...ropertyClearFacetForDomainEventFromDefault.java |    9 +-
 ...rFacetForDomainEventFromPropertyAnnotation.java |    9 +-
 .../modify/PropertyDomainEventFacetAbstract.java   |   15 +-
 .../modify/PropertyDomainEventFacetDefault.java    |    9 +-
 ...pertyDomainEventFacetForPropertyAnnotation.java |    8 +-
 ...opertySetterFacetForDomainEventFromDefault.java |    7 +-
 ...rFacetForDomainEventFromPropertyAnnotation.java |    7 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java |   43 +-
 ...sfySpecificationFacetForPropertyAnnotation.java |    6 +-
 .../RegExFacetForPatternAnnotationOnProperty.java  |    3 +-
 .../regex/RegExFacetForPropertyAnnotation.java     |    3 +-
 .../PropertyValidateFacetViaMethodFactory.java     |    2 +-
 .../DateAndTimeValueSemanticsProviderAbstract.java |    5 +-
 .../ValueSemanticsProviderAbstractTemporal.java    |   11 +-
 ...malValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../BigDecimalValueSemanticsProvider.java          |    7 +-
 ...gerValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../BigIntegerValueSemanticsProvider.java          |    7 +-
 ...lobValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../value/blobs/BlobValueSemanticsProvider.java    |    7 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../BooleanPrimitiveValueSemanticsProvider.java    |    7 +-
 .../BooleanValueSemanticsProviderAbstract.java     |    5 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../BooleanWrapperValueSemanticsProvider.java      |    7 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../bytes/BytePrimitiveValueSemanticsProvider.java |    7 +-
 .../bytes/ByteValueSemanticsProviderAbstract.java  |    5 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../bytes/ByteWrapperValueSemanticsProvider.java   |    7 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../chars/CharPrimitiveValueSemanticsProvider.java |    7 +-
 .../chars/CharValueSemanticsProviderAbstract.java  |    5 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../chars/CharWrapperValueSemanticsProvider.java   |    7 +-
 ...lobValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../value/clobs/ClobValueSemanticsProvider.java    |    7 +-
 ...lorValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../value/color/ColorValueSemanticsProvider.java   |    7 +-
 .../date/DateValueSemanticsProviderAbstract.java   |    5 +-
 ...ateValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../Jdk8LocalDateValueSemanticsProvider.java       |    7 +-
 ...ateValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../JodaLocalDateValueSemanticsProvider.java       |    7 +-
 ...ateValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../datesql/JavaSqlDateValueSemanticsProvider.java |    7 +-
 ...imeValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../Jdk8LocalDateTimeValueSemanticsProvider.java   |    7 +-
 ...imeValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../Jdk8OffsetDateTimeValueSemanticsProvider.java  |    7 +-
 ...fsetDateTimeValueSemanticsProviderAbstract.java |    5 +-
 ...imeValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../JodaDateTimeValueSemanticsProvider.java        |    7 +-
 ...JodaDateTimeValueSemanticsProviderAbstract.java |    5 +-
 ...imeValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../JodaLocalDateTimeValueSemanticsProvider.java   |    7 +-
 ...ateValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../JavaUtilDateValueSemanticsProvider.java        |    7 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../DoublePrimitiveValueSemanticsProvider.java     |    7 +-
 .../DoubleValueSemanticsProviderAbstract.java      |    5 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../DoubleWrapperValueSemanticsProvider.java       |    7 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../FloatPrimitiveValueSemanticsProvider.java      |    7 +-
 .../FloatValueSemanticsProviderAbstract.java       |    5 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../floats/FloatWrapperValueSemanticsProvider.java |    7 +-
 ...ageValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../value/image/ImageValueSemanticsProvider.java   |    5 +-
 .../image/ImageValueSemanticsProviderAbstract.java |    5 +-
 ...ageValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../JavaAwtImageValueSemanticsProvider.java        |    5 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../IntPrimitiveValueSemanticsProvider.java        |    7 +-
 .../integer/IntValueSemanticsProviderAbstract.java |    5 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../integer/IntWrapperValueSemanticsProvider.java  |    7 +-
 ...athValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../LocalResourcePathValueSemanticsProvider.java   |    9 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../longs/LongPrimitiveValueSemanticsProvider.java |    7 +-
 .../longs/LongValueSemanticsProviderAbstract.java  |    5 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../longs/LongWrapperValueSemanticsProvider.java   |    7 +-
 ...kupValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../value/markup/MarkupValueSemanticsProvider.java |    7 +-
 ...neyValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../value/money/MoneyValueSemanticsProvider.java   |    7 +-
 ...ordValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../password/PasswordValueSemanticsProvider.java   |    8 +-
 ...ageValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../PercentageValueSemanticsProvider.java          |    7 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../ShortPrimitiveValueSemanticsProvider.java      |    7 +-
 .../ShortValueSemanticsProviderAbstract.java       |    5 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../ShortWrapperValueSemanticsProvider.java        |    7 +-
 ...ingValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../value/string/StringValueSemanticsProvider.java |    7 +-
 .../time/TimeValueSemanticsProviderAbstract.java   |    5 +-
 ...imeValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../timesql/JavaSqlTimeValueSemanticsProvider.java |    7 +-
 .../JavaSqlTimeStampValueSemanticsProvider.java    |    6 +-
 .../TimeStampValueSemanticsProviderAbstract.java   |    5 +-
 ...odeValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../treenode/TreeNodeValueSemanticsProvider.java   |   15 +-
 ...URLValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../value/url/URLValueSemanticsProvider.java       |    8 +-
 ...UIDValueFacetUsingSemanticsProviderFactory.java |    2 +-
 .../value/uuid/UUIDValueSemanticsProvider.java     |    7 +-
 ...arameterChoicesFacetFromParentedCollection.java |   11 +-
 .../param/DeriveFacetsPostProcessor.java           |   44 +-
 .../core/metamodel/progmodel/FacetFactorySet.java  |    2 -
 .../metamodel/services/ServiceInjectorDefault.java |  230 +++++
 .../isis/core/metamodel/services/ServiceUtil.java  |   66 ++
 .../core/metamodel/services/ServicesInjector.java  |  437 +-------
 .../services/ServicesInjectorBuilder.java          |    5 +
 .../services/appfeat/ApplicationFeature.java       |    4 +
 .../appfeat/ApplicationFeatureFactory.java         |   13 +-
 .../ApplicationFeatureRepositoryDefault.java       |   19 +-
 .../services/events/MetamodelEventService.java     |   63 ++
 .../exceprecog/ExceptionRecognizerDocDefault.java  |   21 +-
 .../factory/FactoryServiceInternalDefault.java     |    6 +-
 .../services/grid/GridLoaderServiceDefault.java    |   22 +-
 .../services/grid/GridServiceDefault.java          |   36 +-
 .../services/grid/GridSystemServiceAbstract.java   |   17 +-
 .../grid/bootstrap3/GridSystemServiceBS3.java      |   11 +-
 .../services/layout/LayoutServiceDefault.java      |   46 +-
 .../services/metamodel/DomainMemberDefault.java    |    4 +-
 .../services/metamodel/MetaModelExportSupport.java |   13 +
 .../services/metamodel/MetaModelExporter.java      |    2 +-
 .../metamodel/MetaModelServiceDefault.java         |   84 +-
 .../persistsession/ObjectAdapterService.java}      |   19 +-
 .../services/registry/ServiceRegistryDefault.java  |   79 +-
 .../registry/ServiceRegistryDefault_validate.java  |   74 ++
 .../RepositoryServiceInternalDefault.java          |    2 +-
 .../services/swagger/SwaggerServiceDefault.java    |   61 +-
 .../services/swagger/internal/Generation.java      |    4 +-
 .../services/title/TitleServiceDefault.java        |   33 +-
 .../metamodel/spec/InjectorMethodEvaluator.java    |    7 +-
 .../isis/core/metamodel/spec/ManagedObject.java    |   15 +-
 .../core/metamodel/spec/ManagedObjectState.java    |   31 +
 .../isis/core/metamodel/spec/ObjectSpecId.java     |   63 +-
 .../core/metamodel/spec/ObjectSpecification.java   |  102 +-
 .../core/metamodel/spec/feature/ObjectAction.java  |    4 +-
 .../spec/feature/ObjectActionParameter.java        |    4 +-
 .../metamodel/spec/feature/ObjectAssociation.java  |   22 +-
 .../specloader/InjectorMethodEvaluatorDefault.java |   79 +-
 .../specloader/SpecificationCacheDefault.java      |    3 +-
 .../metamodel/specloader/SpecificationLoader.java  |  679 ++----------
 .../specloader/SpecificationLoaderDefault.java     |  576 +++++++++++
 .../specloader/facetprocessor/FacetProcessor.java  |   19 +-
 .../specloader/postprocessor/PostProcessor.java    |   18 +-
 .../specloader/specimpl/FacetedMethodsBuilder.java |   31 +-
 .../specloader/specimpl/IntrospectionState.java    |    2 +
 .../specimpl/ObjectActionContributee.java          |   11 +-
 .../specloader/specimpl/ObjectActionDefault.java   |   10 +-
 .../specloader/specimpl/ObjectActionMixedIn.java   |   10 +-
 .../specimpl/ObjectActionParameterAbstract.java    |    9 +-
 .../ObjectActionParameterContributeeAbstract.java  |    2 +-
 .../specimpl/ObjectAssociationAbstract.java        |    7 +-
 .../specloader/specimpl/ObjectMemberAbstract.java  |   66 +-
 .../specimpl/ObjectSpecificationAbstract.java      |  184 ++--
 .../OneToManyActionParameterContributee.java       |    3 +-
 .../specimpl/OneToManyAssociationContributee.java  |   19 +-
 .../specimpl/OneToManyAssociationDefault.java      |   24 +-
 .../specimpl/OneToManyAssociationMixedIn.java      |   23 +-
 .../OneToOneActionParameterContributee.java        |    3 +-
 .../specimpl/OneToOneAssociationContributee.java   |    9 +-
 .../specimpl/OneToOneAssociationDefault.java       |   26 +-
 .../specimpl/OneToOneAssociationMixedIn.java       |    9 +-
 .../specimpl/dflt/ObjectSpecificationDefault.java  |   62 +-
 .../ObjectSpecificationOnStandaloneList.java       |   26 +-
 .../traverser/SpecificationTraverser.java          |    4 +-
 ...idException.java => MetaModelDeficiencies.java} |   23 +-
 .../validator/MetaModelInvalidException.java       |   23 +-
 .../specloader/validator/MetaModelValidator.java   |    8 +-
 .../validator/MetaModelValidatorAbstract.java      |   15 +-
 .../validator/MetaModelValidatorComposite.java     |    7 +-
 .../MetaModelValidatorToCheckModuleExtent.java     |    7 +-
 ...taModelValidatorToCheckObjectSpecIdsUnique.java |    2 +-
 .../validator/MetaModelValidatorVisiting.java      |    2 +-
 .../specloader/validator/ValidationFailures.java   |    6 +-
 .../standard/AuthorizationFacetAbstract.java       |   15 +-
 .../standard/AuthorizationFacetFactory.java        |   16 +-
 .../standard/AuthorizationFacetImpl.java           |    9 +-
 .../standard/AuthorizationManagerStandard.java     |   68 +-
 .../core/runtime/threadpool/ThreadPoolSupport.java |    2 +-
 .../query/JdoQueryAnnotationFacetFactory.java      |    6 -
 .../object/query/VisitorForClauseAbstract.java     |    2 +-
 .../isis/progmodels/dflt/JavaReflectorHelper.java  |   15 +-
 .../isis/core/metamodel/BeansForTesting.java       |  121 +++
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |   62 +-
 .../metamodel/facets/AbstractFacetFactoryTest.java |    6 +-
 ...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 +
 .../actions/ActionMethodsFacetFactoryTest.java     |   92 +-
 .../action/ActionAnnotationFacetFactoryTest.java   | 1078 +-------------------
 ...notationFacetFactoryTest_ActionInvocation.java} |   25 +-
 .../ActionAnnotationFacetFactoryTest_Command.java  |  285 ++++++
 .../ActionAnnotationFacetFactoryTest_Hidden.java   |   45 +
 ...ctionAnnotationFacetFactoryTest_Invocation.java |  185 ++++
 ...ctionAnnotationFacetFactoryTest_Publishing.java |  285 ++++++
 ...ctionAnnotationFacetFactoryTest_RestrictTo.java |   82 ++
 ...ActionAnnotationFacetFactoryTest_Semantics.java |   84 ++
 .../ActionAnnotationFacetFactoryTest_TypeOf.java   |  150 +++
 .../PrototypeFacetAnnotationFactoryTest.java       |    1 -
 ...tionLayoutAnnotationFacetFactoryJunit4Test.java |   20 +-
 ...nLayoutXmlLayoutAnnotationFacetFactoryTest.java |    2 -
 ...etDerivedFromDomainServiceFacetFactoryTest.java |   11 +-
 ...etDerivedFromDomainServiceFacetFactoryTest.java |   15 +-
 .../CollectionFieldMethodsFacetFactoryTest.java    |   53 +-
 .../collections/JavaCollectionFacetTest.java       |   12 +-
 .../CollectionAnnotationFacetFactoryTest.java      |   10 +-
 ...ollectionAnnotationFacetFactoryTest_typeOf.java |    1 -
 ...stedAnnotationOnCollectionFacetFactoryTest.java |    3 +-
 .../ViewModelSemanticCheckingFacetFactoryTest.java |    6 +-
 .../object/defaults/DefaultedFacetFactoryTest.java |    4 -
 .../ObjectDisabledMethodFacetFactoryTest.java      |   20 +-
 ...oicesFacetFromBoundedAnnotationFactoryTest.java |    1 -
 .../DomainObjectAnnotationFacetFactoryTest.java    |   26 +-
 .../DomainObjectLayoutFactoryTest.java             |    7 +-
 .../title/TitleFacetViaMethodsFactoryTest.java     |   22 +-
 .../TitleAnnotationFacetFactoryTest.java           |   39 +-
 .../TitleFacetViaTitleAnnotationTest.java          |    4 +-
 .../NavigableParentAnnotationFacetFactoryTest.java |  142 ++-
 .../parseable/ParseableFacetUsingParserTest.java   |   47 +-
 .../ObjectValidMethodFacetFactoryTest.java         |   20 -
 ...eFacetAnnotationOrConfigurationFactoryTest.java |    3 -
 .../ordering/memberorder/DeweyOrderSetTest.java    |    6 +
 .../MemberOrderAnnotationFacetFactoryTest.java     |   22 +-
 .../memberorder/MemberOrderComparatorTest.java     |    3 +
 .../ParameterAnnotationFacetFactoryTest.java       |    6 +-
 ...lableAnnotationOnParameterFacetFactoryTest.java |    3 +-
 ...RegExAnnotationOnParameterFacetFactoryTest.java |    3 +-
 .../PropertyMethodsFacetFactoryTest.java           |   61 +-
 .../MandatoryAnnotationFacetFactoryTest.java       |    3 +-
 ...sistedAnnotationOnPropertyFacetFactoryTest.java |    3 +-
 .../PropertyAnnotationFacetFactoryTest.java        |   12 +-
 ...llableAnnotationOnPropertyFacetFactoryTest.java |    3 +-
 .../RegExAnnotationOnPropertyFacetFactoryTest.java |    3 +-
 ...SpecificationValidatingInteractionMoreTest.java |   10 +-
 ...isfySpecificationValidatingInteractionTest.java |   10 +-
 .../BigDecimalValueSemanticsProviderTest.java      |    5 +-
 .../value/BigIntValueSemanticsProviderTest.java    |    5 +-
 .../value/BlobValueSemanticsProviderTest.java      |    2 +-
 .../value/BooleanValueSemanticsProviderTest.java   |    2 +-
 .../value/ByteValueSemanticsProviderTest.java      |    2 +-
 .../value/CharacterValueSemanticsProviderTest.java |    2 +-
 .../value/ClobValueSemanticsProviderTest.java      |    2 +-
 .../value/ColorValueSemanticsProviderTest.java     |    2 +-
 .../value/DoubleValueSemanticsProviderTest.java    |    2 +-
 .../value/FloatValueSemanticsProviderTest.java     |    2 +-
 .../ImageValueSemanticsProviderAbstractTest.java   |   10 +-
 .../value/IntValueSemanticsProviderTest.java       |    2 +-
 .../JavaSqlDateValueSemanticsProviderTest.java     |    2 +-
 .../JavaSqlTimeValueSemanticsProviderTest.java     |    2 +-
 .../JavaUtilDateValueSemanticsProviderTest.java    |    2 +-
 .../value/LongValueSemanticsProviderTest.java      |    2 +-
 .../value/MoneyValueSemanticsProviderTest.java     |    2 +-
 .../value/PasswordValueSemanticsProviderTest.java  |    2 +-
 .../PercentageValueSemanticsProviderTest.java      |    2 +-
 .../PolishMoneyValueSemanticsProviderTest.java     |    2 +-
 .../value/ShortValueSemanticsProviderTest.java     |    2 +-
 .../value/StringValueSemanticsProviderTest.java    |    2 +-
 .../ValueSemanticsProviderAbstractTestCase.java    |   58 +-
 ...odaLocalDateTimeValueSemanticsProviderTest.java |   12 +-
 .../ServiceInjectorBuilder_forTesting.java         |   93 ++
 .../services/ServicesInjectorDefaultTest.java      |  147 +--
 .../ServicesInjectorDefaultTest_usingFields.java   |  129 +--
 ...rvicesInjectorDefaultTest_validateServices.java |   80 +-
 ...InjectorDefaultTest_validateServices_happy.java |   65 ++
 .../ApplicationFeatureRepositoryDefaultTest.java   |    2 +-
 .../core/metamodel/services/grid/BS3GridTest.java  |   15 +-
 .../services/menubars/BS3MenuBarsTest.java         |    2 +-
 .../metamodel/MetaModelServiceDefaultTest.java     |   24 +-
 .../ServiceRegistryBuilder_forTesting.java         |   60 ++
 .../RepositoryServiceDefaultTest_allMatches.java   |   95 --
 .../SpecificationLoaderTestAbstract.java           |  193 ++--
 .../specloader/SpecificationLoaderTest_array.java  |   31 +-
 .../SpecificationLoaderTest_collection.java        |   22 +-
 .../specloader/SpecificationLoaderTest_value.java  |   15 +-
 .../specimpl/ObjectAssociationAbstractTest.java    |   18 +-
 ...ObjectAssociationAbstractTest_alwaysHidden.java |   21 +-
 .../testspec/ObjectSpecificationStub.java          |   51 +-
 .../fixture/LogonFixtureAuthenticatorTest.java     |    3 +-
 core/plugins/eventbus-axon/pom.xml                 |   13 +
 .../EventBusServiceDefaultUsingAxonSimpleTest.java |   32 +-
 .../conneg/RestfulObjectsJaxbWriterForXml.java     |    8 +-
 core/plugins/jdo-datanucleus-5/pom.xml             |   20 +
 .../services/jdosupport/IsisJdoSupportDN5.java     |   13 +-
 .../services/metrics/MetricsServiceDefault.java    |    2 +-
 .../system/persistence/PersistenceSession5.java    |  186 ++--
 .../persistence/PersistenceSessionFactory5.java    |   37 +-
 .../jdo/datanucleus/JDOStateManagerForIsis.java    |    7 +-
 .../queries/PersistenceQueryProcessorAbstract.java |    2 +-
 .../runtime/system/ObjectMemberAbstractTest.java   |    8 +-
 .../WrapperFactoryDefaultTest_wrappedObject.java   |   55 +-
 ...FactoryDefaultTest_wrappedObject_transient.java |   41 +-
 .../apache/isis/security/shiro/IsisLdapRealm.java  |    9 +-
 .../apache/isis/security/shiro/ShiroConstants.java |   33 -
 .../isis/security/shiro/ShiroSecurityContext.java  |   51 +
 .../ShiroAuthenticationManagerInstaller.java       |   41 -
 .../ShiroAuthenticator.java}                       |  138 +--
 .../ShiroAuthorizationManagerInstaller.java        |   38 -
 .../shiro/authorization/ShiroAuthorizor.java       |  129 +++
 ...AuthenticatorOrAuthorizorTest_authenticate.java |   28 +-
 ...ticatorOrAuthorizorTest_isVisibleInAnyRole.java |   29 +-
 core/pom.xml                                       |   51 +-
 .../pom.xml                                        |   92 +-
 .../core/runtime/headless/HeadlessAbstract.java    |    0
 .../headless/HeadlessTransactionSupport.java       |    0
 .../HeadlessWithBootstrappingAbstract.java         |    0
 .../isis/core/runtime/headless/IsisSystem.java     |   58 +-
 .../runtime/headless/IsisSystemBootstrapper.java   |    3 +-
 .../auth/AuthenticationRequestNameOnly.java        |    0
 .../runtime/headless/logging/LeveledLogger.java    |    0
 .../core/runtime/headless/logging/LogConfig.java   |    0
 .../core/runtime/headless/logging/LogStream.java   |    0
 .../isis/core/runtime/profiler/Profiler.java       |    0
 .../isis/core/runtime/profiler/ProfilerSystem.java |    0
 .../apache/isis/core/webapp/IsisSessionFilter.java |   19 +-
 .../core/webapp/IsisWebAppContextListener.java     |    0
 .../webapp/auth/AuthenticationSessionStrategy.java |    1 -
 .../AuthenticationSessionStrategyAbstract.java     |    0
 .../AuthenticationSessionStrategyBasicAuth.java    |    3 +-
 .../auth/AuthenticationSessionStrategyDefault.java |   20 -
 .../auth}/AuthenticationSessionStrategyHeader.java |    3 +-
 .../core/webapp/content/ResourceCachingFilter.java |    0
 .../isis/core/webapp/content/ResourceServlet.java  |    0
 .../ResourceServlet_HtmlTemplateVariables.java     |    0
 .../diagnostics/IsisLogOnExceptionFilter.java      |    0
 .../apache/isis/core/webapp/modules/WebModule.java |    0
 .../isis/core/webapp/modules/WebModuleContext.java |    0
 .../modules/WebModule_LogOnExceptionLogger.java    |    0
 .../core/webapp/modules/WebModule_RestEasy.java    |    0
 .../webapp/modules/WebModule_ServerSentEvents.java |    0
 .../isis/core/webapp/modules/WebModule_Shiro.java  |    0
 .../webapp/modules/WebModule_StaticResources.java  |    0
 .../isis/core/webapp/modules/WebModule_Wicket.java |    0
 .../modules/sse/ServerSentEventsServlet.java       |    2 +-
 .../core/webapp/routing/ForwardingServlet.java     |    0
 .../isis/core/webapp/routing/RedirectFilter.java   |    0
 .../isis/core/webapp/routing/RedirectServlet.java  |    0
 .../core/webapp/routing/RedirectToDocsFilter.java  |    0
 .../isis/core/wrapper/WrapperFactoryDefault.java   |    0
 .../dispatchers/InteractionEventDispatcher.java    |    0
 .../InteractionEventDispatcherTypeSafe.java        |    0
 .../AbstractCollectionInvocationHandler.java       |    2 +-
 .../handlers/CollectionInvocationHandler.java      |    0
 .../handlers/DelegatingInvocationHandler.java      |    0
 .../DelegatingInvocationHandlerDefault.java        |   16 +-
 .../handlers/DomainObjectInvocationHandler.java    |   41 +-
 .../wrapper/handlers/MapInvocationHandler.java     |    0
 .../core/wrapper/handlers/ProxyContextHandler.java |    0
 .../isis/core/wrapper/internal/util/Constants.java |    0
 .../wrapper/internal/util/MethodPrefixFinder.java  |    0
 .../isis/core/wrapper/proxy/ProxyCreator.java      |    0
 .../jee_support}/IsisCDIBeanScanInterceptor.java   |   38 +-
 .../isis/runtime}/services/h2/H2ManagerMenu.java   |    9 +-
 .../services/hsqldb/HsqlDbManagerMenu.java         |   16 +-
 .../runtime}/services/hsqldb/package-info.java     |    2 +-
 .../apache/isis}/runtime/viewer/package-info.java  |    2 +-
 .../viewer/web/AbstractServletOrFilterMapping.java |    2 +-
 .../runtime/viewer/web/FilterSpecification.java    |    2 +-
 .../runtime/viewer/web/ServletSpecification.java   |    2 +-
 .../runtime/viewer/web/WebAppSpecification.java    |    2 +-
 ...sisSystemBootstrapper_haveSameModules_Test.java |    0
 .../isis/core/runtime/profiler/ProfilerTest.java   |    0
 .../core/runtime/profiler/ProfilerTestSystem.java  |    0
 .../IsisSessionFilter_lookupPassThru_Test.java     |    0
 .../core/wrapper/WrapperFactoryDefaultTest.java    |    0
 .../progmodel/wrapper/dom/claims/Approver.java     |    0
 .../progmodel/wrapper/dom/claims/Claimant.java     |    0
 .../progmodel/wrapper/dom/employees/Employee.java  |    0
 .../wrapper/dom/employees/EmployeeRepository.java  |    0
 .../dom/employees/EmployeeRepositoryImpl.java      |    0
 core/{commons => runtime-services}/pom.xml         |   63 +-
 .../runtime/services/InitialisationException.java  |    0
 .../runtime/services/RequestScopedService.java     |    9 +-
 .../core/runtime/services/ServiceException.java    |    0
 .../core/runtime/services/ServiceInstantiator.java |    6 +-
 .../core/runtime/services/ServicesInstaller.java   |    0
 .../services/ServicesInstallerAbstract.java        |    0
 .../services/ServicesInstallerFromAnnotation.java  |    0
 .../ServicesInstallerFromConfiguration.java        |    0
 ...cesInstallerFromConfigurationAndAnnotation.java |    0
 .../runtime/services/ServicesInstallerUtils.java   |    0
 .../AuthenticationSessionProviderDefault.java      |    0
 .../background/BackgroundCommandExecution.java     |    0
 .../background/BackgroundServiceDefault.java       |    7 +-
 .../background/CommandExecutionAbstract.java       |    0
 .../background/CommandExecutorServiceDefault.java  |    2 +-
 .../background/CommandInvocationHandler.java       |    0
 .../background/ForkingInvocationHandler.java       |    0
 .../command/CommandDtoServiceInternalDefault.java  |    3 +-
 .../services/command/CommandServiceDefault.java    |    0
 .../services/email/EmailServiceDefault.java        |    0
 .../core/runtime/services/error/EmailTicket.java   |    0
 .../core/runtime/services/error/SimpleTicket.java  |    0
 .../eventbus/EventBusImplementationAbstract.java   |    3 +-
 .../services/eventbus/EventBusServiceDefault.java  |    9 +-
 .../homepage/HomePageProviderServiceDefault.java   |   35 +-
 .../isis/core/runtime/services/i18n/po/Block.java  |    0
 .../runtime/services/i18n/po/ContextAndMsgId.java  |    0
 .../core/runtime/services/i18n/po/PoAbstract.java  |    0
 .../core/runtime/services/i18n/po/PoDisabled.java  |    0
 .../core/runtime/services/i18n/po/PoReader.java    |    0
 .../core/runtime/services/i18n/po/PoWriter.java    |    2 +-
 .../services/i18n/po/TranslationServicePo.java     |    0
 .../services/i18n/po/TranslationServicePoMenu.java |    0
 .../isis/core/runtime/services/i18n/po/Util.java   |    0
 .../ixn/InteractionDtoServiceInternalDefault.java  |    0
 .../menubars/MenuBarsLoaderServiceDefault.java     |   28 +-
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |   36 +-
 .../menubars/bootstrap3/ServiceAndAction.java      |    0
 .../services/message/MessageServiceDefault.java    |    0
 .../services/publish/PublishedObjectsDefault.java  |    0
 .../publish/PublishingServiceInternalDefault.java  |    2 +-
 .../sessmgmt/SessionManagementServiceDefault.java  |    0
 .../services/sse/EventStreamServiceDefault.java    |    0
 .../runtime/services/sudo/SudoServiceDefault.java  |    0
 .../userprof/UserProfileServiceDefault.java        |    0
 .../userreg/EmailNotificationServiceDefault.java   |    0
 .../userreg/EmailVerificationTemplate.html         |    0
 .../services/userreg/PasswordResetTemplate.html    |    0
 .../services/xactn/TransactionServiceDefault.java  |   17 +
 .../services/xmlsnapshot}/XmlSnapshotBuilder.java  |   18 +-
 .../xmlsnapshot/XmlSnapshotServiceDefault.java     |   28 +-
 .../runtime/services/ServiceInstantiatorTest.java  |    0
 .../changes/PreAndPostValues_shouldAudit_Test.java |    1 +
 .../email/EmailServiceDefaultTest_actually.java    |    0
 .../email/EmailServiceDefaultTest_notEmpty.java    |    0
 .../eventbus/EventBusServiceDefaultTest.java       |   30 +-
 ...onRecognizerCompositeForJdoObjectStoreTest.java |    0
 ...LIntegrityConstraintViolationExceptionTest.java |    0
 .../runtime/services/i18n/po/PoReaderTest.java     |    0
 .../services/i18n/po/PoWriterTest_escape.java      |    0
 .../apache/isis/core/runtime/RuntimeModule.java}   |   11 +-
 .../fixtures/FixturesInstallerAbstract.java        |   13 +-
 .../fixtures/FixturesInstallerDelegate.java        |  120 +--
 .../FixturesInstallerFromConfiguration.java        |   10 +-
 .../org/apache/isis/core/runtime/memento/Data.java |   12 +-
 .../apache/isis/core/runtime/memento/Memento.java  |   18 +-
 .../isis/core/runtime/memento/StandaloneData.java  |    7 +-
 .../persistence/FixturesInstalledState.java}       |   45 +-
 .../persistence/FixturesInstalledStateHolder.java} |   14 +-
 .../runtime/persistence/adapter/PojoAdapter.java   |   90 +-
 .../AbstractIsisSessionTemplate.java               |    4 +-
 .../isis/core/runtime/system/SystemConstants.java  |    9 +-
 .../core/runtime/system/context/IsisContext.java   |  217 ++--
 .../system/context/session/RuntimeContext.java     |   52 +
 .../system/context/session/RuntimeContextBase.java |  123 +++
 .../session/RuntimeContextBase_findHomepage.java   |   84 ++
 .../context/session/RuntimeEventService.java       |   96 ++
 .../context/session/SessionLifecycleEvent.java     |   21 +
 .../runtime/system/persistence/ObjectFactory.java  |   15 +-
 .../system/persistence/PersistenceSession.java     |   58 +-
 .../system/persistence/PersistenceSessionBase.java |   44 +-
 .../persistence/PersistenceSessionFactory.java     |    4 +-
 .../adaptermanager/ObjectAdapterContext.java       |   48 +-
 .../ObjectAdapterContext_DependencyInjection.java  |   30 +-
 .../ObjectAdapterContext_Factories.java            |   28 +-
 ...ObjectAdapterContext_LifecycleEventSupport.java |   25 +-
 .../ObjectAdapterContext_MementoSupport.java       |   34 +-
 .../ObjectAdapterContext_NewIdentifier.java        |   21 +-
 ...ctAdapterContext_ObjectAdapterByIdProvider.java |   31 +-
 ...ObjectAdapterContext_ObjectAdapterProvider.java |   30 +-
 .../ObjectAdapterContext_ObjectCreation.java       |   18 +-
 .../ObjectAdapterContext_OidProviders.java         |    3 +-
 .../ObjectAdapterContext_ServiceLookup.java        |   23 +-
 .../runtime/system/session/IsisRequestCycle.java   |  132 +++
 .../core/runtime/system/session/IsisSession.java   |  140 ++-
 .../runtime/system/session/IsisSessionFactory.java |  353 +------
 .../system/session/IsisSessionFactoryBuilder.java  |  264 ++---
 .../system/session/IsisSessionFactoryDefault.java  |  317 ++++++
 .../system/session/IsisSessionProducerBean.java    |   85 ++
 .../system/session/SpecificationLoaderFactory.java |   79 ++
 .../transaction}/AdapterAndProperty.java           |    2 +-
 .../transaction}/AuditingServiceInternal.java      |    5 +-
 .../ChangedObjectsServiceInternal.java             |    3 +-
 .../system/transaction/IsisTransaction.java        |   22 +-
 .../system/transaction/IsisTransactionManager.java |   22 +-
 .../PersistenceSessionServiceInternalDefault.java  |   18 +-
 .../transaction}/PreAndPostValues.java             |    4 +-
 .../systemusinginstallers/AuthenticatorBypass.java |   35 -
 .../IsisComponentProvider.java                     |  154 ---
 .../IsisComponentProviderBuilder.java              |   79 --
 ...sisComponentProviderHelper_UsingInstallers.java |  222 ----
 .../system/ObjectActionLayoutXmlDefaultTest.java   |    2 +-
 .../system/OneToManyAssociationDefaultTest.java    |    4 +-
 .../authentication/AuthenticationRequest.java      |   39 +-
 .../AuthenticationRequestAbstract.java             |   23 +-
 .../authentication/AuthenticationSession.java      |   21 +-
 .../AuthenticationSessionAbstract.java             |   50 +-
 .../AuthenticationSessionProvider.java             |    3 -
 .../AuthenticationRequestLogonFixture.java         |   16 +-
 .../authentication/health/HealthAuthSession.java   |    4 +-
 .../AuthenticationRequestSingleUser.java           |   14 +-
 .../standard/AuthenticatorAbstract.java            |    2 +-
 .../authentication/standard/SimpleSession.java     |   25 +-
 core/specsupport/pom.xml                           |    5 +
 core/unittestsupport/pom.xml                       |    5 +
 .../restfulobjects/applib/JsonRepresentation.java  |    2 -
 .../restfulobjects/applib/LinkRepresentation.java  |    8 +-
 .../restfulobjects/applib/RestfulHttpMethod.java   |    1 +
 .../AbstractObjectMemberRepresentation.java        |    3 +-
 .../domainobjects/ActionResultRepresentation.java  |    4 +-
 .../applib/domainobjects/DomainRepresentation.java |    3 +-
 .../applib/domainobjects/ListRepresentation.java   |    3 +-
 .../domainobjects/ObjectActionRepresentation.java  |    3 +-
 .../ObjectCollectionRepresentation.java            |    3 +-
 .../domainobjects/ScalarValueRepresentation.java   |    3 +-
 .../AbstractTypeMemberRepresentation.java          |    3 +-
 .../domaintypes/DomainTypeRepresentation.java      |    3 +-
 .../TypeActionResultRepresentation.java            |    3 +-
 .../applib/domaintypes/TypeListRepresentation.java |    3 +-
 .../applib/errors/ErrorRepresentation.java         |    3 +-
 .../applib/health/HealthRepresentation.java        |    5 +-
 .../applib/health/HealthResource.java              |    7 +-
 .../applib/homepage/HomePageRepresentation.java    |    3 +-
 .../applib/user/UserRepresentation.java            |    3 +-
 .../restfulobjects/applib/util/JsonMapper.java     |    8 +-
 .../applib/util/UrlEncodingUtils.java              |    5 +-
 .../applib/version/VersionRepresentation.java      |    3 +-
 .../applib/version/VersionResource.java            |    7 +-
 .../restfulobjects/rendering/LinkFollowSpecs.java  |    3 +-
 .../viewer/restfulobjects/rendering}/OidUtils.java |   40 +-
 .../restfulobjects/rendering/RendererContext.java  |   24 +-
 .../rendering/ReprRendererAbstract.java            |    6 +-
 .../viewer/restfulobjects/rendering/Responses.java |    7 +-
 .../restfulobjects/rendering}/UrlDecoderUtils.java |    2 +-
 .../AbstractObjectMemberReprRenderer.java          |    6 +-
 .../domainobjects/ActionResultReprRenderer.java    |    4 +-
 .../domainobjects/DomainObjectLinkTo.java          |    1 -
 .../domainobjects/DomainObjectReprRenderer.java    |   19 +-
 .../rendering/domainobjects/InvokeKeys.java        |    2 -
 .../rendering/domainobjects/JsonValueEncoder.java  |   54 +-
 .../domainobjects/ObjectActionReprRenderer.java    |    4 +-
 .../ObjectCollectionReprRenderer.java              |    2 +-
 .../domainobjects/ObjectPropertyReprRenderer.java  |    6 +-
 .../{util => domainobjects}/OidUtils.java          |    4 +-
 .../domainobjects/ScalarValueReprRenderer.java     |    1 +
 .../AbstractTypeFeatureReprRenderer.java           |    1 -
 .../domaintypes/DomainTypeReprRenderer.java        |    7 +-
 .../domaintypes/TypeActionResultReprRenderer.java  |    2 +-
 .../rendering/service/RepresentationService.java   |   10 -
 .../RepresentationServiceContentNegotiator.java    |   32 +-
 .../acceptheader/AcceptHeaderServiceForRest.java   |    4 +-
 ...entNegotiationServiceForRestfulObjectsV1_0.java |    6 +-
 .../ContentNegotiationServiceXRoDomainType.java    |    6 +-
 .../viewer/restfulobjects/rendering/util/Util.java |    6 +-
 .../JsonValueEncoderTest_appendValueAndFormat.java |    2 +-
 .../JsonValueEncoderTest_asAdapter.java            |    2 +-
 .../JsonValueEncoderTest_asObject.java             |    2 +-
 .../restfulobjects/server/ResourceContext.java     |  133 +--
 .../server/mappers/ExceptionMapperAbstract.java    |    4 +-
 .../mappers/ExceptionMapperForObjectNotFound.java  |    2 +-
 .../ExceptionMapperForRuntimeException.java        |   57 +-
 .../resources/DomainObjectResourceServerside.java  |    9 +-
 .../server/resources/DomainResourceHelper.java     |  107 +-
 .../resources/DomainServiceResourceServerside.java |    7 +-
 .../resources/DomainTypeResourceServerside.java    |    5 +-
 .../server/resources/HomePageReprRenderer.java     |    9 +-
 .../server/resources/JsonParserHelper.java         |    3 +-
 .../resources/MenuBarsResourceServerside.java      |    6 +-
 .../server/resources/ObjectActionArgHelper.java    |    1 +
 .../server/resources/ResourceAbstract.java         |  109 +-
 .../server/resources/SwaggerSpecResource.java      |   29 +-
 .../server/resources/UserReprRenderer.java         |    7 +-
 .../server/resources/UserResourceServerside.java   |   13 +-
 .../resources/VersionResourceServerside.java       |    1 +
 .../serialization/SerializationStrategy.java       |    4 +-
 .../server/util/NOTUSED_InputStreamUtil.java       |   65 --
 .../server/util/NOTUSED_PathUtils.java             |   40 -
 .../restfulobjects/server/util/UrlParserUtils.java |    1 +
 .../IsisTransactionFilterForRestfulObjects.java    |   45 +-
 .../server/ResourceContextTest_getArg.java         |   16 +-
 ..._ensureCompatibleAcceptHeader_ContractTest.java |   16 +-
 core/viewer-wicket-impl/pom.xml                    |   11 +-
 .../wicket/viewer/IsisWicketApplication.java       |  127 +--
 .../viewer/wicket/viewer/IsisWicketModule.java     |  175 ++--
 ...rgetRespondListenerToResetQueryResultCache.java |   29 +-
 .../imagecache/ImageResourceCacheClassPath.java    |   10 +-
 .../viewer/integration/isis/IsisInjectModule.java  |   70 --
 .../wicket/AnonymousWebSessionForIsis.java         |    3 +-
 .../wicket/AuthenticatedWebSessionForIsis.java     |   25 +-
 .../wicket/ConverterForObjectAdapterMemento.java   |   31 +-
 .../integration/wicket/LocalizerForIsis.java       |   25 +-
 .../integration/wicket/WebRequestCycleForIsis.java |  532 +++++-----
 .../ComponentFactoryRegistrarDefault.java          |    4 +-
 .../ComponentFactoryRegistryDefault.java           |   18 +-
 .../registries/pages/PageClassListDefault.java     |   11 +-
 .../registries/pages/PageClassRegistryDefault.java |   23 +-
 .../pages/PageNavigationServiceDefault.java        |   18 +-
 .../viewer/services/DeepLinkServiceWicket.java     |   42 +-
 .../services/EmailNotificationServiceWicket.java   |    7 +-
 .../wicket/viewer/services/EmailServiceWicket.java |   55 -
 .../viewer/services/GuiceBeanProviderWicket.java   |   56 -
 .../viewer/services/LocaleProviderWicket.java      |   13 +-
 .../wicket/viewer/services/Object_clearHints.java  |   13 +-
 .../services/TranslationsResolverWicket.java       |   17 +-
 .../viewer/settings/IsisResourceSettings.java      |   14 +-
 .../settings/WicketViewerSettingsDefault.java      |    9 +-
 .../isisWicketModule_bindingsStandard_Test.java    |  122 ---
 .../pages/PageClassListDefault_Instantiation.java  |    6 +-
 ...ageClassListDefault_RegistrationAndCaching.java |    4 +-
 .../pages/PageClassListDefault_Instantiation.java  |   17 +-
 .../wicket/model/mementos/CollectionMemento.java   |   21 +-
 .../model/mementos/ObjectAdapterMemento.java       |  690 ++-----------
 .../mementos/ObjectAdapterMemento_Legacy.java      |  587 +++++++++++
 .../wicket/model/mementos/PropertyMemento.java     |   17 +-
 .../viewer/wicket/model/mementos/SpecUtils.java    |   10 +-
 .../viewer/wicket/model/models/ActionModel.java    |   37 +-
 .../wicket/model/models/ActionPromptProvider.java  |   10 +-
 .../wicket/model/models/BookmarkedPagesModel.java  |    8 +-
 .../wicket/model/models/EntityCollectionModel.java |   79 +-
 .../viewer/wicket/model/models/EntityModel.java    |   64 +-
 .../model/models/EntityModelForReference.java      |    2 +-
 .../model/models/HintPageParameterSerializer.java  |   11 +-
 .../viewer/wicket/model/models/ModelAbstract.java  |   25 +-
 .../viewer/wicket/model/models/ScalarModel.java    |   39 +-
 .../model/models/ScalarModelWithMultiPending.java  |    7 +-
 .../model/models/ScalarModelWithPending.java       |    4 +-
 .../wicket/model/models/ServiceActionsModel.java   |    6 +-
 .../viewer/wicket/model/models/ValueModel.java     |    5 +-
 .../models/whereami/WhereAmIModelDefault.java      |   12 +-
 .../viewer/wicket/model/util/ComponentHintKey.java |    5 +-
 core/viewer-wicket-ui/pom.xml                      |    3 +-
 .../ActionResultResponseHandlingStrategy.java      |    7 +-
 .../actionresponse/ActionResultResponseType.java   |   29 +-
 .../wicket/ui/components/about/AboutPanel.java     |   29 +-
 .../entityactions/EntityActionLinkFactory.java     |    2 +-
 .../actionmenu/serviceactions/CssMenuItem.java     |    9 +-
 .../serviceactions/ServiceActionUtil.java          |   33 +-
 .../serviceactions/ServiceActionsPanelFactory.java |    7 +-
 .../serviceactions/TertiaryActionsPanel.java       |   11 +-
 .../serviceactions/TertiaryMenuPanelFactory.java   |    7 +-
 .../actionprompt/ActionPromptHeaderPanel.java      |    1 +
 .../components/actions/ActionParametersForm.java   |    7 +-
 .../components/actions/ActionParametersPanel.java  |    2 +-
 .../bookmarkedpages/BookmarkedPagesPanel.java      |    6 +-
 .../collection/AssociatedWithActionsHelper.java    |    5 +-
 .../selector/CollectionSelectorHelper.java         |    2 +-
 .../selector/CollectionSelectorPanel.java          |    2 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   12 +-
 .../columns/ObjectAdapterPropertyColumn.java       |    2 +-
 .../components/entity/fieldset/PropertyGroup.java  |    8 +-
 .../entity/icontitle/EntityIconAndTitlePanel.java  |   19 +-
 .../wicket/ui/components/footer/CreditName.java    |    1 +
 .../wicket/ui/components/footer/FooterPanel.java   |   15 +-
 .../components/layout/bs3/tabs/TabGroupPanel.java  |    6 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |    9 -
 .../components/scalars/ScalarPanelAbstract2.java   |    5 +-
 .../scalars/ScalarPanelSelect2Abstract.java        |   23 +-
 .../scalars/ScalarPanelTextFieldAbstract.java      |   16 +-
 .../ScalarPanelTextFieldDatePickerAbstract.java    |   11 +-
 .../scalars/ScalarPanelTextFieldNumeric.java       |    4 +-
 .../ui/components/scalars/TextFieldValueModel.java |    6 +-
 .../datepicker/TextFieldWithDateTimePicker.java    |    5 +-
 .../isisapplib/IsisBlobOrClobPanelAbstract.java    |   14 +-
 .../scalars/isisapplib/IsisPasswordPanel.java      |    3 +
 .../components/scalars/primitive/BooleanPanel.java |    8 +-
 .../scalars/reference/ReferencePanel.java          |   26 +-
 .../valuechoices/ValueChoicesSelect2Panel.java     |    6 +-
 .../components/tree/IsisToWicketTreeAdapter.java   |   35 +-
 .../wicket/ui/components/welcome/WelcomePanel.java |   10 +-
 .../widgets/breadcrumbs/BreadcrumbModel.java       |    4 +-
 .../widgets/breadcrumbs/BreadcrumbPanel.java       |    3 +-
 .../ui/components/widgets/favicon/Favicon.java     |   15 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |   30 +-
 .../ui/components/widgets/navbar/BrandLogo.java    |   17 +-
 .../ui/components/widgets/navbar/BrandName.java    |   24 +-
 .../ui/components/widgets/select2/Select2.java     |    6 +-
 .../ObjectAdapterMementoProviderAbstract.java      |   17 +-
 ...tAdapterMementoProviderForReferenceChoices.java |   12 +-
 ...entoProviderForReferenceObjectAutoComplete.java |    4 +-
 ...derForReferenceParamOrPropertyAutoComplete.java |    4 +-
 .../widgets/themepicker/ThemeChooser.java          |    2 +-
 .../wicket/ui/errors/ExceptionStackTracePanel.java |   25 +-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |   67 +-
 .../accmngt/AccountManagementPageAbstract.java     |   55 +-
 .../ui/pages/accmngt/EmailAvailableValidator.java  |   22 +-
 .../pages/accmngt/UsernameAvailableValidator.java  |   20 +-
 .../password_reset/PasswordResetEmailPanel.java    |   50 +-
 .../accmngt/password_reset/PasswordResetPage.java  |    6 +-
 .../accmngt/password_reset/PasswordResetPanel.java |   11 +-
 .../ui/pages/accmngt/register/RegisterPanel.java   |   10 +-
 .../pages/accmngt/signup/RegistrationFormPage.java |    6 +-
 .../accmngt/signup/RegistrationFormPanel.java      |   48 +-
 .../viewer/wicket/ui/pages/error/ErrorPage.java    |    6 +-
 .../isis/viewer/wicket/ui/pages/home/HomePage.java |   89 +-
 .../wicket/ui/pages/login/IsisSignInPanel.java     |   38 +-
 .../wicket/ui/pages/login/WicketLogoutPage.java    |   11 +-
 .../wicket/ui/pages/mmverror/MmvErrorPage.java     |   45 +-
 .../isis/viewer/wicket/ui/panels/FormAbstract.java |   17 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   78 +-
 .../viewer/wicket/ui/panels/PanelAbstract.java     |   32 +-
 .../isis/viewer/wicket/ui/panels/PanelUtil.java    |   10 +-
 .../wicket/ui/panels/PromptFormPanelAbstract.java  |    7 +-
 960 files changed, 12259 insertions(+), 12344 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixtures/FixtureType.java b/core/applib/src/main/java/org/apache/isis/applib/fixtures/FixtureType.java
index 5d19aa5..a11b3b8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixtures/FixtureType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixtures/FixtureType.java
@@ -39,7 +39,7 @@ public enum FixtureType {
      */
     DOMAIN_OBJECTS,
     /**
-     * A fixture that does not installs data into the object store.
+     * A fixture that does not install data into the object store.
      *
      * <p>
      * Fixtures of this type are always installed. Typical examples are:
@@ -50,5 +50,13 @@ public enum FixtureType {
      * ).
      * </ul>
      */
-    OTHER;
+    OTHER
+    
+    ;
+	
+	public boolean isAlwaysInstall() {
+		return this == OTHER;
+	}
+	
+	
 }
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/BuilderScriptAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/BuilderScriptAbstract.java
index 00d6124..472539f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/BuilderScriptAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/BuilderScriptAbstract.java
@@ -50,7 +50,7 @@ extends FixtureScript implements WithPrereqs<T>, FixtureScriptWithExecutionStrat
             final FixtureScript parentFixtureScript,
             final ExecutionContext executionContext) {
 
-        parentFixtureScript.serviceRegistry.injectServicesInto(this);
+        parentFixtureScript.serviceInjector.injectServicesInto(this);
 
         execPrereqs(executionContext);
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
index 1cd2c5e..e15d01f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
@@ -39,6 +39,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.fixtures.FixtureType;
 import org.apache.isis.applib.fixtures.InstallableFixture;
 import org.apache.isis.applib.services.factory.FactoryService;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.sessmgmt.SessionManagementService;
@@ -609,7 +610,7 @@ implements InstallableFixture {
             if(localNameOverride != null) {
                 childFixtureScript.setLocalName(localNameOverride);
             }
-            callingFixtureScript.serviceRegistry.injectServicesInto(childFixtureScript);
+            callingFixtureScript.serviceInjector.injectServicesInto(childFixtureScript);
 
             final T childOrPreviouslyExecuted = executeChildIfNotAlready(childFixtureScript);
 
@@ -1030,6 +1031,9 @@ implements InstallableFixture {
 
     @javax.inject.Inject
     protected ServiceRegistry serviceRegistry;
+    
+    @javax.inject.Inject
+    protected ServiceInjector serviceInjector;
 
     @javax.inject.Inject
     protected RepositoryService repositoryService;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
index 63bf5ac..1c0b2ca 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
@@ -45,6 +45,7 @@ import org.apache.isis.applib.services.classdiscovery.ClassDiscoveryService;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.fixturespec.FixtureScriptsDefault;
 import org.apache.isis.applib.services.fixturespec.FixtureScriptsSpecification;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.repository.RepositoryService;
@@ -304,7 +305,7 @@ public abstract class FixtureScripts extends AbstractService {
         // if this method is called programmatically, the caller may have simply new'd up the fixture script
         // (rather than use container.newTransientInstance(...).  To allow this use case, we need to ensure that
         // domain services are injected into the fixture script.
-        serviceRegistry.injectServicesInto(fixtureScript);
+        serviceInjector.injectServicesInto(fixtureScript);
 
         return fixtureScript.withTracing(fixtureTracing.get()).run(parameters);
     }
@@ -365,7 +366,7 @@ public abstract class FixtureScripts extends AbstractService {
     @Programmatic
     public <T> T runBuilderScript(final BuilderScriptAbstract<T> fixtureScript) {
 
-        serviceRegistry.injectServicesInto(fixtureScript);
+        serviceInjector.injectServicesInto(fixtureScript);
 
         fixtureScript.run(null);
 
@@ -481,7 +482,10 @@ public abstract class FixtureScripts extends AbstractService {
 
     @javax.inject.Inject
     ServiceRegistry serviceRegistry;
-
+    
+    @javax.inject.Inject
+    ServiceInjector serviceInjector;
+    
     @javax.inject.Inject
     RepositoryService repositoryService;
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/metamodel/ManagedObjectSort.java b/core/applib/src/main/java/org/apache/isis/applib/metamodel/ManagedObjectSort.java
new file mode 100644
index 0000000..7943133
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/metamodel/ManagedObjectSort.java
@@ -0,0 +1,85 @@
+/*
+ *  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.metamodel;
+
+public enum ManagedObjectSort {
+    
+    /**
+     * Stateful object, with a state that can be marshaled and unmarshaled.  
+     */
+    VIEW_MODEL,
+    
+    /**
+     * Persistable object, associated with a persistence layer/context. 
+     */
+    ENTITY,
+    
+    /**
+     * Injectable object, associated with a lifecycle context 
+     * (application-scoped, request-scoped, ...).
+     */
+    BEAN, 
+    
+    /**
+     * Object associated with an 'entity' or 'bean' to act as contributer of 
+     * domain actions or properties.  
+     */
+    MIXIN,
+    
+    /**
+     * Immutable, serializable object.
+     */
+    VALUE,
+    
+    /**
+     * Container of objects.
+     */
+    COLLECTION,
+    
+    UNKNOWN;
+
+    public boolean isBean() {
+        return this == BEAN;
+    }
+
+    public boolean isMixin() {
+        return this == MIXIN;
+    }
+
+    public boolean isViewModel() {
+        return this == VIEW_MODEL;
+    }
+
+    public boolean isValue() {
+        return this == VALUE;
+    }
+
+    public boolean isCollection() {
+        return this == COLLECTION;
+    }
+
+    public boolean isEntity() {
+        return this == ENTITY;
+    }
+
+    public boolean isUnknown() {
+        return this == UNKNOWN;
+    }
+
+}
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerComposite.java b/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerComposite.java
index 5f987a4..50e612b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerComposite.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerComposite.java
@@ -28,6 +28,7 @@ import javax.annotation.PreDestroy;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.collections._Lists;
 
@@ -145,7 +146,7 @@ public class ExceptionRecognizerComposite implements ExceptionRecognizer {
     protected void injectServices() {
         if(serviceRegistry != null) {
             for (final ExceptionRecognizer ers : exceptionRecognizers) {
-                serviceRegistry.injectServicesInto(ers);
+                serviceInjector.injectServicesInto(ers);
             }
         }
     }
@@ -171,6 +172,10 @@ public class ExceptionRecognizerComposite implements ExceptionRecognizer {
 
     @javax.inject.Inject
     ServiceRegistry serviceRegistry;
+    
+    @javax.inject.Inject
+    ServiceInjector serviceInjector;
+    
     @javax.inject.Inject
     TranslationService translationService;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/InjectorMethodEvaluator.java b/core/applib/src/main/java/org/apache/isis/applib/services/inject/ServiceInjector.java
similarity index 74%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/InjectorMethodEvaluator.java
copy to core/applib/src/main/java/org/apache/isis/applib/services/inject/ServiceInjector.java
index f67f585..31cb535 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/InjectorMethodEvaluator.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/inject/ServiceInjector.java
@@ -14,13 +14,18 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.metamodel.spec;
-
-import java.lang.reflect.Method;
-
-public interface InjectorMethodEvaluator {
-
-    boolean isInjectorMethodFor(Method method, Class<? extends Object> serviceClass);
+package org.apache.isis.applib.services.inject;
 
+/**
+ * Resolves injection points using the ServiceRegistry.
+ * <p>
+ * Implementation must be thread-safe.
+ * </p>
+ * 
+ * @since 2.0.0-M3
+ */
+public interface ServiceInjector {
 
+    <T> T injectServicesInto(final T domainObject);
+    
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
index c4ca34e..c3d03cf 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.domain.DomainObjectList;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.schema.utils.jaxbadapters.PersistentEntitiesAdapter;
@@ -84,22 +85,25 @@ public class JaxbServiceDefault extends JaxbService.Simple {
     @Override
     protected void configure(final Unmarshaller unmarshaller) {
         unmarshaller.setAdapter(PersistentEntityAdapter.class,
-                serviceRegistry.injectServicesInto(new PersistentEntityAdapter()));
+                serviceInjector.injectServicesInto(new PersistentEntityAdapter()));
         unmarshaller.setAdapter(PersistentEntitiesAdapter.class,
-                serviceRegistry.injectServicesInto(new PersistentEntitiesAdapter()));
+                serviceInjector.injectServicesInto(new PersistentEntitiesAdapter()));
     }
 
     @Override
     protected void configure(final Marshaller marshaller) {
         marshaller.setAdapter(PersistentEntityAdapter.class,
-                serviceRegistry.injectServicesInto(new PersistentEntityAdapter()));
+                serviceInjector.injectServicesInto(new PersistentEntityAdapter()));
         marshaller.setAdapter(PersistentEntitiesAdapter.class,
-                serviceRegistry.injectServicesInto(new PersistentEntitiesAdapter()));
+                serviceInjector.injectServicesInto(new PersistentEntitiesAdapter()));
     }
 
 
     @javax.inject.Inject
     ServiceRegistry serviceRegistry;
+    
+    @javax.inject.Inject
+    ServiceInjector serviceInjector;
 
     @javax.inject.Inject
     MetaModelService metaModelService5;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutService.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutService.java
index aca743e..a75891b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutService.java
@@ -17,8 +17,8 @@
 package org.apache.isis.applib.services.layout;
 
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.layout.grid.Grid;
+import org.apache.isis.applib.services.menu.MenuBarsService;
 
 public interface LayoutService {
 
@@ -68,12 +68,17 @@ public interface LayoutService {
     /**
      * Obtains the serialized XML form of the layout (grid) for the specified domain class.
      */
-    @Programmatic
     String toXml(Class<?> domainClass, Style style);
 
     /**
      * Obtains a zip file of the serialized XML of the layouts (grids) of all domain entities and view models.
      */
-    @Programmatic
     byte[] toZip(final Style style);
+    
+    /**
+     * Obtains the serialized XML form of the menu bars layout ({@link MenuBarsService}).
+     * @param type - either the current menubars (could be loaded from a file) or the fallback (obtained from metamodel facets)
+     */
+    String toMenuBarsXml(final MenuBarsService.Type type);
+
 }
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
index a2ec9b3..d8a2b66 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
@@ -24,7 +24,7 @@ import java.util.List;
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.AppManifest2;
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.metamodel.ManagedObjectSort;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.CommandDtoProcessor;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -42,17 +42,14 @@ public interface MetaModelService {
     /**
      * Provides a reverse lookup of a domain class' object type, as defined by {@link DomainObject#objectType()} (or any other mechanism that corresponds to Isis' <code>ObjectSpecIdFacet</code>).
      */
-    @Programmatic
     Class<?> fromObjectType(final String objectType);
 
     /**
      * Provides a lookup of a domain class' object type, as defined by {@link DomainObject#objectType()} (or any other mechanism that corresponds to Isis' <code>ObjectSpecIdFacet</code>).
      */
-    @Programmatic
     String toObjectType(final Class<?> domainType);
 
 
-    @Programmatic
     void rebuild(final Class<?> domainType);
 
     /**
@@ -68,53 +65,11 @@ public interface MetaModelService {
      *
      * @see MetaModelService6
      */
-    @Programmatic
     DomainModel getDomainModel();
 
-    @Programmatic
-    Sort sortOf(Class<?> domainType, Mode mode);
+    ManagedObjectSort sortOf(Class<?> domainType, Mode mode);
 
-    @Programmatic
-    Sort sortOf(Bookmark bookmark, Mode mode);
-
-    enum Sort {
-        VIEW_MODEL,
-        JDO_ENTITY,
-        DOMAIN_SERVICE,
-        MIXIN,
-        VALUE,
-        COLLECTION,
-        UNKNOWN;
-
-        public boolean isDomainService() {
-            return this == DOMAIN_SERVICE;
-        }
-
-        public boolean isMixin() {
-            return this == MIXIN;
-        }
-
-        public boolean isViewModel() {
-            return this == VIEW_MODEL;
-        }
-
-        public boolean isValue() {
-            return this == VALUE;
-        }
-
-        public boolean isCollection() {
-            return this == COLLECTION;
-        }
-
-        public boolean isJdoEntity() {
-            return this == JDO_ENTITY;
-        }
-
-        public boolean isUnknown() {
-            return this == UNKNOWN;
-        }
-
-    }
+    ManagedObjectSort sortOf(Bookmark bookmark, Mode mode);
 
     enum Mode {
         /**
@@ -130,16 +85,13 @@ public interface MetaModelService {
     /**
      * @return as {@link #getAppManifest()}, downcasted (else null).
      */
-    @Programmatic
     AppManifest2 getAppManifest2();
 
     /**
      * @return the {@link AppManifest} used to bootstrap the application.
      */
-    @Programmatic
     AppManifest getAppManifest();
 
-    @Programmatic
     CommandDtoProcessor commandDtoProcessorFor(String memberIdentifier);
 
     public static class Config {
@@ -160,10 +112,6 @@ public interface MetaModelService {
             this.mask = mask;
             this.packagePrefixes = Collections.unmodifiableList(packagePrefixes);
         }
-        private Config(final int mask) {
-            this(mask, null);
-        }
-
 
         public Config withIgnoreNoop() {
             return newConfigWith(IGNORE_NOOP_FACETS);
@@ -220,7 +168,6 @@ public interface MetaModelService {
 
     }
 
-    @Programmatic
     MetamodelDto exportMetaModel(final Config config);
 
 }
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 2ff7363..5336dad 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
@@ -19,52 +19,171 @@
 
 package org.apache.isis.applib.services.registry;
 
+import java.lang.annotation.Annotation;
+import java.util.Comparator;
+import java.util.NoSuchElementException;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
+import javax.annotation.Priority;
 
-public interface ServiceRegistry {
+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.commons.ioc.BeanAdapter;
+import org.apache.isis.core.commons.collections.Bin;
+
+import lombok.val;
 
-    @Programmatic
-    <T> T injectServicesInto(final T domainObject);
+/**
+ * 
+ * @since 2.0.0
+ *
+ */
+public interface ServiceRegistry {
 
 
     /**
-     * @return Stream of all currently registered service instances.
+     * Whether or not the given type is annotated @DomainService.
+     * @param cls
+     * @return
      */
-    @Programmatic
-    Stream<Object> streamServices();
-
-    @Programmatic
-    <T> Stream<T> streamServices(Class<T> serviceClass);
+    boolean isDomainServiceType(Class<?> cls);
     
     /**
-     * Returns the first registered domain service implementing the requested type.
-     *
-     * <p>
-     * Typically there will only ever be one domain service implementing a given type,
-     * (eg {@link org.apache.isis.applib.services.repository.RepositoryService}), but for some services there can be
-     * more than one (eg {@link ExceptionRecognizer}).
+     * Obtains a child Instance for the given required type and additional required qualifiers. 
+     * @param type
+     * @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
      */
-    @Programmatic
-    public default <T> Optional<T> lookupService(final Class<T> serviceClass) {
-        return streamServices(serviceClass)
-                .findFirst();
+    default public <T> Bin<T> select(
+            final Class<T> type, Annotation[] qualifiers){
+        
+        val bin = qualifiers!=null
+                ? _CDI.select(type, _CDI.filterQualifiers(qualifiers))
+                    : _CDI.select(type);
+                
+        return bin;
     }
-
-    @Programmatic
-    public default boolean isService(final Class<?> serviceClass) {
-        return lookupService(serviceClass).isPresent();
+    
+    default public <T> Bin<T> select(final Class<T> type){
+        return select(type, _Constants.emptyAnnotations);
+    }
+    
+    /**
+     * Returns all bean adapters implementing the requested type.
+     */
+    default Stream<BeanAdapter> streamRegisteredBeansOfType(Class<?> requiredType) {
+        return streamRegisteredBeans()
+        .filter(beanAdapter->beanAdapter.isCandidateFor(requiredType));
+    }
+    
+    /**
+     * Returns all bean adapters that have been registered.
+     */
+    public Stream<BeanAdapter> streamRegisteredBeans();
+    
+    /**
+     * Returns a domain service implementing the requested type.
+     * <p>
+     * If this lookup is ambiguous, the service annotated with highest priority is returned.
+     * see {@link Priority}   
+     */
+    default public <T> Optional<T> lookupService(final Class<T> serviceClass) {
+        
+        val bin = select(serviceClass);
+        if(bin.isEmpty()) {
+            return Optional.empty();
+        }
+        if(bin.isCardinalityOne()) {
+            return bin.getSingleton();
+        }
+        // dealing with ambiguity, get the one, with highest priority annotated
+        
+        val prioComparator = InstanceByPriorityComparator.instance();
+        val toMaxPrioReduction =
+                //TODO [2033] not tested yet, whether the 'direction' is correct < vs >
+                _Reduction.<T>of((max, next)-> prioComparator.leftIsHigherThanRight(next, max) ? next : max);
+        
+        bin.forEach(toMaxPrioReduction);
+        
+        return toMaxPrioReduction.getResult();
     }
 
-    @Programmatic
     public default <T> T lookupServiceElseFail(final Class<T> serviceClass) {
-        return streamServices(serviceClass)
-                .findFirst()
+        return lookupService(serviceClass)
                 .orElseThrow(()->
-                    new IllegalStateException("Could not locate service of type '" + serviceClass + "'"));
+                new NoSuchElementException("Could not locate service of type '" + serviceClass + "'"));
+    }
+    
+    @Deprecated //TODO [2033] as long as services are wrapped into ObjectAdapters that require a 
+    // pojo, this is still required
+    Stream<Object> streamServices();
+    
+    /**
+     * @param cls
+     * @return whether the exact type is registered as service
+     */
+    @Deprecated //TODO [2033] marked deprecated, because this should not be required by the 
+    // framework at all, its also hard to implement correctly
+    boolean isRegisteredBean(Class<?> cls);
+    
+    /**
+     * synonym for isRegisteredBean
+     * @param cls
+     * @return
+     */
+    @Deprecated //TODO [2033] marked deprecated, because this should not be required by the
+    default boolean isService(Class<?> cls) {
+        return isRegisteredBean(cls);
+    }
+    
+    /**
+     * Verify domain service Ids are unique.
+     * @throws IllegalStateException - if validation fails
+     */
+    void validateServices();
+    
+
+    // -- PRIORITY ANNOTATION HANDLING
+    
+    static class InstanceByPriorityComparator implements Comparator<Object> {
+        
+        private final static InstanceByPriorityComparator INSTANCE =
+                new InstanceByPriorityComparator();
+        
+        public static InstanceByPriorityComparator instance() {
+            return INSTANCE;
+        }
+
+        @Override
+        public int compare(Object o1, Object o2) {
+            
+            if(o1==null) {
+                if(o2==null) {
+                    return 0;
+                } else {
+                    return -1; // o1 < o2
+                }
+            } 
+            if(o2==null) {
+                return 1; // o1 > o2
+            }
+            
+            val prioAnnot1 = _Reflect.getAnnotation(o1.getClass(), Priority.class);
+            val prioAnnot2 = _Reflect.getAnnotation(o2.getClass(), Priority.class);
+            val prio1 = prioAnnot1!=null ? prioAnnot1.value() : 0;
+            val prio2 = prioAnnot2!=null ? prioAnnot2.value() : 0;
+            return Integer.compare(prio1, prio2);
+        }
+        
+        public boolean leftIsHigherThanRight(Object left, Object right) {
+            return compare(left, right) > 0;
+        }
+        
     }
+
     
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionService.java b/core/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionService.java
index 4b9633c..8b2c58c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionService.java
@@ -20,6 +20,7 @@
 package org.apache.isis.applib.services.xactn;
 
 import java.util.concurrent.CountDownLatch;
+import java.util.function.Supplier;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.command.Command;
@@ -118,6 +119,8 @@ public interface TransactionService {
      */
     void nextTransaction(Policy policy, Command command);
 
+    void executeWithinTransaction(Runnable task);
+    <T> T executeWithinTransaction(Supplier<T> task);
 
     public enum Policy {
         UNLESS_MARKED_FOR_ABORT,
diff --git a/core/applib/src/main/java/org/apache/isis/applib/value/Blob.java b/core/applib/src/main/java/org/apache/isis/applib/value/Blob.java
index ca60faa..79f0b48 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/value/Blob.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/value/Blob.java
@@ -21,14 +21,13 @@ package org.apache.isis.applib.value;
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Objects;
 
 import javax.activation.MimeType;
 import javax.activation.MimeTypeParseException;
 
-public final class Blob implements NamedWithMimeType, Serializable {
+public final class Blob implements NamedWithMimeType {
 
     /**
      * Computed for state:
diff --git a/core/applib/src/main/java/org/apache/isis/applib/value/Clob.java b/core/applib/src/main/java/org/apache/isis/applib/value/Clob.java
index e694577..b326950 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/value/Clob.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/value/Clob.java
@@ -20,14 +20,13 @@
 package org.apache.isis.applib.value;
 
 import java.io.IOException;
-import java.io.Serializable;
 import java.io.Writer;
 import java.util.Objects;
 
 import javax.activation.MimeType;
 import javax.activation.MimeTypeParseException;
 
-public final class Clob implements NamedWithMimeType, Serializable {
+public final class Clob implements NamedWithMimeType {
 
     private static final long serialVersionUID = 8694189924062378527L;
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/value/NamedWithMimeType.java b/core/applib/src/main/java/org/apache/isis/applib/value/NamedWithMimeType.java
index db2493a..8910174 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/value/NamedWithMimeType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/value/NamedWithMimeType.java
@@ -19,9 +19,11 @@
 
 package org.apache.isis.applib.value;
 
+import java.io.Serializable;
+
 import javax.activation.MimeType;
 
-public interface NamedWithMimeType {
+public interface NamedWithMimeType extends Serializable {
 
     public String getName();
 
diff --git a/core/commons/pom.xml b/core/commons/pom.xml
index 5f2e447..1dcbef2 100644
--- a/core/commons/pom.xml
+++ b/core/commons/pom.xml
@@ -1,134 +1,135 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
+<!-- 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
 
-    <parent>
-        <groupId>org.apache.isis.core</groupId>
-        <artifactId>isis</artifactId>
-        <version>${revision}</version>
-    </parent>
+	<parent>
+		<groupId>org.apache.isis.core</groupId>
+		<artifactId>isis</artifactId>
+		<version>${revision}</version>
+	</parent>
 
-    <artifactId>isis-core-commons</artifactId>
+	<artifactId>isis-core-commons</artifactId>
 
-    <name>Apache Isis Commons</name>
-    <description>
+	<name>Apache Isis Commons</name>
+	<description>
         Isis library, defining utilities required by both Applib and Unittestsupport.
     </description>
 
-    <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.commons</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/commons</git-plugin.propertiesDir>
-        
-        <lombok.version>[1.18.,)</lombok.version>
-    </properties>
+	<properties>
+		<jar-plugin.automaticModuleName>org.apache.isis.commons</jar-plugin.automaticModuleName>
+		<git-plugin.propertiesDir>org/apache/isis/commons</git-plugin.propertiesDir>
 
-    <build>
-        <resources>
-            <resource>
-                <filtering>false</filtering>
-                <directory>src/main/resources</directory>
-            </resource>
-            <resource>
-                <filtering>false</filtering>
-                <directory>src/main/java</directory>
-                <includes>
-                    <include>**</include>
-                </includes>
-                <excludes>
-                    <exclude>**/*.java</exclude>
-                </excludes>
-            </resource>
-        </resources>
-    </build>
+		<lombok.version>[1.18.,)</lombok.version>
+	</properties>
 
-    <dependencies>
-    
-    	<!-- JEE API -->
-        <dependency>
-		    <groupId>javax</groupId>
-		    <artifactId>javaee-api</artifactId>
+	<build>
+		<resources>
+			<resource>
+				<filtering>false</filtering>
+				<directory>src/main/resources</directory>
+			</resource>
+			<resource>
+				<filtering>false</filtering>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**</include>
+				</includes>
+				<excludes>
+					<exclude>**/*.java</exclude>
+				</excludes>
+			</resource>
+		</resources>
+	</build>
+
+	<dependencies>
+
+		<!-- JEE API -->
+		<dependency>
+			<groupId>javax</groupId>
+			<artifactId>javaee-api</artifactId>
 		</dependency>
 
 		<!-- provides @Nullable -->
-        <dependency>
-        	<groupId>com.google.code.findbugs</groupId>
-        	<artifactId>annotations</artifactId>
-        </dependency>
-        
-        <dependency>
-        	<groupId>org.projectlombok</groupId>
-        	<artifactId>lombok</artifactId>
-        	<version>${lombok.version}</version>
-        </dependency>
-        
 		<dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
+			<groupId>com.google.code.findbugs</groupId>
+			<artifactId>annotations</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>${lombok.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-databind</artifactId>
+		</dependency>
+
+		<!-- TODO[2112] integrate with parent POM -->
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context</artifactId>
+			<version>5.1.5.RELEASE</version>
+		</dependency>
 
-    </dependencies>
+	</dependencies>
 
-    <profiles>
-        <profile>
-            <id>flatten</id>
-            <activation>
-                <property>
-                    <name>!skip.flatten</name>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>flatten-maven-plugin</artifactId>
-                        <version>1.0.0</version>
-                        <executions>
-                            <execution>
-                                <id>flatten</id>
-                                <phase>process-resources</phase>
-                                <goals>
-                                    <goal>flatten</goal>
-                                </goals>
-                                <configuration>
-                                    <flattenMode>defaults</flattenMode>
-                                    <updatePomFile>true</updatePomFile>
-                                    <pomElements>
-                                        <name>resolve</name>
-                                        <description>resolve</description>
-                                        <dependencies>resolve</dependencies>
-                                    </pomElements>
-                                </configuration>
-                            </execution>
-                            <execution>
-                                <id>flatten.clean</id>
-                                <phase>clean</phase>
-                                <goals>
-                                    <goal>clean</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
+	<profiles>
+		<profile>
+			<id>flatten</id>
+			<activation>
+				<property>
+					<name>!skip.flatten</name>
+				</property>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>flatten-maven-plugin</artifactId>
+						<version>1.0.0</version>
+						<executions>
+							<execution>
+								<id>flatten</id>
+								<phase>process-resources</phase>
+								<goals>
+									<goal>flatten</goal>
+								</goals>
+								<configuration>
+									<flattenMode>defaults</flattenMode>
+									<updatePomFile>true</updatePomFile>
+									<pomElements>
+										<name>resolve</name>
+										<description>resolve</description>
+										<dependencies>resolve</dependencies>
+									</pomElements>
+								</configuration>
+							</execution>
+							<execution>
+								<id>flatten.clean</id>
+								<phase>clean</phase>
+								<goals>
+									<goal>clean</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
 
 </project>
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/BeanAdapterCDI.java b/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/BeanAdapterCDI.java
new file mode 100644
index 0000000..132001b
--- /dev/null
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/BeanAdapterCDI.java
@@ -0,0 +1,55 @@
+/*
+ *  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.commons.internal.cdi;
+
+import javax.enterprise.inject.spi.Bean;
+
+import org.apache.isis.commons.ioc.BeanAdapter;
+import org.apache.isis.commons.ioc.LifecycleContext;
+import org.apache.isis.core.commons.collections.Bin;
+
+import lombok.Value;
+import lombok.val;
+
+@Value(staticConstructor="of")
+final class BeanAdapterCDI implements BeanAdapter {
+
+    private final String id;
+    private final LifecycleContext lifecycleContext;
+    private final Bean<?> bean;
+    private final boolean domainService;
+    
+    public Bin<?> getInstance() {
+        val type = bean.getBeanClass();
+        return _CDI.select(type, bean.getQualifiers());
+    }
+    
+    public boolean isCandidateFor(Class<?> requiredType) {
+        return bean.getTypes().stream()
+        .filter(type -> type instanceof Class)
+        .map(type->(Class<?>)type)
+        .anyMatch(type->requiredType.isAssignableFrom(type));
+    }
+
+    @Override
+    public Class<?> getBeanClass() {
+        return bean.getBeanClass(); //TODO[2033] does not work for 'produced' beans
+    }
+    
+}
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 0e26c48..d3f1090 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
@@ -19,15 +19,37 @@
 package org.apache.isis.commons.internal.cdi;
 
 import java.lang.annotation.Annotation;
+import java.util.Collection;
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
 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.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.CDI;
+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.exceptions._Exceptions;
+import org.apache.isis.commons.ioc.BeanAdapter;
+import org.apache.isis.commons.ioc.LifecycleContext;
+import org.apache.isis.core.commons.collections.Bin;
+import org.apache.isis.core.plugins.ioc.IocPlugin;
+
+import static org.apache.isis.commons.internal.base._NullSafe.isEmpty;
+import static org.apache.isis.commons.internal.base._NullSafe.stream;
+import static org.apache.isis.commons.internal.base._With.requires;
+
+import lombok.val;
 
 /**
  * <h1>- internal use only -</h1>
@@ -42,50 +64,78 @@ import org.apache.isis.commons.internal.base._NullSafe;
 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 
+     * will be added to the set of bean classes for the synthetic bean archive. 
+     */
+    public static void init(Supplier<Stream<Class<?>>> onDiscover) {
+        
+        if(cdi().isPresent()) {
+            return;
+        }
+        
+        requires(onDiscover, "onDiscover");
+        
+        // plug in the provider
+        final CDIProvider standaloneCDIProvider = IocPlugin.get().getCDIProvider(onDiscover.get());
+        CDI.setCDIProvider(standaloneCDIProvider);
+
+        // verify
+        if(!cdi().isPresent()) {
+            throw _Exceptions.unrecoverable("Could not resolve an instance of CDI.");
+        }
+        
+        //TODO[2112] we no longer embed WELD, remove ...
+        // proper CDI lifecycle support utilizing the fact that WELD provides a WeldContainer that 
+        // implements AutoCloseable, which we can put on the _Context, such that when _Context.clear()
+        // is called, gets properly closed
+        //final CheckedRunnable onClose = () -> ((AutoCloseable)CDI.current()).close();
+        //_Context.putSingleton(_CDI_Lifecycle.class, _CDI_Lifecycle.of(onClose));
+        
+    }
+    
+    /**
+     * Get the CDI BeanManager for the current context.
+     * @return non-null
+     * @throws RuntimeException - if no BeanManager could be resolved
+     */
+    public static BeanManager getBeanManager() {
+        return cdi().map(CDI::getBeanManager)
+                .orElseThrow(()->_Exceptions.unrecoverable("Could not resolve a BeanManager."));
+    }
+    
+    /**
      * 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<T> getManagedBean(final Class<T> subType, List<Annotation> qualifiers) {
-        if(_NullSafe.isEmpty(qualifiers)) {
-            return getManagedBean(subType);
+    public static <T> Bin<T> select(final Class<T> subType, Collection<Annotation> qualifiers) {
+        if(isEmpty(qualifiers)) {
+            return select(subType);
         }
         
         final Annotation[] _qualifiers = qualifiers.toArray(new Annotation[] {});
         
         return cdi()
                 .map(cdi->tryGet(()->cdi.select(subType, _qualifiers)))
-                .map(instance->tryGet(instance::get));
+                .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<T> getManagedBean(final Class<T> subType) {
+    public static <T> Bin<T> select(final Class<T> subType) {
         return cdi()
                 .map(cdi->tryGet(()->cdi.select(subType)))
-                .map(instance->tryGet(instance::get));
+                .map(instance->Bin.ofInstance(instance))
+                .orElse(Bin.empty());
     }
     
-    /**
-     * Get the CDI instance that provides access to the current container. 
-     * @return an optional
-     */
-    public static Optional<CDI<Object>> cdi() {
-        try {
-            CDI<Object> cdi = CDI.current();
-            return Optional.ofNullable(cdi);
-        } catch (Exception e) {
-            return Optional.empty();
-        }
-    }
-
+    
     /**
      * Filters the input array into a collection, such that only annotations are retained, 
      * that are valid qualifiers for CDI.
@@ -93,7 +143,7 @@ public final class _CDI {
      * @return non-null
      */
     public static List<Annotation> filterQualifiers(final Annotation[] annotations) {
-        return _NullSafe.stream(annotations)
+        return stream(annotations)
         .filter(_CDI::isQualifier)
         .collect(Collectors.toList());
     }
@@ -109,10 +159,84 @@ public final class _CDI {
         return annotation.annotationType().getAnnotationsByType(Qualifier.class).length>0;
     }
     
+    // -- GENERIC SINGLETON RESOLVING
+    
+    /**
+     * @return CDI managed singleton wrapped in an Optional
+     */
+    public static <T> Optional<T> getSingleton(@Nullable Class<T> type) {
+        if(type==null) {
+            return Optional.empty();
+        }
+        return _CDI.select(type).getSingleton();
+    }
+    
+    /**
+     * @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
+    
+    public final static AnnotationLiteral<Any> QUALIFIER_ANY = 
+            new AnnotationLiteral<Any>() {
+        private static final long serialVersionUID = 1L;};
+    
+    private static Stream<Bean<?>> streamAllCDIBeans() {
+        BeanManager beanManager = _CDI.getBeanManager();
+        Set<Bean<?>> beans = beanManager.getBeans(Object.class, _CDI.QUALIFIER_ANY);
+        return beans.stream();
+    }
+    
+    /**
+     * 
+     * @param filterDomainService - usually ServiceRegistry::isDomainServiceType
+     * @param beanNameProvider - usually ServiceUtil::idOfBean
+     */
+    public static Stream<BeanAdapter> streamAllBeans(
+            Predicate<Class<?>> filterDomainService, 
+            Function<Bean<?>, String> beanNameProvider) {
+        
+        return streamAllCDIBeans()
+        .map(bean->{
+
+            val scope = bean.getScope().getSimpleName(); // also works for produced beans
+            val lifecycleContext = LifecycleContext.valueOf(scope);
+
+            // getBeanClass() does not work for produced beans as intended here! 
+            // (we do get the producer's class instead)
+            val type = bean.getBeanClass(); 
+            val isDomainService = filterDomainService.test(type);
+
+            val id = beanNameProvider.apply(bean);
+            val beanAdapter = BeanAdapterCDI.of(id, lifecycleContext, bean, isDomainService);
+            return beanAdapter;
+        });
+        
+    }
+        
     // -- HELPER
     
     private _CDI() {}
     
+    /**
+     * Get the CDI instance that provides access to the current container. 
+     * @return an optional
+     */
+    private static Optional<CDI<Object>> cdi() {
+        try {
+            CDI<Object> cdi = CDI.current();
+            return Optional.ofNullable(cdi);
+        } catch (Exception e) {
+            return Optional.empty();
+        }
+    }
+    
     private static <T> T tryGet(final Supplier<T> supplier) {
         try { 
             return supplier.get();  
@@ -121,4 +245,8 @@ public final class _CDI {
         }
     }
 
+
+    
+
+
 }
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/spring/BeanAdapterSpring.java b/core/commons/src/main/java/org/apache/isis/commons/internal/spring/BeanAdapterSpring.java
new file mode 100644
index 0000000..78b8d05
--- /dev/null
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/spring/BeanAdapterSpring.java
@@ -0,0 +1,38 @@
+package org.apache.isis.commons.internal.spring;
+
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.ObjectProvider;
+
+import org.apache.isis.commons.ioc.BeanAdapter;
+import org.apache.isis.commons.ioc.LifecycleContext;
+import org.apache.isis.core.commons.collections.Bin;
+
+import lombok.Value;
+import lombok.val;
+
+@Value(staticConstructor="of")
+final class BeanAdapterSpring implements BeanAdapter {
+
+    private final String id;
+    private final LifecycleContext lifecycleContext;
+    private final Class<?> beanClass;
+    private final ObjectProvider<?> beanProvider;
+    private final boolean domainService;
+    
+    @Override
+    public Bin<?> getInstance() {
+        val allMatchingBeans = beanProvider
+                .orderedStream()
+                .collect(Collectors.toList());
+        return Bin.ofCollection(allMatchingBeans);
+    }
+    
+    @Override
+    public boolean isCandidateFor(Class<?> requiredType) {
+        return beanProvider.stream()
+        .map(Object::getClass)
+        .anyMatch(type->requiredType.isAssignableFrom(type));
+    }
+    
+}
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/spring/_Spring.java b/core/commons/src/main/java/org/apache/isis/commons/internal/spring/_Spring.java
new file mode 100644
index 0000000..0ab6cb7
--- /dev/null
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/spring/_Spring.java
@@ -0,0 +1,119 @@
+/*
+ *  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.commons.internal.spring;
+
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import javax.annotation.Nullable;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.core.ResolvableType;
+
+import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.commons.ioc.BeanAdapter;
+import org.apache.isis.commons.ioc.LifecycleContext;
+import org.apache.isis.core.commons.collections.Bin;
+
+import lombok.val;
+
+/**
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Framework internal Spring support.
+ * <p>
+ * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/>
+ * These may be changed or removed without notice!
+ *
+ * @since 2.0.0
+ */
+public class _Spring {
+
+    public static void init(ApplicationContext context) {
+        _Context.putSingleton(ApplicationContext.class, context);
+    }
+    
+    public static ApplicationContext context() {
+        return _Context.getElseFail(ApplicationContext.class);
+    }
+    
+    public static <T> Bin<T> select(final Class<T> requiredType) {
+        val allMatchingBeans = context().getBeanProvider(requiredType).orderedStream();
+        return Bin.ofStream(allMatchingBeans);
+    }
+    
+    /**
+     * 
+     * @param filterDomainService - usually ServiceRegistry::isDomainServiceType
+     * @param beanNameProvider - usually ServiceUtil::idOfBean
+     */
+    public static Stream<BeanAdapter> streamAllBeans(
+            Predicate<Class<?>> filterDomainService) {
+        
+        val context = context();
+        val beanFactory = ((ConfigurableApplicationContext)context).getBeanFactory();
+        
+        return Stream.of(context.getBeanDefinitionNames())
+        .map(name->{
+        
+            
+            val type = context.getType(name);
+            val isDomainService = filterDomainService.test(type);
+            val id = name; // just reuse the bean's name
+            
+            val scope = beanFactory.getBeanDefinition(name).getScope();
+            val lifecycleContext = LifecycleContext.valueOf(scope);
+            
+            val resolvableType = ResolvableType.forClass(type);
+            val bean = context.getBeanProvider(resolvableType);
+            
+            val beanAdapter = BeanAdapterSpring.of(id, lifecycleContext, type, bean, isDomainService);
+            
+            return beanAdapter;
+        });
+
+        
+    }
+
+    /**
+     * @return Spring managed singleton wrapped in an Optional
+     */
+    public static <T> Optional<T> getSingleton(@Nullable Class<T> type) {
+        if(type==null) {
+            return Optional.empty();
+        }
+        return select(type).getSingleton();
+    }
+    
+    /**
+     * @return Spring 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));
+                        
+    }
+
+    
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorAware.java b/core/commons/src/main/java/org/apache/isis/commons/ioc/BeanAdapter.java
similarity index 74%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorAware.java
rename to core/commons/src/main/java/org/apache/isis/commons/ioc/BeanAdapter.java
index b7908f7..664cc32 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorAware.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/ioc/BeanAdapter.java
@@ -16,14 +16,18 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
+package org.apache.isis.commons.ioc;
 
-package org.apache.isis.core.metamodel.services;
+import org.apache.isis.core.commons.collections.Bin;
 
-import org.apache.isis.applib.annotation.Programmatic;
+public interface BeanAdapter {
 
-public interface ServicesInjectorAware {
+    String getId();
+    Bin<?> getInstance();
+    Class<?> getBeanClass();
 
-    @Programmatic
-    void setServicesInjector(ServicesInjector servicesInjector);
-
-}
+    boolean isCandidateFor(Class<?> requiredType);
+    boolean isDomainService();
+    
+    
+}
\ No newline at end of file
diff --git a/core/commons/src/main/java/org/apache/isis/commons/ioc/LifecycleContext.java b/core/commons/src/main/java/org/apache/isis/commons/ioc/LifecycleContext.java
new file mode 100644
index 0000000..2779c54
--- /dev/null
+++ b/core/commons/src/main/java/org/apache/isis/commons/ioc/LifecycleContext.java
@@ -0,0 +1,23 @@
+package org.apache.isis.commons.ioc;
+
+public enum LifecycleContext {
+    ApplicationScoped,
+    Singleton,
+    SessionScoped,
+    RequestScoped,
+    ConversationScoped,
+    Dependent,
+    ;
+
+    public boolean isApplicationScoped() {
+        return this == ApplicationScoped;
+    }
+    
+    public boolean isSingleton() {
+        return this == Singleton;
+    }
+    
+    public boolean isRequestScoped() {
+        return this == RequestScoped;
+    }
+}
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 2d565a0..91ee445 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
@@ -55,7 +55,7 @@ public interface Bin<T> extends Iterable<T> {
 		return Bin_Singleton.of(element);
 	}
 	
-	public static <T> Bin<T> ofCollection(@Nullable Collection<T> collection){
+	public static <T> Bin<T> ofCollection(@Nullable Collection<T> collection) {
 		
 		if(_NullSafe.size(collection)==0) {
 			return empty();
@@ -82,6 +82,29 @@ public interface Bin<T> extends Iterable<T> {
 		return Bin_Multiple.of(nonNullElements);
 	}
 	
+	public static <T> Bin<T> ofStream(@Nullable Stream<T> stream) {
+        
+        if(stream==null) {
+            return empty();
+        }
+        
+        val nonNullElements = stream
+                .filter(_NullSafe::isPresent)
+                .collect(Collectors.toCollection(()->new ArrayList<>()));        
+        
+        val size = nonNullElements.size();
+        
+        if(size==0) {
+            return empty();
+        }
+        
+        if(size==1) {
+            return ofSingleton(((List<T>)nonNullElements).get(0));
+        }
+        
+        return Bin_Multiple.of(nonNullElements);
+    }
+	
 	public static <T> Bin<T> ofInstance(@Nullable Instance<T> instance) {
 		if(instance==null || instance.isUnsatisfied()) {
 			return empty();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/InjectorMethodEvaluator.java b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/ConversationContextHandle.java
similarity index 78%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/InjectorMethodEvaluator.java
copy to core/commons/src/main/java/org/apache/isis/core/plugins/ioc/ConversationContextHandle.java
index f67f585..119c157 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/InjectorMethodEvaluator.java
+++ b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/ConversationContextHandle.java
@@ -1,4 +1,4 @@
-/**
+/*
  *  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.
@@ -14,13 +14,15 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.metamodel.spec;
-
-import java.lang.reflect.Method;
-
-public interface InjectorMethodEvaluator {
-
-    boolean isInjectorMethodFor(Method method, Class<? extends Object> serviceClass);
+package org.apache.isis.core.plugins.ioc;
 
+public interface ConversationContextHandle extends AutoCloseable {
 
+	void resume(String cid);
+	
+	/**
+	 * Refined to not throw a catched exception
+	 */
+	@Override void close();
+	
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/Util.java b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/ConversationContextService.java
similarity index 71%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/Util.java
copy to core/commons/src/main/java/org/apache/isis/core/plugins/ioc/ConversationContextService.java
index ae650ec..646ee68 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/Util.java
+++ b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/ConversationContextService.java
@@ -1,4 +1,4 @@
-/**
+/*
  *  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.
@@ -14,20 +14,17 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.runtime.services.i18n.po;
+package org.apache.isis.core.plugins.ioc;
 
-class Util {
+public interface ConversationContextService {
 
-    private Util(){}
-
-    static String withSuffix(String fileName, String suffix) {
-        if(!suffix.startsWith(".")) {
-            suffix = "." + suffix;
-        }
-        if(!fileName.endsWith(suffix)) {
-            fileName += suffix;
+	ConversationContextHandle startTransientConversation();
+	
+    static void closeHandle(ConversationContextHandle conversationContextHandle) {
+        if(conversationContextHandle!=null) {
+            conversationContextHandle.close();
         }
-        return fileName;
     }
+	
 
 }
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSessionProvider.java b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/ConversationContextServiceDefault.java
similarity index 58%
copy from core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSessionProvider.java
copy to core/commons/src/main/java/org/apache/isis/core/plugins/ioc/ConversationContextServiceDefault.java
index e737951..4ee4c0a 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSessionProvider.java
+++ b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/ConversationContextServiceDefault.java
@@ -1,4 +1,4 @@
-/**
+/*
  *  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.
@@ -14,16 +14,25 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.security.authentication;
+package org.apache.isis.core.plugins.ioc;
 
-import org.apache.isis.applib.annotation.Programmatic;
+import javax.annotation.Priority;
+import javax.enterprise.inject.Alternative;
+import javax.inject.Singleton;
 
 /**
- * This is implemented by an (internal) domain service
+ * Acts as a no-op implementation, that is used as lowest priority default, whenever
+ * service-provisioning can not find any alternative with higher priority.  
+ * 
+ * @since 2.0.0-M3
+ *
  */
-public interface AuthenticationSessionProvider {
+@Singleton @Alternative @Priority(0)
+public class ConversationContextServiceDefault implements ConversationContextService {
 
-    @Programmatic
-    AuthenticationSession getAuthenticationSession();
+	@Override
+	public ConversationContextHandle startTransientConversation() {
+		return null; // don't return a handle
+	}
 
 }
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTest.java b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/IocPlugin.java
similarity index 54%
copy from core/runtime/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTest.java
copy to core/commons/src/main/java/org/apache/isis/core/plugins/ioc/IocPlugin.java
index 4d5819d..40821d5 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTest.java
+++ b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/IocPlugin.java
@@ -1,4 +1,4 @@
-/**
+/*
  *  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.
@@ -14,15 +14,37 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.runtime.services;
+package org.apache.isis.core.plugins.ioc;
+
+import java.util.stream.Stream;
+
+import javax.enterprise.inject.spi.CDIProvider;
+
+import org.apache.isis.commons.internal.context._Plugin;
+
+/**
+ * 
+ * @since 2.0.0-M2
+ *
+ */
+public interface IocPlugin {
 
-import org.junit.Ignore;
-import org.junit.Test;
+    // -- INTERFACE
 
-public class ServiceInstantiatorTest {
+    public CDIProvider getCDIProvider(Stream<Class<?>> discover);
 
-    @Test @Ignore("all tests moved to core/detached-tests")
-    public void info() {
+    // -- LOOKUP
+
+    public static IocPlugin get() {
         
+        return _Plugin.getOrElse(IocPlugin.class,
+                ambiguousPlugins->{
+                    return _Plugin.pickAnyAndWarn(IocPlugin.class, ambiguousPlugins);
+                },
+                ()->{
+                    throw _Plugin.absenceNonRecoverable(IocPlugin.class);
+                });
     }
+    
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/InjectorMethodEvaluator.java b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextHandle.java
similarity index 79%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/InjectorMethodEvaluator.java
copy to core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextHandle.java
index f67f585..0433572 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/InjectorMethodEvaluator.java
+++ b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextHandle.java
@@ -1,4 +1,4 @@
-/**
+/*
  *  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.
@@ -14,13 +14,13 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.metamodel.spec;
-
-import java.lang.reflect.Method;
-
-public interface InjectorMethodEvaluator {
-
-    boolean isInjectorMethodFor(Method method, Class<? extends Object> serviceClass);
+package org.apache.isis.core.plugins.ioc;
 
+public interface RequestContextHandle extends AutoCloseable {
 
+	/**
+	 * Refined to not throw a catched exception
+	 */
+	@Override void close();
+	
 }
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTest.java b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextService.java
similarity index 73%
copy from core/runtime/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTest.java
copy to core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextService.java
index 4d5819d..0587038 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTest.java
+++ b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextService.java
@@ -1,4 +1,4 @@
-/**
+/*
  *  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.
@@ -14,15 +14,16 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.runtime.services;
+package org.apache.isis.core.plugins.ioc;
 
-import org.junit.Ignore;
-import org.junit.Test;
+public interface RequestContextService {
 
-public class ServiceInstantiatorTest {
-
-    @Test @Ignore("all tests moved to core/detached-tests")
-    public void info() {
-        
+	RequestContextHandle startRequest();
+	
+    static void closeHandle(RequestContextHandle requestContextHandle) {
+        if(requestContextHandle!=null) {
+            requestContextHandle.close();
+        }
     }
+
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/Util.java b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextServiceDefault.java
similarity index 59%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/Util.java
copy to core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextServiceDefault.java
index ae650ec..b0c716d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/Util.java
+++ b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextServiceDefault.java
@@ -1,4 +1,4 @@
-/**
+/*
  *  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.
@@ -14,20 +14,25 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.core.runtime.services.i18n.po;
+package org.apache.isis.core.plugins.ioc;
 
-class Util {
+import javax.annotation.Priority;
+import javax.enterprise.inject.Alternative;
+import javax.inject.Singleton;
 
-    private Util(){}
+/**
+ * Acts as a no-op implementation, that is used as lowest priority default, whenever
+ * service-provisioning can not find any alternative with higher priority.  
+ * 
+ * @since 2.0.0-M3
+ *
+ */
+@Singleton @Alternative @Priority(0)
+public class RequestContextServiceDefault implements RequestContextService {
 
-    static String withSuffix(String fileName, String suffix) {
-        if(!suffix.startsWith(".")) {
-            suffix = "." + suffix;
-        }
-        if(!fileName.endsWith(suffix)) {
-            fileName += suffix;
-        }
-        return fileName;
+    @Override
+    public RequestContextHandle startRequest() {
+        return null; // don't return a handle
     }
 
 }
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 eb671cb..17136d4 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
@@ -67,7 +67,7 @@ public final class AppConfigLocator {
     }
     
     private static AppConfig lookupAppConfig_UsingCDI() {
-        return _CDI.getManagedBean(AppConfig.class).orElse(null);
+        return _CDI.getSingletonElseFail(AppConfig.class);
     }
     
     private static AppConfig lookupAppConfig_UsingServiceLoader() {
diff --git a/core/config/src/main/java/org/apache/isis/config/beans/WebAppConfigBean.java b/core/config/src/main/java/org/apache/isis/config/beans/WebAppConfigBean.java
new file mode 100644
index 0000000..3266c9d
--- /dev/null
+++ b/core/config/src/main/java/org/apache/isis/config/beans/WebAppConfigBean.java
@@ -0,0 +1,24 @@
+package org.apache.isis.config.beans;
+
+import java.io.Serializable;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data @Builder
+public class WebAppConfigBean implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    
+    private String applicationName;
+    private String applicationVersion;
+    private String aboutMessage;
+    private String welcomeMessage;
+    private String faviconUrl;
+    private String faviconContentType;
+    private String brandLogoHeader;
+    private String brandLogoSignin;
+    private String applicationCss;
+    private String applicationJs;
+    
+}
diff --git a/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationBuilder.java b/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationBuilder.java
index 421e9d4..4514eff 100644
--- a/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationBuilder.java
+++ b/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationBuilder.java
@@ -104,6 +104,11 @@ public interface IsisConfigurationBuilder {
         return IsisConfigurationBuilderDefault.empty();
     }
 
+    static IsisConfigurationBuilder getDefaultForUnitTesting() {
+        System.setProperty("UNITTESTING", ""+true);
+        return getDefault();
+    }
+
     
 
 }
\ No newline at end of file
diff --git a/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
new file mode 100644
index 0000000..45f0a6e
--- /dev/null
+++ b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
@@ -0,0 +1,177 @@
+package org.apache.isis.config.registry;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+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;
+
+/**
+ * Holds the set of domain services, persistent entities and fixture scripts.services etc.
+ * @since 2.0.0-M3
+ */
+public final class IsisBeanTypeRegistry implements AutoCloseable {
+
+	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<>();
+    @Getter private final Set<Class<?>> domainServiceTypes = new HashSet<>();
+    @Getter private final Set<Class<?>> domainObjectTypes = new HashSet<>();
+    @Getter private final Set<Class<?>> viewModelTypes = new HashSet<>();
+    @Getter private final Set<Class<?>> xmlElementTypes = new HashSet<>();
+
+    private final List<Set<? extends Class<? extends Object>>> allTypeSets = _Lists.of(
+            entityTypes,
+            mixinTypes,
+            fixtureScriptTypes,
+            domainServiceTypes,
+            domainObjectTypes,
+            viewModelTypes,
+            xmlElementTypes);
+    
+    
+    @Override
+    public void close() {
+        inbox.clear();
+        allTypeSets.forEach(Set::clear);
+    }
+
+	// -- STREAM ALL
+
+	public Stream<Class<?>> streamAllTypes() {
+
+		return _Lists.of(
+				cdiManaged,
+				entityTypes,
+				mixinTypes,
+				fixtureScriptTypes,
+				domainServiceTypes,
+				domainObjectTypes,
+				viewModelTypes,
+				xmlElementTypes)
+				.stream()
+				.distinct()
+				.flatMap(Collection::stream)
+				;
+	}
+
+	// -- INBOX
+	
+	public void addToInbox(Class<?> type) {
+	    synchronized (inbox) {
+            inbox.add(type);
+        }
+	}
+	
+	/**
+	 * Implemented as a one-shot, that clears the inbox afterwards.
+	 * @return
+	 */
+    public Stream<Class<?>> streamAndClearInbox() {
+        
+        final List<Class<?>> defensiveCopy;
+        
+        synchronized (inbox) {
+            defensiveCopy = new ArrayList<>(inbox);
+            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 toCdi = false;
+        
+        if(typeMetaData.hasDomainServiceAnnotation()) {
+            //domainServiceTypes.add(typeMetaData.getUnderlyingClass());
+            toInbox = true;
+        }
+        
+        if(typeMetaData.hasDomainObjectAnnotation()) {
+            //domainObjectTypes.add(typeMetaData.getUnderlyingClass());
+            toInbox = true;
+        }
+        
+        if(typeMetaData.hasViewModelAnnotation()) {
+            //domainObjectTypes.add(typeMetaData.getUnderlyingClass());
+            toInbox = 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;
+    }
+    
+    // -- HELPER
+    
+    @Deprecated // not typesafe
+    public final static List<String> FRAMEWORK_PROVIDED_SERVICE_PACKAGES = _Lists.of(
+            "org.apache.isis.applib",
+            "org.apache.isis.core.wrapper" ,
+            "org.apache.isis.core.metamodel.services" ,
+            "org.apache.isis.core.runtime.services" ,
+            "org.apache.isis.schema.services" ,
+            "org.apache.isis.objectstore.jdo.applib.service" ,
+            "org.apache.isis.viewer.restfulobjects.rendering.service" ,
+            "org.apache.isis.objectstore.jdo.datanucleus.service.support" ,
+            "org.apache.isis.objectstore.jdo.datanucleus.service.eventbus" ,
+            "org.apache.isis.viewer.wicket.viewer.services", 
+            "org.apache.isis.core.integtestsupport.components");
+
+    @Deprecated // not typesafe
+    public final static List<String> FRAMEWORK_PROVIDED_TYPES_FOR_SCANNING = _Lists.of(
+            "org.apache.isis.config.AppConfig",
+            "org.apache.isis.applib.IsisApplibModule",
+            "org.apache.isis.core.wrapper.WrapperFactoryDefault",
+            "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.viewer.restfulobjects.rendering.RendererContext"
+            );
+
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..5171899
--- /dev/null
+++ b/core/config/src/main/java/org/apache/isis/config/registry/TypeMetaData.java
@@ -0,0 +1,74 @@
+package org.apache.isis.config.registry;
+
+import java.util.Set;
+
+import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+
+import lombok.Value;
+import lombok.val;
+
+@Value(staticConstructor="of")
+public class TypeMetaData {
+    
+    /**
+     * Fully qualified name of the underlying class.
+     */
+    String className;
+    
+    /**
+     * Fully qualified class names of all annotation types that are present on the underlying class.
+     */
+    Set<String> annotationTypes;
+    
+    public boolean hasSingletonAnnotation() {
+        return annotationTypes.contains(singletonAnnotation);
+    }
+    
+    public boolean hasRequestScopedAnnotation() {
+        return annotationTypes.contains(requestScopedAnnotation);
+    }
+    
+    public boolean hasDomainServiceAnnotation() {
+        return annotationTypes.contains(domainServiceAnnotation);
+    }
+    
+    public boolean hasDomainObjectAnnotation() {
+        return annotationTypes.contains(domainObjectAnnotation);
+    }
+    
+    public boolean hasMixinAnnotation() {
+        return annotationTypes.contains(mixinAnnotation);
+    }
+    
+    public boolean hasViewModelAnnotation() {
+        return annotationTypes.contains(viewModelAnnotation);
+    }
+    
+    /**
+     * @return the underlying class of this TypeMetaData
+     */
+    public Class<?> getUnderlyingClass() {
+        try {
+            return _Context.loadClass(className);
+        } catch (ClassNotFoundException e) {
+            val msg = String.format("Failed to load class for name '%s'", className);
+            throw _Exceptions.unrecoverable(msg, e);
+        }
+    }
+    
+    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 = 
+            org.apache.isis.applib.annotation.DomainObject.class.getName();
+    private final static String mixinAnnotation = 
+            org.apache.isis.applib.annotation.Mixin.class.getName();
+    private final static String viewModelAnnotation = 
+            org.apache.isis.applib.annotation.ViewModel.class.getName();
+
+    
+}
diff --git a/core/detached-tests/pom.xml b/core/detached-tests/pom.xml
index 2f0ba1e..d1ae7ad 100644
--- a/core/detached-tests/pom.xml
+++ b/core/detached-tests/pom.xml
@@ -49,7 +49,20 @@
         
         <dependency>
 			<groupId>org.apache.isis.core</groupId>
-			<artifactId>isis-core-runtime</artifactId>
+			<artifactId>isis-core-metamodel</artifactId>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+        
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-runtime-services</artifactId>
+			<scope>test</scope>
+		</dependency>
+        
+        <dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-runtime-extensions</artifactId>
 			<scope>test</scope>
 		</dependency>
         
diff --git a/core/detached-tests/src/test/java/org/apache/isis/core/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java b/core/detached-tests/src/test/java/org/apache/isis/core/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java
index e096653..2e92b12 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/core/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/core/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java
@@ -32,8 +32,11 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -45,7 +48,9 @@ public class ServiceInjectorTestUsingCodegenPlugin {
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
 
     private ServiceInstantiator serviceInstantiator;
-    private ServicesInjector serviceInjector;
+    private ServiceRegistry serviceRegistry;
+    private ServiceInjector serviceInjector;
+    
 
     @Before
     public void setUp() throws Exception {
@@ -57,28 +62,31 @@ public class ServiceInjectorTestUsingCodegenPlugin {
                 serviceInstantiator.createInstance(AccumulatingCalculator.class)
                 );
         
-        serviceInjector = ServicesInjector.builderForTesting()
+        ServicesInjector.builderForTesting()
                 .addServices(services)
                 .build();
+        
+        serviceRegistry = IsisContext.getServiceRegistry();
+        serviceInjector = IsisContext.getServiceInjector();
     }
 
     @Test
     public void singleton() {
-        SingletonCalculator calculator = serviceInjector.lookupService(SingletonCalculator.class).get();
+        SingletonCalculator calculator = serviceRegistry.lookupService(SingletonCalculator.class).get();
         assertThat(calculator.add(3), is(3));
-        calculator = serviceInjector.lookupService(SingletonCalculator.class).get();
+        calculator = serviceRegistry.lookupService(SingletonCalculator.class).get();
         assertThat(calculator.add(4), is(7));
     }
 
     @Test
     public void requestScoped_instantiate() {
-        final AccumulatingCalculator calculator = serviceInjector.lookupService(AccumulatingCalculator.class).get();
+        final AccumulatingCalculator calculator = serviceRegistry.lookupService(AccumulatingCalculator.class).get();
         assertThat(calculator instanceof RequestScopedService, is(true));
     }
 
     @Test
     public void requestScoped_justOneThread() {
-        final AccumulatingCalculator calculator = serviceInjector.lookupService(AccumulatingCalculator.class).get();
+        final AccumulatingCalculator calculator = serviceRegistry.lookupService(AccumulatingCalculator.class).get();
         
         try {
             ((RequestScopedService)calculator).__isis_startRequest(serviceInjector);
@@ -93,7 +101,7 @@ public class ServiceInjectorTestUsingCodegenPlugin {
     @Test
     public void requestScoped_multipleThreads() throws InterruptedException, ExecutionException {
         
-        final AccumulatingCalculator calculator = serviceInjector.lookupService(AccumulatingCalculator.class).get();
+        final AccumulatingCalculator calculator = serviceRegistry.lookupService(AccumulatingCalculator.class).get();
         final ExecutorService executor = Executors.newFixedThreadPool(10);
         
         // setup 32 tasks
diff --git a/core/detached-tests/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTestUsingCodegenPlugin.java b/core/detached-tests/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTestUsingCodegenPlugin.java
index 7131c20..085b8d0 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTestUsingCodegenPlugin.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/core/runtime/services/ServiceInstantiatorTestUsingCodegenPlugin.java
@@ -31,9 +31,9 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -49,7 +49,7 @@ public class ServiceInstantiatorTestUsingCodegenPlugin {
 
     @JUnitRuleMockery2.Ignoring
     @Mock
-    private ServicesInjector mockServiceInjector;
+    private ServiceInjector mockServiceInjector;
 
     @Before
     public void setUp() throws Exception {
diff --git a/core/detached-tests/src/test/java/org/apache/isis/testdomain/jdo/JdoTestDomainPersona.java b/core/detached-tests/src/test/java/org/apache/isis/testdomain/jdo/JdoTestDomainPersona.java
index b39d677..4e523fc 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/testdomain/jdo/JdoTestDomainPersona.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/testdomain/jdo/JdoTestDomainPersona.java
@@ -36,7 +36,7 @@ implements PersonaWithBuilderScript<BuilderScriptAbstract<Inventory>>  {
                 protected void execute(ExecutionContext ec) {
                     
                     //don't use lombok's val here (https://github.com/rzwitserloot/lombok/issues/434)
-                    RepositoryService repository = IsisContext.getServicesInjector()
+                    RepositoryService repository = IsisContext.getServiceRegistry()
                             .lookupServiceElseFail(RepositoryService.class);
                     
                     repository.allInstances(Inventory.class)
@@ -70,7 +70,7 @@ implements PersonaWithBuilderScript<BuilderScriptAbstract<Inventory>>  {
                 protected void execute(ExecutionContext ec) {
                     
                     //don't use lombok's val here (https://github.com/rzwitserloot/lombok/issues/434)
-                    RepositoryService repository = IsisContext.getServicesInjector()
+                    RepositoryService repository = IsisContext.getServiceRegistry()
                             .lookupServiceElseFail(RepositoryService.class);
                     
                     Set<Product> products = new HashSet<>();
diff --git a/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/AuditerServiceTest.java b/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/AuditerServiceTest.java
index da06c0d..9585250 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/AuditerServiceTest.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/AuditerServiceTest.java
@@ -57,7 +57,7 @@ class AuditerServiceTest extends JdoTestDomainIntegTest {
     @Test
     void auditerServiceShouldBeAwareOfInventoryChanges() {
         
-        val auditerServiceAny = IsisContext.getServicesInjector()
+        val auditerServiceAny = IsisContext.getServiceRegistry()
                 .lookupServiceElseFail(AuditerService.class);
         
         // priority based service lookup (could be a test on its own)
@@ -66,7 +66,7 @@ class AuditerServiceTest extends JdoTestDomainIntegTest {
 
         // given
         val auditerService = (AuditerServiceStub) auditerServiceAny; 
-        val repository = IsisContext.getServicesInjector()
+        val repository = IsisContext.getServiceRegistry()
                 .lookupServiceElseFail(RepositoryService.class);
         val txMan = IsisContext.getPersistenceSession().get().getTransactionManager();
         val book = repository.allInstances(Book.class).listIterator().next();
diff --git a/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/BootstrappingTest.java b/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/BootstrappingTest.java
index 54aa647..0365b02 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/BootstrappingTest.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/BootstrappingTest.java
@@ -27,6 +27,7 @@ import org.junit.jupiter.api.Test;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.resources._Json;
 import org.apache.isis.commons.internal.resources._Resources;
+import org.apache.isis.commons.ioc.BeanAdapter;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.testdomain.jdo.Inventory;
 import org.apache.isis.testdomain.jdo.JdoTestDomainIntegTest;
@@ -63,10 +64,11 @@ class BootstrappingTest extends JdoTestDomainIntegTest {
     @Test
     void builtInServicesShouldBeSetUp() throws IOException {
         
-        val serviceRegistry = IsisContext.getServicesInjector();
-        val managedServices = serviceRegistry.streamServiceTypes()
-        .map(Class::getName)
-        .collect(Collectors.toCollection(TreeSet::new));
+        val serviceRegistry = IsisContext.getServiceRegistry();
+        val managedServices = serviceRegistry.streamRegisteredBeans()
+                .map(BeanAdapter::getBeanClass)
+                .map(Class::getName)
+                .collect(Collectors.toCollection(TreeSet::new));
         
         val singletonJson = _Resources.loadAsString(this.getClass(), "builtin-singleton.json", StandardCharsets.UTF_8);
         val singletonSet = new TreeSet<>(_Json.readJsonList(String.class, singletonJson));
diff --git a/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/PublisherServiceTest.java b/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/PublisherServiceTest.java
index 28afa50..662a804 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/PublisherServiceTest.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/testdomain/tests/PublisherServiceTest.java
@@ -60,10 +60,11 @@ class PublisherServiceTest extends JdoTestDomainIntegTest {
     void publisherServiceShouldBeAwareOfInventoryChanges() {
         
         
-        val serviceRegistry = IsisContext.getServicesInjector();
+        val serviceRegistry = IsisContext.getServiceRegistry();
         
         Map<Class<? extends PublisherService>, PublisherService> map =
-                serviceRegistry.streamServices(PublisherService.class)
+                serviceRegistry.select(PublisherService.class)
+                .stream()
                 .collect(Collectors.toMap(ps->ps.getClass(), ps->ps));
         
         // TODO any instance type lookup (should be a test on its own)
@@ -74,7 +75,7 @@ class PublisherServiceTest extends JdoTestDomainIntegTest {
         
         // given
 //        val publisherService = (PublisherServiceStub) publisherServiceAny; 
-        val repository = IsisContext.getServicesInjector()
+        val repository = IsisContext.getServiceRegistry()
                 .lookupServiceElseFail(RepositoryService.class);
         val txMan = IsisContext.getPersistenceSession().get().getTransactionManager();
         val book = repository.allInstances(Book.class).listIterator().next();
diff --git a/core/integtestsupport/pom.xml b/core/integtestsupport/pom.xml
index 0703dad..9fc4635 100644
--- a/core/integtestsupport/pom.xml
+++ b/core/integtestsupport/pom.xml
@@ -1,146 +1,150 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.isis.core</groupId>
-        <artifactId>isis</artifactId>
-        <version>${revision}</version>
-    </parent>
-
-    <artifactId>isis-core-integtestsupport</artifactId>
-    <name>Apache Isis Integration Testing Support</name>
-
-    <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.core.integtestsupport</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/core/integtestsupport</git-plugin.propertiesDir>
-    </properties>
-
-    <dependencies>
-    
-        <!-- JDO API (non transient, provided by plugin) -->
-        <dependency>
-            <groupId>javax.jdo</groupId>
-            <artifactId>jdo-api</artifactId>
-            <version>${jdo-api.version}</version>
-            <!-- provided by plugins -->
-            <scope>provided</scope>
-        </dependency>
-    
-        <dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-unittestsupport</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-specsupport</artifactId>
-        </dependency>
-
-        <!-- JUPITER -->
-        <dependency>
-            <!-- JUnit API for writing tests and extensions -->
-            <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter-api</artifactId>
-        </dependency>
-        <dependency>
-            <!-- implementation of the JUnit Jupiter test engine -->
-            <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter-engine</artifactId>
-        </dependency>
-        <dependency>
-            <!-- support for unit tests that use JUnit 4 or JUnit 3 -->
-            <groupId>org.junit.vintage</groupId>
-            <artifactId>junit-vintage-engine</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jmock</groupId>
-            <artifactId>jmock</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jmock</groupId>
-            <artifactId>jmock-junit4</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-security</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-runtime</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-        </dependency>
-
-    </dependencies>
-
-    <profiles>
-        <profile>
-            <id>flatten</id>
-            <activation>
-                <property>
-                    <name>!skip.flatten</name>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>flatten-maven-plugin</artifactId>
-                        <version>1.0.0</version>
-                        <executions>
-                            <execution>
-                                <id>flatten</id>
-                                <phase>process-resources</phase>
-                                <goals>
-                                    <goal>flatten</goal>
-                                </goals>
-                                <configuration>
-                                    <flattenMode>defaults</flattenMode>
-                                    <updatePomFile>true</updatePomFile>
-                                    <pomElements>
-                                        <name>resolve</name>
-                                        <description>resolve</description>
-                                        <dependencies>resolve</dependencies>
-                                    </pomElements>
-                                </configuration>
-                            </execution>
-                            <execution>
-                                <id>flatten.clean</id>
-                                <phase>clean</phase>
-                                <goals>
-                                    <goal>clean</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
+<!-- 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.isis.core</groupId>
+		<artifactId>isis</artifactId>
+		<version>${revision}</version>
+	</parent>
+
+	<artifactId>isis-core-integtestsupport</artifactId>
+	<name>Apache Isis Integration Testing Support</name>
+
+	<properties>
+		<jar-plugin.automaticModuleName>org.apache.isis.core.integtestsupport</jar-plugin.automaticModuleName>
+		<git-plugin.propertiesDir>org/apache/isis/core/integtestsupport</git-plugin.propertiesDir>
+	</properties>
+
+	<dependencies>
+
+		<!-- JDO API (non transient, provided by plugin) -->
+		<dependency>
+			<groupId>javax.jdo</groupId>
+			<artifactId>jdo-api</artifactId>
+			<version>${jdo-api.version}</version>
+			<!-- provided by plugins -->
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-unittestsupport</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-specsupport</artifactId>
+		</dependency>
+
+		<!-- JUPITER -->
+		<dependency>
+			<!-- JUnit API for writing tests and extensions -->
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter-api</artifactId>
+		</dependency>
+		<dependency>
+			<!-- implementation of the JUnit Jupiter test engine -->
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter-engine</artifactId>
+		</dependency>
+		<dependency>
+			<!-- support for unit tests that use JUnit 4 or JUnit 3 -->
+			<groupId>org.junit.vintage</groupId>
+			<artifactId>junit-vintage-engine</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.jmock</groupId>
+			<artifactId>jmock</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.jmock</groupId>
+			<artifactId>jmock-junit4</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-security</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-runtime</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-runtime-services</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-runtime-extensions</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+		</dependency>
+
+	</dependencies>
+
+	<profiles>
+		<profile>
+			<id>flatten</id>
+			<activation>
+				<property>
+					<name>!skip.flatten</name>
+				</property>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>flatten-maven-plugin</artifactId>
+						<version>1.0.0</version>
+						<executions>
+							<execution>
+								<id>flatten</id>
+								<phase>process-resources</phase>
+								<goals>
+									<goal>flatten</goal>
+								</goals>
+								<configuration>
+									<flattenMode>defaults</flattenMode>
+									<updatePomFile>true</updatePomFile>
+									<pomElements>
+										<name>resolve</name>
+										<description>resolve</description>
+										<dependencies>resolve</dependencies>
+									</pomElements>
+								</configuration>
+							</execution>
+							<execution>
+								<id>flatten.clean</id>
+								<phase>clean</phase>
+								<goals>
+									<goal>clean</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
 
 </project>
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/ExceptionRecognizerTranslate.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/ExceptionRecognizerTranslate.java
index c4a3be9..85d6057 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/ExceptionRecognizerTranslate.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/ExceptionRecognizerTranslate.java
@@ -16,13 +16,12 @@
  */
 package org.apache.isis.core.integtestsupport;
 
-import java.util.stream.Stream;
-
 import org.junit.rules.MethodRule;
 import org.junit.runners.model.FrameworkMethod;
 import org.junit.runners.model.Statement;
 
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 
@@ -61,10 +60,11 @@ public class ExceptionRecognizerTranslate implements MethodRule {
      * Simply invokes {@link org.apache.isis.applib.services.exceprecog.ExceptionRecognizer#recognize(Throwable)} for all registered {@link org.apache.isis.applib.services.exceprecog.ExceptionRecognizer}s for the provided exception, so that the message will be translated.
      */
     private void recognize(final Throwable ex) {
-        final Stream<ExceptionRecognizer> exceptionRecognizers = getIsisSessionFactory().getServicesInjector().streamServices(ExceptionRecognizer.class);
-        exceptionRecognizers.forEach(exceptionRecognizer->{
-            @SuppressWarnings("unused")
-            final String unused = exceptionRecognizer.recognize(ex);
+        getServiceRegistry()
+        .select(ExceptionRecognizer.class)
+        .stream()
+        .forEach(exceptionRecognizer->{
+            exceptionRecognizer.recognize(ex);
         });
     }
 
@@ -72,4 +72,8 @@ public class ExceptionRecognizerTranslate implements MethodRule {
         return IsisContext.getSessionFactory();
     }
 
+    private ServiceRegistry getServiceRegistry() {
+        return IsisContext.getServiceRegistry();
+    }
+    
 }
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/HeadlessTransactionSupportDefault.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/HeadlessTransactionSupportDefault.java
index a5762b9..192549a 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/HeadlessTransactionSupportDefault.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/HeadlessTransactionSupportDefault.java
@@ -23,14 +23,13 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.runtime.headless.HeadlessTransactionSupport;
 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.session.IsisSessionFactory;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
-import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction.State;
+import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 
 @DomainService(nature=NatureOfService.DOMAIN)
 public class HeadlessTransactionSupportDefault implements HeadlessTransactionSupport {
@@ -156,8 +155,7 @@ public class HeadlessTransactionSupportDefault implements HeadlessTransactionSup
     // -- getService
 
     private <C> C getService(Class<C> serviceClass) {
-        final ServicesInjector servicesInjector = isisSessionFactory().getServicesInjector();
-        return servicesInjector.lookupServiceElseFail(serviceClass);
+        return getServiceRegistry().lookupServiceElseFail(serviceClass);
     }
 
     // -- Dependencies
@@ -167,12 +165,12 @@ public class HeadlessTransactionSupportDefault implements HeadlessTransactionSup
     }
 
     private PersistenceSession getPersistenceSession() {
-        return isisSessionFactory().getCurrentSession().getPersistenceSession();
+        return IsisContext.getPersistenceSession().orElse(null);
     }
 
-    private IsisSessionFactory isisSessionFactory() {
-        return IsisContext.getSessionFactory();
+    private ServiceRegistry getServiceRegistry() {
+        return IsisContext.getServiceRegistry();
     }
-
+    
 
 }
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java
index 5d012e4..cb8bb8e 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.integtestsupport.scenarios;
 import java.lang.reflect.Constructor;
 import java.util.Map;
 
-import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.runtime.headless.IsisSystem;
 
@@ -52,7 +52,7 @@ public class ObjectFactoryForIntegration implements ObjectFactory {
             IsisSystem isisSystem = IsisSystem.getElseNull();
             if(isisSystem != null) {
                 instance = this.cacheInstance(type, instance);
-                isisSystem.getService(ServiceRegistry.class).injectServicesInto(instance);
+                isisSystem.getService(ServiceInjector.class).injectServicesInto(instance);
             } else {
                 // don't cache
             }
diff --git a/core/legacy/transition-1-2/src/main/java/org/apache/isis/applib/DomainObjectContainer.java b/core/legacy/transition-1-2/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
index 1c24fb7..418e338 100644
--- a/core/legacy/transition-1-2/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
+++ b/core/legacy/transition-1-2/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
@@ -21,7 +21,6 @@ package org.apache.isis.applib;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
-import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
@@ -35,6 +34,7 @@ import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.security.UserMemento;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.i18n.TranslatableString;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
@@ -58,6 +58,7 @@ public class DomainObjectContainer {
 	@Inject private FactoryService factoryService;
 	@Inject private TitleService titleService;
 	@Inject private TransactionService transactionService;
+	@Inject private ServiceInjector serviceInjector;
 	@Inject private ServiceRegistry serviceRegistry;
 	@Inject private MessageService messageService;
 	@Inject private UserService userService;
@@ -195,7 +196,7 @@ public class DomainObjectContainer {
     		throw new IllegalArgumentException("parameter 'memento' is no longer supported");
     	}
     	T obj = factoryService.instantiate(ofType);
-    	serviceRegistry.injectServicesInto(obj);
+    	serviceInjector.injectServicesInto(obj);
     	return obj;
     }
 
@@ -257,7 +258,7 @@ public class DomainObjectContainer {
     @Deprecated
     @Programmatic
     public <T> T injectServicesInto(final T domainObject) {
-    	return serviceRegistry.injectServicesInto(domainObject);
+    	return serviceInjector.injectServicesInto(domainObject);
     }
 
     /**
@@ -275,8 +276,7 @@ public class DomainObjectContainer {
     @Deprecated
     @Programmatic
     public <T> Iterable<T> lookupServices(Class<T> service){
-    	return serviceRegistry.streamServices(service)
-    	        .collect(Collectors.toList());	
+    	return serviceRegistry.select(service);	
     }
 
     /**
diff --git a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoAbstract.java b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoAbstract.java
index cc69c24..a2b0f43 100644
--- a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoAbstract.java
+++ b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoAbstract.java
@@ -34,15 +34,15 @@ import org.apache.maven.project.MavenProject;
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.commons.factory.InstanceUtil;
-import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
 import org.apache.isis.core.plugins.environment.IsisSystemEnvironment;
 import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
-import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProvider;
+import org.apache.isis.core.runtime.system.session.IsisSessionProducerBean;
 import org.apache.isis.tool.mavenplugin.util.MavenProjects;
 
+import lombok.val;
+
 public abstract class IsisMojoAbstract extends AbstractMojo {
 
     protected static final String CURRENT_PLUGIN_KEY = "org.apache.isis.tool:isis-maven-plugin";
@@ -69,18 +69,13 @@ public abstract class IsisMojoAbstract extends AbstractMojo {
         final AppManifest appManifest = InstanceUtil.createInstance(this.appManifest, AppManifest.class);
         IsisConfiguration.buildFromAppManifest(appManifest); // build and finalize config
         
-        final IsisComponentProvider isisComponentProvider = IsisComponentProvider.builder(appManifest)
-                .build();
-        final IsisSessionFactoryBuilder isisSessionFactoryBuilder = 
-                new IsisSessionFactoryBuilder(isisComponentProvider);
-        
         IsisSessionFactory isisSessionFactory = null;
         try {
-            isisSessionFactory = isisSessionFactoryBuilder.buildSessionFactory();
-            if(!isisSessionFactoryBuilder.isMetaModelValid()) {
-                MetaModelInvalidException metaModelInvalidException = IsisContext
-                        .getMetaModelInvalidExceptionIfAny();
-                Set<String> validationErrors = metaModelInvalidException.getValidationErrors();
+            isisSessionFactory = new IsisSessionProducerBean().produceIsisSessionFactory();
+            		
+            val metaModelDeficiencies = IsisContext.getMetaModelDeficienciesIfAny();
+            if(metaModelDeficiencies!=null) {
+                Set<String> validationErrors = metaModelDeficiencies.getValidationErrors();
                 context.throwFailureException(validationErrors.size() + " meta-model problems found.", validationErrors);
                 return;
             }
diff --git a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoSwagger.java b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoSwagger.java
index ec82135..cb6ded9 100644
--- a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoSwagger.java
+++ b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoSwagger.java
@@ -34,6 +34,7 @@ import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
 
 import org.apache.isis.applib.services.swagger.SwaggerService;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 
 @Mojo(
@@ -78,7 +79,8 @@ public class IsisMojoSwagger extends IsisMojoAbstract {
             final ContextForMojo context, final IsisSessionFactory isisSessionFactory)
                     throws MojoFailureException, IOException {
 
-        final SwaggerService swaggerService = isisSessionFactory.getServicesInjector().lookupServiceElseFail(SwaggerService.class);
+        final SwaggerService swaggerService = 
+                IsisContext.getServiceRegistry().lookupServiceElseFail(SwaggerService.class);
 
         final MavenProject mavenProject = context.getMavenProject();
         final File outputDir = determineOutputDir(mavenProject, output);
diff --git a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoValidate.java b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoValidate.java
index f8bc620..be98037 100644
--- a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoValidate.java
+++ b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoValidate.java
@@ -60,12 +60,13 @@ public class IsisMojoValidate extends IsisMojoAbstract {
 
         @Override
         public void process(
-                final Context context, final SpecificationLoader specificationLoader)
+                final Context context, 
+                final SpecificationLoader specificationLoader)
                         throws MojoFailureException {
 
             final ValidationFailures validationFailures = specificationLoader.validate();
 
-            final Collection<ObjectSpecification> objectSpecifications = specificationLoader.allSpecifications();
+            final Collection<ObjectSpecification> objectSpecifications = specificationLoader.currentSpecifications();
             for (ObjectSpecification objectSpecification : objectSpecifications) {
                 context.getLog().debug("loaded: " + objectSpecification.getFullIdentifier());
             }
diff --git a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoXsd.java b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoXsd.java
index a1e6c20..90af52c 100644
--- a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoXsd.java
+++ b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoXsd.java
@@ -24,7 +24,6 @@ import java.util.List;
 import java.util.Map;
 
 import com.google.common.base.Charsets;
-import org.apache.isis.commons.internal.base._Strings;
 import com.google.common.io.Files;
 
 import org.apache.maven.plugin.MojoFailureException;
@@ -35,7 +34,9 @@ import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
 
 import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.commons.factory.InstanceUtil;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 
 @Mojo(
@@ -81,7 +82,8 @@ public class IsisMojoXsd extends IsisMojoAbstract {
             final ContextForMojo context, final IsisSessionFactory isisSessionFactory)
                     throws MojoFailureException, IOException {
 
-        final JaxbService jaxbService = isisSessionFactory.getServicesInjector().lookupServiceElseFail(JaxbService.class);
+        final JaxbService jaxbService = 
+                IsisContext.getServiceRegistry().lookupServiceElseFail(JaxbService.class);
 
         final MavenProject mavenProject = context.getMavenProject();
         final File outputDir = determineOutputDir(mavenProject);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassUtil.java
index 972ac6a..6404cf1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassUtil.java
@@ -19,13 +19,17 @@
 
 package org.apache.isis.core.commons.lang;
 
+import static org.apache.isis.commons.internal.base._With.requiresNotEmpty;
+
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 
 public final class ClassUtil {
 
@@ -142,20 +146,21 @@ public final class ClassUtil {
         return false;
     }
 
-    public static Class<?> forName(final String fullName) {
-        final Class<?> primitiveCls = primitives.get(fullName);
-        if (primitiveCls != null) {
-            return primitiveCls;
+    public static Class<?> forNameElseFail(final String fullName) {
+    	requiresNotEmpty(fullName, "fullName");
+    	final Class<?> builtIn = ClassUtil.getBuiltIn(fullName);
+		if (builtIn != null) {
+			return builtIn;
         }
         try {
             return _Context.loadClass(fullName);
         } catch (final ClassNotFoundException e) {
-            throw new RuntimeException(e);
+            throw _Exceptions.unrecoverable(e);
         }
     }
 
     public static Class<?> forNameElseNull(final String fullName) {
-        if (fullName == null) {
+        if (_Strings.isNullOrEmpty(fullName)) {
             return null;
         }
         try {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java
new file mode 100644
index 0000000..97931ef
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java
@@ -0,0 +1,194 @@
+/*
+ *  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.core.metamodel;
+
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.title.TitleService;
+import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.applib.services.xactn.TransactionState;
+import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.MetaModelContexts.MetaModelContextBean;
+import org.apache.isis.core.metamodel.MetaModelContexts.MetaModelContextBean.MetaModelContextBeanBuilder;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.security.authentication.AuthenticationSession;
+import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
+import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
+
+/**
+ * 
+ * @since 2.0.0-M2
+ *
+ */
+public interface MetaModelContext {
+
+    // -- INTERFACE
+    
+    IsisConfiguration getConfiguration();
+    
+    ObjectAdapterProvider getObjectAdapterProvider();
+
+    ServiceInjector getServiceInjector();
+
+    ServiceRegistry getServiceRegistry();
+
+    SpecificationLoader getSpecificationLoader();
+
+    AuthenticationSessionProvider getAuthenticationSessionProvider();
+
+    TranslationService getTranslationService();
+
+    AuthenticationSession getAuthenticationSession();
+
+    AuthorizationManager getAuthorizationManager();
+
+    AuthenticationManager getAuthenticationManager();
+
+    TitleService getTitleService();
+
+    ObjectSpecification getSpecification(Class<?> type);
+    
+    RepositoryService getRepositoryService();
+    
+    TransactionService getTransactionService();
+    
+    TransactionState getTransactionState();
+    
+	Stream<ObjectAdapter> streamServiceAdapters();
+	
+	ObjectAdapter lookupServiceAdapterById(String serviceId);
+
+    // -- PRESET INSTANCES
+    
+    static MetaModelContext current() {
+        return _Context.computeIfAbsent(MetaModelContext.class, 
+                __->MetaModelContexts.usingCDI()); // default
+    }
+    
+    static void preset(MetaModelContext metaModelContext) {
+        _Context.putSingleton(MetaModelContext.class, metaModelContext);
+    }
+    
+    static MetaModelContextBeanBuilder builder() {
+        return MetaModelContextBean.builder();
+    }
+    
+    // -- DELEGATION - FOR THOSE THAT IMPLEMENT THROUGH DELEGATION
+    
+    public static interface Delegating extends MetaModelContext {
+        
+        public MetaModelContext getMetaModelContext();
+        
+        @Override
+        public default IsisConfiguration getConfiguration() {
+            return getMetaModelContext().getConfiguration();
+        }
+        
+        @Override
+        public default ObjectAdapterProvider getObjectAdapterProvider() {
+            return getMetaModelContext().getObjectAdapterProvider();
+        }
+
+        @Override
+        public default ServiceInjector getServiceInjector() {
+            return getMetaModelContext().getServiceInjector();
+        }
+
+        @Override
+        public default ServiceRegistry getServiceRegistry() {
+            return getMetaModelContext().getServiceRegistry();
+        }
+
+        @Override
+        public default SpecificationLoader getSpecificationLoader() {
+            return getMetaModelContext().getSpecificationLoader();
+        }
+
+        @Override
+        public default AuthenticationSessionProvider getAuthenticationSessionProvider() {
+            return getMetaModelContext().getAuthenticationSessionProvider();
+        }
+
+        @Override
+        public default TranslationService getTranslationService() {
+            return getMetaModelContext().getTranslationService();
+        }
+
+        @Override
+        public default AuthenticationSession getAuthenticationSession() {
+            return getMetaModelContext().getAuthenticationSession();
+        }
+
+        @Override
+        public default AuthorizationManager getAuthorizationManager() {
+            return getMetaModelContext().getAuthorizationManager();
+        }
+
+        @Override
+        public default AuthenticationManager getAuthenticationManager() {
+            return getMetaModelContext().getAuthenticationManager();
+        }
+
+        @Override
+        public default TitleService getTitleService() {
+            return getMetaModelContext().getTitleService();
+        }
+
+        @Override
+        public default ObjectSpecification getSpecification(Class<?> type) {
+            return getMetaModelContext().getSpecification(type);
+        }
+        
+        @Override
+        public default RepositoryService getRepositoryService() {
+            return getMetaModelContext().getRepositoryService();
+        }
+        
+        @Override
+        public default TransactionState getTransactionState() {
+            return getMetaModelContext().getTransactionState();
+        }
+        
+        @Override
+        public default TransactionService getTransactionService() {
+            return getMetaModelContext().getTransactionService();
+        }
+        
+        @Override
+        public default Stream<ObjectAdapter> streamServiceAdapters() {
+        	return streamServiceAdapters();
+        }
+        
+        @Override
+        default ObjectAdapter lookupServiceAdapterById(String serviceId) {
+        	return lookupServiceAdapterById(serviceId);
+        }
+        
+    }
+    
+}
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
new file mode 100644
index 0000000..3fce760
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
@@ -0,0 +1,229 @@
+/*
+ *  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.core.metamodel;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.title.TitleService;
+import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.applib.services.xactn.TransactionState;
+import org.apache.isis.commons.internal.base._Lazy;
+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.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.core.metamodel.services.ServiceUtil;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.security.authentication.AuthenticationSession;
+import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
+import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.val;
+
+/**
+ * 
+ * @since 2.0.0-M3
+ *
+ */
+public final class MetaModelContexts {
+
+    static class MetaModelContextUsingCDI implements MetaModelContext {
+
+        @Getter(lazy=true) 
+        private final IsisConfiguration configuration = 
+        _Config.getConfiguration();
+
+        @Getter(lazy=true) 
+        private final ObjectAdapterProvider objectAdapterProvider =
+        _CDI.getSingletonElseFail(ObjectAdapterProvider.class);
+
+        @Getter(lazy=true) 
+        private final ServiceInjector serviceInjector =
+        _CDI.getSingletonElseFail(ServiceInjector.class);
+
+        @Getter(lazy=true) 
+        private final ServiceRegistry serviceRegistry =
+        _CDI.getSingletonElseFail(ServiceRegistry.class);
+
+        @Getter(lazy=true) 
+        private final SpecificationLoader specificationLoader = 
+        _CDI.getSingletonElseFail(SpecificationLoader.class);
+
+        @Getter(lazy=true) 
+        private final AuthenticationSessionProvider authenticationSessionProvider =
+        _CDI.getSingletonElseFail(AuthenticationSessionProvider.class);
+
+        @Getter(lazy=true) 
+        private final TranslationService translationService =
+        _CDI.getSingletonElseFail(TranslationService.class);
+
+        @Getter(lazy=true) 
+        private final AuthorizationManager authorizationManager =
+        _CDI.getSingletonElseFail(AuthorizationManager.class); 
+
+        @Getter(lazy=true) 
+        private final AuthenticationManager authenticationManager =
+        _CDI.getSingletonElseFail(AuthenticationManager.class);
+
+        @Getter(lazy=true) 
+        private final TitleService titleService =
+        _CDI.getSingletonElseFail(TitleService.class);
+
+//        @Getter(lazy=true) 
+//        private final ObjectAdapterService objectAdapterService =
+//        _CDI.getSingletonElseFail(ObjectAdapterService.class);
+
+        @Getter(lazy=true) 
+        private final RepositoryService repositoryService =
+        _CDI.getSingletonElseFail(RepositoryService.class);
+        
+        @Getter(lazy=true) 
+        private final TransactionService transactionService =
+        _CDI.getSingletonElseFail(TransactionService.class);
+        
+
+        @Override
+        public final AuthenticationSession getAuthenticationSession() {
+            return getAuthenticationSessionProvider().getAuthenticationSession();
+        }
+
+        @Override
+        public final ObjectSpecification getSpecification(final Class<?> type) {
+            return type != null ? getSpecificationLoader().loadSpecification(type) : null;
+        }
+
+        @Override
+        public final TransactionState getTransactionState() {
+            return getTransactionService().getTransactionState();
+        }
+        
+        // -- SERVICE SUPPORT
+        
+        @Override
+        public Stream<ObjectAdapter> streamServiceAdapters() {
+            return serviceAdapters.get().values().stream();
+        }
+        
+        @Override
+        public ObjectAdapter lookupServiceAdapterById(final String serviceId) {
+            return serviceAdapters.get().get(serviceId);
+        }
+        
+        
+        // -- HELPER
+        
+        private final _Lazy<Map<String, ObjectAdapter>> serviceAdapters = _Lazy.of(this::initServiceAdapters);
+        
+        private Map<String, ObjectAdapter> initServiceAdapters() {
+        	
+        	val objectAdapterProvider = getObjectAdapterProvider();
+        	
+            return getServiceRegistry().streamServices()
+            .map(objectAdapterProvider::adapterFor) 
+            .peek(serviceAdapter->{
+                val oid = serviceAdapter.getOid();
+                if(oid.isTransient()) {
+                    val msg = "ObjectAdapter for 'Bean' is expected not to be 'transient' " + oid;
+                    throw _Exceptions.unrecoverable(msg);
+                }
+            })
+            .collect(Collectors.toMap(ServiceUtil::idOfAdapter, v->v, (o,n)->n, LinkedHashMap::new));
+        }
+
+        // -------------------------------------------------------------------------------
+
+
+    }
+
+    final static MetaModelContext usingCDI() {
+        return new MetaModelContextUsingCDI();
+    }
+    
+    // -- JUNIT TEST SUPPORT
+    
+    @Builder @Getter
+    public final static class MetaModelContextBean implements MetaModelContext {
+    	
+		private IsisConfiguration configuration;
+
+		private ObjectAdapterProvider objectAdapterProvider;
+
+		private ServiceInjector serviceInjector;
+
+		private ServiceRegistry serviceRegistry;
+
+		private SpecificationLoader specificationLoader;
+
+		private AuthenticationSessionProvider authenticationSessionProvider;
+
+		private TranslationService translationService;
+
+		private AuthenticationSession authenticationSession;
+
+		private AuthorizationManager authorizationManager;
+
+		private AuthenticationManager authenticationManager;
+
+		private TitleService titleService;
+
+		private RepositoryService repositoryService;
+
+		private TransactionService transactionService;
+
+		private TransactionState transactionState;
+
+		private Map<String, ObjectAdapter> serviceAdaptersById;
+
+		@Override
+		public ObjectSpecification getSpecification(Class<?> type) {
+			return specificationLoader.loadSpecification(type);
+		}
+
+		@Override
+		public Stream<ObjectAdapter> streamServiceAdapters() {
+			if(serviceAdaptersById==null) {
+				return Stream.empty();
+			}
+			return serviceAdaptersById.values().stream();
+		}
+
+		@Override
+		public ObjectAdapter lookupServiceAdapterById(String serviceId) {
+			if(serviceAdaptersById==null) {
+				return null;
+			}
+			return serviceAdaptersById.get(serviceId);
+		}
+    	
+    }
+    
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetamodelModule.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetamodelModule.java
new file mode 100644
index 0000000..64b6c27
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetamodelModule.java
@@ -0,0 +1,5 @@
+package org.apache.isis.core.metamodel;
+
+public final class MetamodelModule {
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
index 74cc47a..ad81f64 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
@@ -26,6 +26,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Tuples.Tuple2;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.commons.lang.ClassExtensions;
@@ -60,7 +61,7 @@ public interface ObjectAdapter extends ManagedObject {
      *             if the specified version differs from the version held this
      *             adapter.
      */
-    void checkLock(Version version);
+    void checkLock(Version version); //XXX[2033] not referenced at all
 
     /**
      * The object's unique {@link Oid}.
@@ -74,16 +75,16 @@ public interface ObjectAdapter extends ManagedObject {
      * Note that standalone value objects ("foobar", or 5, or a date),
      * are not mapped and have a <tt>null</tt> oid.
      */
-    Oid getOid();
+    Oid getOid(); //XXX[2033] referenced by 'metamodel' only to create a bookmark (CommandUtil)
 
     /**
-     * Returns either itself (if this is a root) or the parented collections, the
+     * Returns either itself (if this is a root) or for parented collections, the
      * adapter corresponding to their {@link ParentedOid#getParentOid() root oid}.
      */
-    ObjectAdapter getAggregateRoot();
+    ObjectAdapter getAggregateRoot(); //XXX[2033] not referenced by 'metamodel'
 
-    Version getVersion();
-    void setVersion(Version version);
+    Version getVersion(); //XXX[2033] not referenced by 'metamodel'
+    void setVersion(Version version); //XXX[2033] not referenced by 'metamodel'
 
 
     /**
@@ -100,7 +101,14 @@ public interface ObjectAdapter extends ManagedObject {
     default public boolean isValue() {
         return getOid().isValue();
     }
-
+    
+    default public ObjectAdapter injectServices(ServiceInjector serviceInjector) {
+        if(isValue()) {
+            return this; // guard against value objects
+        }
+        serviceInjector.injectServicesInto(getPojo());
+        return this;
+    }
 
     public final class Util {
 
@@ -204,26 +212,6 @@ public interface ObjectAdapter extends ManagedObject {
             return visibleAdapters(objectAdapters, interactionInitiatedBy);
         }
 
-        /**
-         * as per {@link #visibleAdapters(ObjectAdapter, InteractionInitiatedBy)}.
-         *  @param objectAdapters - iterable over the respective adapters of a collection (as returned by a getter of a collection, or of an autoCompleteNXxx() or choicesNXxx() method, etc
-         * @param interactionInitiatedBy
-         * @deprecated use stream variant instead
-         */
-        public static List<ObjectAdapter> visibleAdapters(
-                final Iterable<ObjectAdapter> objectAdapters,
-                final InteractionInitiatedBy interactionInitiatedBy) {
-            final List<ObjectAdapter> adapters = _Lists.newArrayList();
-            for (final ObjectAdapter adapter : objectAdapters) {
-                final boolean visible = isVisible(adapter,
-                        interactionInitiatedBy);
-                if(visible) {
-                    adapters.add(adapter);
-                }
-            }
-            return adapters;
-        }
-        
         public static List<ObjectAdapter> visibleAdapters(
                 final Stream<ObjectAdapter> objectAdapters,
                 final InteractionInitiatedBy interactionInitiatedBy) {
@@ -270,7 +258,7 @@ public interface ObjectAdapter extends ManagedObject {
     }
 
     boolean isTransient();
-    boolean representsPersistent();
+    boolean isRepresentingPersistent();
     boolean isDestroyed();
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterPredicate.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterPredicate.java
new file mode 100644
index 0000000..8b063d5
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterPredicate.java
@@ -0,0 +1,12 @@
+package org.apache.isis.core.metamodel.adapter;
+
+import java.util.function.Predicate;
+
+/**
+ * 
+ * @since 2.0.0-M3
+ *
+ */
+public interface ObjectAdapterPredicate extends Predicate<ObjectAdapter> {
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
index 4d80ecb..8fcdab5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
@@ -18,19 +18,18 @@
  */
 package org.apache.isis.core.metamodel.adapter;
 
-import static org.apache.isis.commons.internal.base._With.mapIfPresentElse;
-
 import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 
+import static org.apache.isis.commons.internal.base._With.mapIfPresentElse;
+
 /**
  * 
  * @since 2.0.0-M2
@@ -44,7 +43,6 @@ public interface ObjectAdapterProvider {
      * @param pojo
      * @return oid for the given domain object 
      */
-    @Programmatic
     default @Nullable Oid oidFor(@Nullable Object domainObject) {
         return mapIfPresentElse(adapterFor(domainObject), ObjectAdapter::getOid, null);
     }
@@ -53,11 +51,11 @@ public interface ObjectAdapterProvider {
      * @return standalone (value) or root adapter
      */
     @Nullable ObjectAdapter adapterFor(@Nullable Object domainObject);
-
+    
     /**
      * @return collection adapter.
      */
-    ObjectAdapter adapterFor(
+    ObjectAdapter adapterForCollection(
             Object domainObject,
             RootOid parentOid,
             OneToManyAssociation collection);
@@ -87,11 +85,11 @@ public interface ObjectAdapterProvider {
      * Creates a new instance of the specified type and returns it.
      *
      * <p>
-     * The returned object will be initialised (had the relevant callback
+     * The returned object will be initialized (had the relevant callback
      * lifecycle methods invoked).
      *
      * <p>
-     * While creating the object it will be initialised with default values and
+     * While creating the object it will be initialized with default values and
      * its created lifecycle method (its logical constructor) will be invoked.
      *
      */
@@ -109,61 +107,52 @@ public interface ObjectAdapterProvider {
     
     public static interface Delegating extends ObjectAdapterProvider {
         
-        @Programmatic
         ObjectAdapterProvider getObjectAdapterProvider();
         
-        @Programmatic
         default ObjectAdapter adapterFor(Object domainObject) {
             return getObjectAdapterProvider().adapterFor(domainObject);
         }
 
-        @Programmatic
-        default ObjectAdapter adapterFor(
+        default ObjectAdapter adapterForCollection(
                 final Object pojo,
                 final RootOid parentOid,
                 OneToManyAssociation collection) {
-            return getObjectAdapterProvider().adapterFor(pojo, parentOid, collection);
+            return getObjectAdapterProvider().adapterForCollection(pojo, parentOid, collection);
         }
-
-        @Programmatic
-        default ManagedObject disposableAdapterForViewModel(final Object viewModelPojo) {
+        
+        default ManagedObject disposableAdapterForViewModel(Object viewModelPojo) {
             return getObjectAdapterProvider().disposableAdapterForViewModel(viewModelPojo);
         }
         
-        @Programmatic
         default ObjectSpecification specificationForViewModel(Object viewModelPojo) {
             return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
         }
 
-        @Programmatic
         default ObjectAdapter adapterForViewModel(final Object viewModelPojo, final String mementoString) {
             return getObjectAdapterProvider().adapterForViewModel(viewModelPojo, mementoString);
         }
         
-        @Programmatic
+        
         default ObjectAdapter newTransientInstance(ObjectSpecification objectSpec) {
             return getObjectAdapterProvider().newTransientInstance(objectSpec);
         }
         
-        @Programmatic
+        
         default ObjectAdapter recreateViewModelInstance(ObjectSpecification objectSpec, final String memento) {
             return getObjectAdapterProvider().recreateViewModelInstance(objectSpec, memento);
         }
         
-        @Programmatic
+        
         default Stream<ObjectAdapter> streamServices() {
             return getObjectAdapterProvider().streamServices();
         }
         
-        @Programmatic
         default ObjectAdapter lookupService(String serviceId) {
             return getObjectAdapterProvider().lookupService(serviceId);
         }
         
+        
     }
-
-
-    
     
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
index 9ddeb17..158476f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.adapter.oid;
 
+import java.net.URI;
+
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.core.commons.encoding.Encodable;
@@ -110,6 +112,8 @@ public interface Oid extends Encodable {
             return Oid_Value.INSTANCE;
         }
         
+        // -- LEGACY
+        
         public static RootOid ofBookmark(final Bookmark bookmark) {
             return Oid_Root.of(ObjectSpecId.of(bookmark.getObjectType()), 
                     bookmark.getIdentifier(), Oid_State.from(bookmark), Version.empty());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java
index 98f1d67..57cfddc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.util.Objects;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.commons.encoding.DataInputExtended;
 import org.apache.isis.core.commons.encoding.DataOutputExtended;
 import org.apache.isis.core.commons.url.UrlDecoderUtil;
@@ -32,6 +33,8 @@ import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.schema.common.v1.OidDto;
 
+import lombok.val;
+
 final class Oid_Root implements RootOid {
 
     // -- fields
@@ -69,6 +72,14 @@ final class Oid_Root implements RootOid {
         this.state = state;
         this.version = version;
         this.hashCode = calculateHash();
+        
+        
+        val debug = this.toString(); 
+        if(debug.contains("/spring/")) {
+        	_Exceptions.throwUnexpectedCodeReach();
+        }
+        
+        
     }
 
     // -- Encodeable
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectNotFoundException.java
similarity index 60%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceException.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectNotFoundException.java
index e30e199..206058e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceException.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectNotFoundException.java
@@ -17,27 +17,22 @@
  *  under the License.
  */
 
-package org.apache.isis.core.runtime.services;
+package org.apache.isis.core.metamodel.exceptions.persistence;
 
-import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
 
-public class ServiceException extends IsisException {
+/**
+ * Indicates that the <tt>PojoRecreator</tt> was unable to instantiate a new pojo for the specified
+ * {@link org.apache.isis.core.metamodel.adapter.oid.Oid}.
+ */
+public class ObjectNotFoundException extends ObjectPersistenceException {
     private static final long serialVersionUID = 1L;
 
-    public ServiceException() {
-        super();
-    }
-
-    public ServiceException(final String message) {
-        super(message);
+    public ObjectNotFoundException(final Oid oid) {
+        super("Object not found in store with oid " + oid);
     }
 
-    public ServiceException(final Throwable cause) {
-        super(cause);
+    public ObjectNotFoundException(final Oid oid, final Throwable cause) {
+        super("Object not found in store with oid " + oid, cause);
     }
-
-    public ServiceException(final String message, final Throwable cause) {
-        super(message, cause);
-    }
-
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectPersistenceException.java
similarity index 73%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceException.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectPersistenceException.java
index e30e199..f1a9dd2 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceException.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectPersistenceException.java
@@ -17,27 +17,26 @@
  *  under the License.
  */
 
-package org.apache.isis.core.runtime.services;
+package org.apache.isis.core.metamodel.exceptions.persistence;
 
 import org.apache.isis.core.commons.exceptions.IsisException;
 
-public class ServiceException extends IsisException {
+public class ObjectPersistenceException extends IsisException {
     private static final long serialVersionUID = 1L;
 
-    public ServiceException() {
+    public ObjectPersistenceException() {
         super();
     }
 
-    public ServiceException(final String message) {
+    public ObjectPersistenceException(final String message) {
         super(message);
     }
 
-    public ServiceException(final Throwable cause) {
-        super(cause);
-    }
-
-    public ServiceException(final String message, final Throwable cause) {
+    public ObjectPersistenceException(final String message, final Throwable cause) {
         super(message, cause);
     }
 
+    public ObjectPersistenceException(final Throwable cause) {
+        super(cause);
+    }
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRecreationException.java
similarity index 68%
copy from core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerAbstract.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRecreationException.java
index 10b448f..fe11f34 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRecreationException.java
@@ -17,14 +17,15 @@
  *  under the License.
  */
 
-package org.apache.isis.core.runtime.services;
+package org.apache.isis.core.metamodel.exceptions.persistence;
 
-import org.apache.isis.core.commons.components.InstallerAbstract;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
 
-public abstract class ServicesInstallerAbstract extends InstallerAbstract implements ServicesInstaller {
+public class PojoRecreationException extends ObjectPersistenceException {
+    private static final long serialVersionUID = 1L;
 
-    public ServicesInstallerAbstract(final String name) {
-        super(name);
-    }
+    public PojoRecreationException(Oid oid, Throwable cause) {
+        super(String.format("Could not recreate pojo for oid '%s'.", oid), cause);
 
+    }
 }
diff --git a/core/runtime/src/test/java/org/apache/isis/progmodel/wrapper/dom/employees/EmployeeRepositoryImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRefreshException.java
similarity index 68%
copy from core/runtime/src/test/java/org/apache/isis/progmodel/wrapper/dom/employees/EmployeeRepositoryImpl.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRefreshException.java
index 0afd437..bbac79b 100644
--- a/core/runtime/src/test/java/org/apache/isis/progmodel/wrapper/dom/employees/EmployeeRepositoryImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRefreshException.java
@@ -17,19 +17,18 @@
  *  under the License.
  */
 
-package org.apache.isis.progmodel.wrapper.dom.employees;
+package org.apache.isis.core.metamodel.exceptions.persistence;
 
-import java.util.List;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
 
-public class EmployeeRepositoryImpl implements EmployeeRepository {
+public class PojoRefreshException extends ObjectNotFoundException {
+    private static final long serialVersionUID = 1L;
 
-    @Override
-    public List<Employee> allEmployees() {
-        return null;
+    public PojoRefreshException(Oid oid) {
+        super(oid);
     }
 
-    @Override
-    public List<Employee> findEmployees(final String name) {
-        return null;
+    public PojoRefreshException(Oid oid, Throwable cause) {
+        super(oid, cause);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java
index 2e0d10f..b295b1c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java
@@ -19,16 +19,17 @@
 
 package org.apache.isis.core.metamodel.facetapi;
 
+import static org.apache.isis.commons.internal.base._With.requires;
+
 import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Stream;
 
 import org.apache.isis.core.commons.ensure.Ensure;
-
-import static org.apache.isis.commons.internal.base._With.requires;
+import org.apache.isis.core.metamodel.MetaModelContext;
 
 
-public abstract class FacetAbstract implements Facet {
+public abstract class FacetAbstract implements Facet, MetaModelContext.Delegating {
 
     public enum Derivation {
         DERIVED,
@@ -55,7 +56,7 @@ public abstract class FacetAbstract implements Facet {
             final FacetHolder holder,
             final Derivation derivation) {
         this.facetType = requires(facetType, "facetType"); 
-        setFacetHolder(requires(holder, "holder"));
+        setFacetHolder(holder);
         this.derived = (derivation == Derivation.DERIVED);
     }
 
@@ -146,7 +147,9 @@ public abstract class FacetAbstract implements Facet {
     @Override
     public void setFacetHolder(final FacetHolder facetHolder) {
         this.holder = facetHolder;
-        this.identifiedHolder = holder instanceof IdentifiedHolder ? (IdentifiedHolder) holder : null;
+        this.identifiedHolder = (holder!=null && holder instanceof IdentifiedHolder) 
+        		? (IdentifiedHolder) holder 
+        				: null;
     }
 
     protected String toStringValues() {
@@ -230,5 +233,13 @@ public abstract class FacetAbstract implements Facet {
      */
     public static interface Validating {
     }
+    
+    // -- dependencies
+    
+    @Override
+    public MetaModelContext getMetaModelContext() {
+        return MetaModelContext.current();
+    }
+   
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java
index bbe6fc5..7ba83d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.facetapi;
 
+import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Optional;
 import java.util.stream.Stream;
 
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-
 /**
  * For base subclasses or, more likely, to help write tests.
  */
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetWithAttributes.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetWithAttributes.java
index 823bdf4..72d31a8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetWithAttributes.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetWithAttributes.java
@@ -21,6 +21,8 @@ package org.apache.isis.core.metamodel.facetapi;
 
 import java.util.Map;
 
+import org.apache.isis.applib.services.metamodel.MetaModelService;
+
 /**
  * For serialization of metamodel into XML, see {@link org.apache.isis.applib.services.metamodel.MetaModelService#exportMetaModel(MetaModelService.Config)}.
  */
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 36ede77..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
@@ -19,10 +19,15 @@
 
 package org.apache.isis.core.metamodel.facetapi;
 
-import org.apache.isis.applib.annotation.Programmatic;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.isis.core.metamodel.MetaModelContext;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
 
+import lombok.val;
+
 
 /**
  * Provides the ability for components to inform/alter/adjust/refine the metamodel
@@ -32,7 +37,20 @@ import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
  */
 public interface MetaModelRefiner extends MetaModelValidatorRefiner {
 
-    @Programmatic
     void refineProgrammingModel(ProgrammingModel programmingModel);
 
+    // -- LOOKUP ALL REFINERS
+    
+	static List<MetaModelRefiner> getAll() {
+		
+		val context = MetaModelContext.current();
+		val serviceRegistry = context.getServiceRegistry();
+		
+		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/facetapi/MetaModelValidatorRefiner.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MetaModelValidatorRefiner.java
index b46f46e..1dab245 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MetaModelValidatorRefiner.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MetaModelValidatorRefiner.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.metamodel.facetapi;
 
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 
@@ -32,7 +31,6 @@ import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorCom
  */
 public interface MetaModelValidatorRefiner {
 
-    @Programmatic
     void refineMetaModelValidator(MetaModelValidatorComposite metaModelValidator);
 
 }
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 db5a09b..24e05f3 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
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets;
 
+import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
@@ -33,24 +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.ServicesInjector;
+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;
 
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+import lombok.RequiredArgsConstructor;
+import lombok.val;
 
+@RequiredArgsConstructor(staticName = "ofEventService")
 public class DomainEventHelper {
 
-    private final ServicesInjector servicesInjector;
-
-
-    public DomainEventHelper(final ServicesInjector servicesInjector) {
-        this.servicesInjector = servicesInjector;
+    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.servicesInjector.lookupService(EventBusService.class).orElse(null);
-    }
-
-
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java
index 08edb7a..daf5cb1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java
@@ -22,15 +22,10 @@ package org.apache.isis.core.metamodel.facets;
 import java.util.List;
 
 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.metamodel.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.ServicesInjectorAware;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
-public abstract class FacetFactoryAbstract implements FacetFactory, ServicesInjectorAware {
+public abstract class FacetFactoryAbstract implements FacetFactory, MetaModelContext.Delegating {
 
     private final List<FeatureType> featureTypes;
 
@@ -55,29 +50,11 @@ public abstract class FacetFactoryAbstract implements FacetFactory, ServicesInje
     public void processParams(final ProcessParameterContext processParameterContext) {
     }
 
-    // -- dependencies (injected)
-
-    protected ServicesInjector servicesInjector;
-
+    // -- dependencies
+    
     @Override
-    public void setServicesInjector(final ServicesInjector servicesInjector) {
-        this.servicesInjector = servicesInjector;
-    }
-
-
-    // -- dependencies (looked up from services injector)
-
-    protected SpecificationLoader getSpecificationLoader() {
-        return servicesInjector.getSpecificationLoader();
+    public MetaModelContext getMetaModelContext() {
+        return MetaModelContext.current();
     }
 
-    protected AuthenticationSessionProvider getAuthenticationSessionProvider() {
-        return servicesInjector.getAuthenticationSessionProvider();
-    }
-
-    protected IsisConfiguration getConfiguration() {
-        return _Config.getConfiguration();
-    }
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
index 512218f..4401495 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
@@ -34,7 +34,6 @@ import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacet;
 import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacetDefault;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
  * non-final only so it can be mocked if need be.
@@ -75,11 +74,11 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
     public static FacetedMethod createForAction(
             final Class<?> declaringType,
             final String actionName,
-            final SpecificationLoader specificationLoader,
             final Class<?>... parameterTypes) {
+        
         try {
             final Method method = declaringType.getMethod(actionName, parameterTypes);
-            return FacetedMethod.createForAction(declaringType, method, specificationLoader);
+            return FacetedMethod.createForAction(declaringType, method);
         } catch (final SecurityException | NoSuchMethodException e) {
             throw new RuntimeException(e);
         }
@@ -96,16 +95,14 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
 
     public static FacetedMethod createForAction(
             final Class<?> declaringType,
-            final Method method,
-            final SpecificationLoader specificationLoader) {
-        return new FacetedMethod(FeatureType.ACTION, declaringType, method, method.getReturnType(), getParameters(declaringType, method,
-                specificationLoader));
+            final Method method) {
+        return new FacetedMethod(FeatureType.ACTION, declaringType, method, method.getReturnType(), 
+                getParameters(declaringType, method));
     }
 
     private static List<FacetedMethodParameter> getParameters(
             final Class<?> declaringType,
-            final Method actionMethod,
-            final SpecificationLoader specificationLoader) {
+            final Method actionMethod) {
 
         final Class<?>[] parameterTypes = actionMethod.getParameterTypes();
         final Type[] genericParameterTypes = actionMethod.getGenericParameterTypes();
@@ -133,12 +130,11 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
                 FacetUtil.addFacet(semanticsFacet);
 
                 TypeOfFacet typeOfFacet = TypeOfFacet.Util
-                        .inferFromGenericParamType(fmp, parameterType, genericParameterType,
-                                specificationLoader);
+                        .inferFromGenericParamType(fmp, parameterType, genericParameterType);
 
                 if(typeOfFacet == null ) {
                     if (_Arrays.isArrayType(parameterType)) {
-                        typeOfFacet = TypeOfFacet.Util.inferFromArrayType(fmp, parameterType, specificationLoader);
+                        typeOfFacet = TypeOfFacet.Util.inferFromArrayType(fmp, parameterType);
                     }
                 }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
index e92e10c..67be212 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
@@ -21,9 +21,9 @@ package org.apache.isis.core.metamodel.facets;
 
 import java.lang.reflect.Method;
 import java.util.List;
+import java.util.Map;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
-import java.util.Map;
 
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.commons.internal.collections._Lists;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleClassValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleClassValueFacetAbstract.java
index 2c71129..d2c8b90 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleClassValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/SingleClassValueFacetAbstract.java
@@ -25,21 +25,17 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class SingleClassValueFacetAbstract extends FacetAbstract implements SingleClassValueFacet {
 
     private final Class<?> value;
-    private final SpecificationLoader specificationLoader;
 
     public SingleClassValueFacetAbstract(
             final Class<? extends Facet> facetType,
             final FacetHolder holder,
-            final Class<?> value,
-            final SpecificationLoader specificationLoader) {
+            final Class<?> value) {
         super(facetType, holder, Derivation.NOT_DERIVED);
         this.value = value;
-        this.specificationLoader = specificationLoader;
     }
 
     @Override
@@ -56,10 +52,6 @@ public abstract class SingleClassValueFacetAbstract extends FacetAbstract implem
         return valueType != null ? getSpecificationLoader().loadSpecification(valueType) : null;
     }
 
-    private SpecificationLoader getSpecificationLoader() {
-        return specificationLoader;
-    }
-
     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         attributeMap.put("value", value());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
index 43d1c86..edb931e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
@@ -30,7 +30,6 @@ import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacet;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
  * The type of the collection or the action.
@@ -49,8 +48,7 @@ public interface TypeOfFacet extends SingleClassValueFacet {
         public static TypeOfFacet inferFromGenericReturnType(
                 final Class<?> cls,
                 final Method method,
-                final FacetHolder holder,
-                final SpecificationLoader specificationLoader) {
+                final FacetHolder holder) {
 
             final Class<?> methodReturnType = method.getReturnType();
             if (!_Collections.isCollectionType(methodReturnType)) {
@@ -72,7 +70,7 @@ public interface TypeOfFacet extends SingleClassValueFacet {
             final Object methodActualTypeArgument = methodActualTypeArguments[0];
             if (methodActualTypeArgument instanceof Class) {
                 final Class<?> actualType = (Class<?>) methodActualTypeArgument;
-                return new TypeOfFacetInferredFromGenerics(actualType, holder, specificationLoader);
+                return new TypeOfFacetInferredFromGenerics(actualType, holder);
             }
 
             if (methodActualTypeArgument instanceof TypeVariable) {
@@ -92,7 +90,7 @@ public interface TypeOfFacet extends SingleClassValueFacet {
                             if(actualType instanceof Class) {
                                 // just being safe
                                 final Class<?> actualCls = (Class<?>) actualType;
-                                return new TypeOfFacetInferredFromGenerics(actualCls, holder, specificationLoader);
+                                return new TypeOfFacetInferredFromGenerics(actualCls, holder);
                             }
                         }
                     }
@@ -105,11 +103,11 @@ public interface TypeOfFacet extends SingleClassValueFacet {
         @Programmatic
         public static TypeOfFacet inferFromArrayType(
                 final FacetHolder holder,
-                final Class<?> type,
-                final SpecificationLoader specificationLoader) {
+                final Class<?> type) {
+            
             final Class<?> elementType = _Arrays.inferComponentTypeIfAny(type);
             return elementType != null
-                    ? new TypeOfFacetInferredFromArray(elementType, holder, specificationLoader)
+                    ? new TypeOfFacetInferredFromArray(elementType, holder)
                             : null;
         }
 
@@ -117,12 +115,11 @@ public interface TypeOfFacet extends SingleClassValueFacet {
         public static TypeOfFacet inferFromGenericParamType(
                 final FacetHolder holder,
                 final Class<?> parameterType,
-                final Type genericParameterType,
-                final SpecificationLoader specificationLoader) {
+                final Type genericParameterType) {
 
             final Class<?> elementType = _Collections.inferElementTypeIfAny(parameterType, genericParameterType);
             return elementType != null
-                    ? new TypeOfFacetInferredFromGenerics(elementType, holder, specificationLoader)
+                    ? new TypeOfFacetInferredFromGenerics(elementType, holder)
                             : null;
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetAbstract.java
index 602e373..e7db5e0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetAbstract.java
@@ -22,7 +22,6 @@ package org.apache.isis.core.metamodel.facets.actcoll.typeof;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class TypeOfFacetAbstract extends SingleClassValueFacetAbstract implements TypeOfFacet {
 
@@ -30,8 +29,8 @@ public abstract class TypeOfFacetAbstract extends SingleClassValueFacetAbstract
         return TypeOfFacet.class;
     }
 
-    public TypeOfFacetAbstract(final Class<?> type, final FacetHolder holder, final SpecificationLoader specificationLookup) {
-        super(type(), holder, type, specificationLookup);
+    public TypeOfFacetAbstract(final Class<?> type, final FacetHolder holder) {
+        super(type(), holder, type);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java
index 6aec559..1749eab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java
@@ -20,12 +20,11 @@
 package org.apache.isis.core.metamodel.facets.actcoll.typeof;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class TypeOfFacetDefaultToObject extends TypeOfFacetAbstract {
 
-    public TypeOfFacetDefaultToObject(final FacetHolder holder, final SpecificationLoader specificationLookup) {
-        super(Object.class, holder, specificationLookup);
+    public TypeOfFacetDefaultToObject(final FacetHolder holder) {
+        super(Object.class, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetInferredFromArray.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetInferredFromArray.java
index 1ee3962..40ef5ca 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetInferredFromArray.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetInferredFromArray.java
@@ -20,12 +20,11 @@
 package org.apache.isis.core.metamodel.facets.actcoll.typeof;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class TypeOfFacetInferredFromArray extends TypeOfFacetAbstract {
 
-    public TypeOfFacetInferredFromArray(final Class<?> type, final FacetHolder holder, final SpecificationLoader specificationLookup) {
-        super(type, holder, specificationLookup);
+    public TypeOfFacetInferredFromArray(final Class<?> type, final FacetHolder holder) {
+        super(type, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetInferredFromGenerics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetInferredFromGenerics.java
index 17d8a21..395f150 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetInferredFromGenerics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetInferredFromGenerics.java
@@ -20,12 +20,11 @@
 package org.apache.isis.core.metamodel.facets.actcoll.typeof;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class TypeOfFacetInferredFromGenerics extends TypeOfFacetAbstract {
 
-    public TypeOfFacetInferredFromGenerics(final Class<?> type, final FacetHolder holder, final SpecificationLoader specificationLookup) {
-        super(type, holder, specificationLookup);
+    public TypeOfFacetInferredFromGenerics(final Class<?> type, final FacetHolder holder) {
+        super(type, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index b0dda30..095f59e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -60,8 +60,6 @@ import org.apache.isis.core.metamodel.util.EventUtil;
 
 public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
-
-
     public ActionAnnotationFacetFactory() {
         super(FeatureType.ACTIONS_ONLY);
     }
@@ -112,10 +110,10 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
                     .findFirst()
                     .map(domainEvent ->
                     (ActionDomainEventFacetAbstract) new ActionDomainEventFacetForActionAnnotation(
-                            defaultFromDomainObjectIfRequired(typeSpec, domainEvent), servicesInjector, getSpecificationLoader(), holder))
+                            defaultFromDomainObjectIfRequired(typeSpec, domainEvent), holder))
                     .orElse(
                             new ActionDomainEventFacetDefault(
-                                    defaultFromDomainObjectIfRequired(typeSpec, ActionDomainEvent.Default.class), servicesInjector, getSpecificationLoader(), holder)
+                                    defaultFromDomainObjectIfRequired(typeSpec, ActionDomainEvent.Default.class), holder)
                             );
 
             if(EventUtil.eventTypeIsPostable(
@@ -132,16 +130,12 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             final ActionInvocationFacetForDomainEventAbstract actionInvocationFacet;
             if (actionDomainEventFacet instanceof ActionDomainEventFacetForActionAnnotation) {
                 actionInvocationFacet = new ActionInvocationFacetForDomainEventFromActionAnnotation(
-                        actionDomainEventFacet.getEventType(), actionMethod, typeSpec, returnSpec, holder,
-                        servicesInjector
-                        );
+                        actionDomainEventFacet.getEventType(), actionMethod, typeSpec, returnSpec, holder);
             } else
                 // default
             {
                 actionInvocationFacet = new ActionInvocationFacetForDomainEventFromDefault(
-                        actionDomainEventFacet.getEventType(), actionMethod, typeSpec, returnSpec, holder,
-                        servicesInjector
-                        );
+                        actionDomainEventFacet.getEventType(), actionMethod, typeSpec, returnSpec, holder);
             }
             FacetUtil.addFacet(actionInvocationFacet);
 
@@ -216,7 +210,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         }
 
         // check for @Action(command=...)
-        CommandFacet commandFacet = CommandFacetForActionAnnotation.create(actions, getConfiguration(), servicesInjector, holder);
+        CommandFacet commandFacet = CommandFacetForActionAnnotation.create(actions, getConfiguration(), getServiceInjector(), holder);
 
         FacetUtil.addFacet(commandFacet);
     }
@@ -259,20 +253,19 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
                 .map(Action::typeOf)
                 .filter(typeOf -> typeOf != null && typeOf != Object.class)
                 .findFirst()
-                .map(typeOf -> new TypeOfFacetForActionAnnotation(typeOf, getSpecificationLoader(), holder))
+                .map(typeOf -> new TypeOfFacetForActionAnnotation(typeOf, holder))
                 .orElse(null);
 
         // infer from return type
         if(typeOfFacet == null) {
             final Class<?> returnType = method.getReturnType();
-            typeOfFacet = TypeOfFacet.Util.inferFromArrayType(holder, returnType, getSpecificationLoader());
+            typeOfFacet = TypeOfFacet.Util.inferFromArrayType(holder, returnType);
         }
 
         // infer from generic return type
         if(typeOfFacet == null) {
             final Class<?> cls = processMethodContext.getCls();
-            typeOfFacet = TypeOfFacet.Util.inferFromGenericReturnType(cls, method, holder,
-                    getSpecificationLoader());
+            typeOfFacet = TypeOfFacet.Util.inferFromGenericReturnType(cls, method, holder);
         }
 
         FacetUtil.addFacet(typeOfFacet);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotation.java
index 709fd95..a92fd1e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotation.java
@@ -25,19 +25,19 @@ import org.apache.isis.applib.annotation.CommandExecuteIn;
 import org.apache.isis.applib.annotation.CommandPersistence;
 import org.apache.isis.applib.annotation.CommandReification;
 import org.apache.isis.applib.services.command.CommandDtoProcessor;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstract;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class CommandFacetForActionAnnotation extends CommandFacetAbstract {
 
     public static CommandFacet create(
             final List<Action> actions,
             final IsisConfiguration configuration,
-            final ServicesInjector servicesInjector,
+            final ServiceInjector servicesInjector,
             final FacetHolder holder) {
 
         final CommandActionsConfiguration setting = CommandActionsConfiguration.parse(configuration);
@@ -113,7 +113,7 @@ public class CommandFacetForActionAnnotation extends CommandFacetAbstract {
             final Enablement enablement,
             final CommandDtoProcessor processor,
             final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
+            final ServiceInjector servicesInjector) {
         super(persistence, executeIn, enablement, processor, holder, servicesInjector);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotationAsConfigured.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotationAsConfigured.java
index 8d19fae..9c89fd6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotationAsConfigured.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotationAsConfigured.java
@@ -20,8 +20,8 @@ package org.apache.isis.core.metamodel.facets.actions.action.command;
 
 import org.apache.isis.applib.annotation.CommandExecuteIn;
 import org.apache.isis.applib.annotation.CommandPersistence;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class CommandFacetForActionAnnotationAsConfigured extends CommandFacetForActionAnnotation {
 
@@ -30,7 +30,7 @@ public class CommandFacetForActionAnnotationAsConfigured extends CommandFacetFor
             final CommandExecuteIn executeIn,
             final Enablement enablement,
             final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
+            final ServiceInjector servicesInjector) {
         super(persistence, executeIn, enablement, null,
                 holder, servicesInjector);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetFromConfiguration.java
index 387aed5..3103d57 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetFromConfiguration.java
@@ -21,16 +21,16 @@ package org.apache.isis.core.metamodel.facets.actions.action.command;
 
 import org.apache.isis.applib.annotation.CommandExecuteIn;
 import org.apache.isis.applib.annotation.CommandPersistence;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstract;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class CommandFacetFromConfiguration extends CommandFacetAbstract {
 
     public static CommandFacet create(
             final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
+            final ServiceInjector servicesInjector) {
         return new CommandFacetFromConfiguration(CommandPersistence.PERSISTED, CommandExecuteIn.FOREGROUND, holder,
                 servicesInjector);
     }
@@ -39,7 +39,7 @@ public class CommandFacetFromConfiguration extends CommandFacetAbstract {
             final CommandPersistence persistence,
             final CommandExecuteIn executeIn,
             final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
+            final ServiceInjector servicesInjector) {
         super(persistence, executeIn, Enablement.ENABLED, null, holder, servicesInjector);
     }
 
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 ed146a3..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
@@ -40,10 +40,8 @@ import org.apache.isis.core.metamodel.interactions.InteractionContext;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class ActionDomainEventFacetAbstract
 extends SingleClassValueFacetAbstract implements ActionDomainEventFacet {
@@ -60,17 +58,15 @@ extends SingleClassValueFacetAbstract implements ActionDomainEventFacet {
 
     public ActionDomainEventFacetAbstract(
             final Class<? extends ActionDomainEvent<?>> eventType,
-                    final FacetHolder holder,
-                    final ServicesInjector servicesInjector,
-                    final SpecificationLoader specificationLoader) {
-        super(type(), holder, eventType, specificationLoader);
+                    final FacetHolder holder) {
+        super(type(), holder, eventType);
         this.eventType = eventType;
 
-        this.translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);
+        this.translationService = getTranslationService();
         // sadness: same as in TranslationFactory
         this.translationContext = ((IdentifiedHolder)holder).getIdentifier().toClassAndNameIdentityString();
 
-        domainEventHelper = new DomainEventHelper(servicesInjector);
+        domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry());
     }
 
     @Override
@@ -78,7 +74,7 @@ extends SingleClassValueFacetAbstract implements ActionDomainEventFacet {
         return eventType;
     }
 
-    protected Class eventType() {
+    protected Class<?> eventType() {
         return eventType;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetDefault.java
index 3008095..3e74ec1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetDefault.java
@@ -21,15 +21,12 @@ package org.apache.isis.core.metamodel.facets.actions.action.invocation;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class ActionDomainEventFacetDefault extends ActionDomainEventFacetAbstract {
 
     public ActionDomainEventFacetDefault(
-            final Class<? extends ActionDomainEvent<?>> eventType,
-                    final ServicesInjector servicesInjector, final SpecificationLoader specificationLoader, final FacetHolder holder) {
-        super(eventType, holder, servicesInjector, specificationLoader);
+            final Class<? extends ActionDomainEvent<?>> eventType, final FacetHolder holder) {
+        super(eventType, holder);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForActionAnnotation.java
index d4e38a1..e4f1667 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForActionAnnotation.java
@@ -21,15 +21,12 @@ package org.apache.isis.core.metamodel.facets.actions.action.invocation;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class ActionDomainEventFacetForActionAnnotation extends ActionDomainEventFacetAbstract {
 
     public ActionDomainEventFacetForActionAnnotation(
-            final Class<? extends ActionDomainEvent<?>> eventType,
-                    final ServicesInjector servicesInjector, final SpecificationLoader specificationLoader, final FacetHolder holder) {
-        super(eventType, holder, servicesInjector, specificationLoader);
+            final Class<? extends ActionDomainEvent<?>> eventType, final FacetHolder holder) {
+        super(eventType, holder);
     }
 
 }
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 98dcb93..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
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.actions.action.invocation;
 
+import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+import static org.apache.isis.commons.internal.base._NullSafe.stream;
+
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.sql.Timestamp;
@@ -31,13 +34,11 @@ import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
+import org.apache.isis.applib.metamodel.ManagedObjectSort;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.clock.ClockService;
@@ -49,19 +50,14 @@ import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.applib.services.metamodel.MetaModelService.Mode;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
-import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.applib.services.xactn.TransactionState;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.lang.ArrayExtensions;
 import org.apache.isis.core.commons.lang.MethodInvocationPreprocessor;
 import org.apache.isis.core.commons.lang.ThrowableExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.CollectionUtils;
@@ -71,35 +67,22 @@ import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFace
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.ixn.InteractionDtoServiceInternal;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 import org.apache.isis.schema.ixn.v1.ActionInvocationDto;
 
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-import static org.apache.isis.commons.internal.base._NullSafe.stream;
-
 public abstract class ActionInvocationFacetForDomainEventAbstract
 extends ActionInvocationFacetAbstract
 implements ImperativeFacet {
 
-    @SuppressWarnings("unused")
-    private final static Logger LOG = LoggerFactory.getLogger(ActionInvocationFacetForDomainEventAbstract.class);
-
     private final Method method;
     private final ObjectSpecification onType;
     private final ObjectSpecification returnType;
 
-    private final PersistenceSessionServiceInternal persistenceSessionServiceInternal;
-    private final AuthenticationSessionProvider authenticationSessionProvider;
-
-    private final ServicesInjector servicesInjector;
-    private final IsisConfiguration configuration;
+    private final ServiceRegistry serviceRegistry;
+    
     private final Class<? extends ActionDomainEvent<?>> eventType;
     private final DomainEventHelper domainEventHelper;
 
@@ -108,18 +91,14 @@ implements ImperativeFacet {
                     final Method method,
                     final ObjectSpecification onType,
                     final ObjectSpecification returnType,
-                    final FacetHolder holder,
-                    final ServicesInjector servicesInjector) {
+                    final FacetHolder holder) {
         super(holder);
         this.eventType = eventType;
         this.method = method;
         this.onType = onType;
         this.returnType = returnType;
-        this.authenticationSessionProvider = servicesInjector.getAuthenticationSessionProvider();
-        this.persistenceSessionServiceInternal = servicesInjector.getPersistenceSessionServiceInternal();
-        this.servicesInjector = servicesInjector;
-        this.configuration = _Config.getConfiguration();
-        this.domainEventHelper = new DomainEventHelper(this.servicesInjector);
+        this.serviceRegistry = getServiceRegistry();
+        this.domainEventHelper = DomainEventHelper.ofServiceRegistry(serviceRegistry);
     }
 
     /**
@@ -155,10 +134,13 @@ implements ImperativeFacet {
             final ObjectAdapter[] argumentAdapters,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        final ObjectAdapter holder = 
-                getPersistenceSessionServiceInternal().executeWithinTransaction(()->
+        final ObjectAdapter executionResult = 
+        		getTransactionService().executeWithinTransaction(()->
                     doInvoke(owningAction, targetAdapter, mixedInAdapter, argumentAdapters, interactionInitiatedBy));
-        return holder;
+        
+        PersistableTypeGuard.instate(executionResult);
+        
+        return executionResult;
     }
 
     ObjectAdapter doInvoke(
@@ -417,9 +399,9 @@ implements ImperativeFacet {
         }
 
         final Class<?> domainType = resultAdapter.getSpecification().getCorrespondingClass();
-        final MetaModelService.Sort sort = getMetaModelService().sortOf(domainType, Mode.STRICT);
+        final ManagedObjectSort sort = getMetaModelService().sortOf(domainType, Mode.STRICT);
         switch (sort) {
-        case JDO_ENTITY:
+        case ENTITY:
             final Object domainObject = resultAdapter.getPojo();
             // ensure that any still-to-be-persisted adapters get persisted to DB.
             if(!getRepositoryService().isPersistent(domainObject)) {
@@ -438,19 +420,11 @@ implements ImperativeFacet {
     }
 
     private MetaModelService getMetaModelService() {
-        return servicesInjector.lookupServiceElseFail(MetaModelService.class);
-    }
-
-    private TransactionService getTransactionService() {
-        return servicesInjector.lookupServiceElseFail(TransactionService.class);
+        return serviceRegistry.lookupServiceElseFail(MetaModelService.class);
     }
 
     private BookmarkService getBookmarkService() {
-        return servicesInjector.lookupServiceElseFail(BookmarkService.class);
-    }
-
-    private RepositoryService getRepositoryService() {
-        return servicesInjector.lookupServiceElseFail(RepositoryService.class);
+        return serviceRegistry.lookupServiceElseFail(BookmarkService.class);
     }
 
     protected ObjectAdapter filteredIfRequired(
@@ -517,56 +491,36 @@ implements ImperativeFacet {
     // /////////////////////////////////////////////////////////
 
     private CommandContext getCommandContext() {
-        return servicesInjector.lookupServiceElseFail(CommandContext.class);
+        return serviceRegistry.lookupServiceElseFail(CommandContext.class);
     }
     private InteractionContext getInteractionContext() {
-        return servicesInjector.lookupServiceElseFail(InteractionContext.class);
+        return serviceRegistry.lookupServiceElseFail(InteractionContext.class);
     }
 
     private QueryResultsCache getQueryResultsCache() {
-        return servicesInjector.lookupServiceElseFail(QueryResultsCache.class);
+        return serviceRegistry.lookupServiceElseFail(QueryResultsCache.class);
     }
 
     private CommandService getCommandService() {
-        return servicesInjector.lookupServiceElseFail(CommandService.class);
+        return serviceRegistry.lookupServiceElseFail(CommandService.class);
     }
 
     private ClockService getClockService() {
-        return servicesInjector.lookupServiceElseFail(ClockService.class);
+        return serviceRegistry.lookupServiceElseFail(ClockService.class);
     }
 
     private PublishingServiceInternal getPublishingServiceInternal() {
-        return servicesInjector.lookupServiceElseFail(PublishingServiceInternal.class);
+        return serviceRegistry.lookupServiceElseFail(PublishingServiceInternal.class);
     }
 
     private InteractionDtoServiceInternal getInteractionDtoServiceInternal() {
-        return servicesInjector.lookupServiceElseFail(InteractionDtoServiceInternal.class);
+        return serviceRegistry.lookupServiceElseFail(InteractionDtoServiceInternal.class);
     }
 
     // /////////////////////////////////////////////////////////
     // Dependencies (from constructor)
     // /////////////////////////////////////////////////////////
 
-    private ObjectAdapterProvider getObjectAdapterProvider() {
-        return persistenceSessionServiceInternal;
-    }
-    
-    private PersistenceSessionServiceInternal getPersistenceSessionServiceInternal() {
-        return persistenceSessionServiceInternal;
-    }
-
-    public IsisConfiguration getConfiguration() {
-        return configuration;
-    }
-
-    public AuthenticationSession getAuthenticationSession() {
-        return authenticationSessionProvider.getAuthenticationSession();
-    }
-
-    public TransactionState getTransactionState() {
-        return persistenceSessionServiceInternal.getTransactionState();
-    }
-
 
     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromActionAnnotation.java
index 231d9be..a358002 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromActionAnnotation.java
@@ -23,7 +23,6 @@ import java.lang.reflect.Method;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class ActionInvocationFacetForDomainEventFromActionAnnotation
@@ -34,9 +33,8 @@ extends ActionInvocationFacetForDomainEventAbstract {
                     final Method method,
                     final ObjectSpecification onType,
                     final ObjectSpecification returnType,
-                    final FacetHolder holder,
-                    final ServicesInjector servicesInjector) {
-        super(eventType, method, onType, returnType, holder, servicesInjector
-                );
+                    final FacetHolder holder) {
+        
+        super(eventType, method, onType, returnType, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromDefault.java
index 9891fa1..8db4261 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromDefault.java
@@ -23,7 +23,6 @@ import java.lang.reflect.Method;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class ActionInvocationFacetForDomainEventFromDefault
@@ -34,10 +33,7 @@ extends ActionInvocationFacetForDomainEventAbstract {
                     final Method method,
                     final ObjectSpecification onType,
                     final ObjectSpecification returnType,
-                    final FacetHolder holder,
-                    final ServicesInjector servicesInjector) {
-        super(eventType, method, onType, returnType, holder,
-                servicesInjector
-                );
+                    final FacetHolder holder) {
+        super(eventType, method, onType, returnType, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/PersistableTypeGuard.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/PersistableTypeGuard.java
new file mode 100644
index 0000000..8678bc0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/PersistableTypeGuard.java
@@ -0,0 +1,57 @@
+package org.apache.isis.core.metamodel.facets.actions.action.invocation;
+
+import org.apache.isis.commons.internal.debug._Probe;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+@Deprecated //TODO [2033] debug only
+public class PersistableTypeGuard {
+	
+	private final static String[] persistableObjects = {
+			"SimpleObject",
+			"Customer"
+	};
+	
+	private final static _Probe probe = _Probe.unlimited().label("PersistableTypeGuard"); 
+
+	public static void instate(ObjectAdapter actualAdapter) {
+		if(actualAdapter==null) {
+			return;
+		}
+		String magicString = "" + actualAdapter.getOid();
+		instate(magicString, probe, "ObjectAdapter");
+	}
+	
+	public static void instate(ObjectSpecification spec) {
+		if(spec==null) {
+			return;
+		}
+		String magicString = (spec.isViewModel() ? "!" : "") + spec.getSpecId().asString();
+		instate(magicString, probe, "ObjectSpecification");
+	}
+	
+	// -- HELPER
+	
+	protected static void instate(String magicString, _Probe probe, String type) {
+		
+		if(isPersistable(magicString)) {
+            if(magicString.contains("!")) {
+    			probe.println("Intercepted by guard [%s] '%s'", type, magicString);
+                throw _Exceptions.unexpectedCodeReach();
+            }            
+            probe.println("[%s] '%s'", type, magicString);
+        }
+	}
+	
+	protected static boolean isPersistable(String input) {
+		for(String x : persistableObjects) {
+			if(input.contains("."+x+":")) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/typeof/TypeOfFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/typeof/TypeOfFacetForActionAnnotation.java
index d06d313..c8dac67 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/typeof/TypeOfFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/typeof/TypeOfFacetForActionAnnotation.java
@@ -21,15 +21,13 @@ package org.apache.isis.core.metamodel.facets.actions.action.typeof;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class TypeOfFacetForActionAnnotation extends TypeOfFacetAbstract {
 
     public TypeOfFacetForActionAnnotation(
             final Class<?> type,
-            final SpecificationLoader specificationLookup,
             final FacetHolder holder) {
-        super(type, holder, specificationLookup);
+        super(type, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/CommandFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/CommandFacetAbstract.java
index ca55e8e..a60b99c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/CommandFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/CommandFacetAbstract.java
@@ -24,10 +24,10 @@ import java.util.Map;
 import org.apache.isis.applib.annotation.CommandExecuteIn;
 import org.apache.isis.applib.annotation.CommandPersistence;
 import org.apache.isis.applib.services.command.CommandDtoProcessor;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.MarkerFacetAbstract;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public abstract class CommandFacetAbstract extends MarkerFacetAbstract implements CommandFacet {
 
@@ -55,7 +55,7 @@ public abstract class CommandFacetAbstract extends MarkerFacetAbstract implement
             final Enablement enablement,
             final CommandDtoProcessor processor,
             final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
+            final ServiceInjector servicesInjector) {
         super(type(), holder);
         inject(processor, servicesInjector);
         this.persistence = persistence;
@@ -65,7 +65,7 @@ public abstract class CommandFacetAbstract extends MarkerFacetAbstract implement
     }
 
     private static void inject(
-            final CommandDtoProcessor processor, final ServicesInjector servicesInjector) {
+            final CommandDtoProcessor processor, final ServiceInjector servicesInjector) {
         if(processor == null || servicesInjector == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java
index 661f812..d11a7fb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.homepage.annotation;
 
+import static org.apache.isis.commons.internal.functions._Predicates.not;
+
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -40,8 +42,6 @@ import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVis
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting.Visitor;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 
-import static org.apache.isis.commons.internal.functions._Predicates.not;
-
 public class HomePageFacetAnnotationFactory extends FacetFactoryAbstract implements MetaModelValidatorRefiner{
 
     public HomePageFacetAnnotationFactory() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
index ea9cec5..d3f798b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
@@ -78,7 +78,7 @@ public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFace
         }
         processMethodContext.removeMethod(validateMethod);
 
-        final TranslationService translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);;
+        final TranslationService translationService = getTranslationService();
         // sadness: same as in TranslationFactory
         final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
         final ActionValidationFacetViaMethod facet = new ActionValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
@@ -109,7 +109,7 @@ public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFace
 
         processParameterContext.removeMethod(validateMethod);
 
-        final TranslationService translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);;
+        final TranslationService translationService = getTranslationService();
         // sadness: same as in TranslationFactory
         final String translationContext = facetHolder.getIdentifier().toFullIdentityString();
         final Facet facet = new ActionParameterValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/TranslationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/TranslationFacetFactory.java
index 8ee5072..1c0e21f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/TranslationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/TranslationFacetFactory.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets.all.i18n;
 
 
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
@@ -29,7 +30,6 @@ import org.apache.isis.core.metamodel.facets.ContributeeMemberFacetFactory;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class TranslationFacetFactory extends FacetFactoryAbstract implements ContributeeMemberFacetFactory {
 
@@ -121,7 +121,7 @@ public class TranslationFacetFactory extends FacetFactoryAbstract implements Con
     // //////////////////////////////////////
 
     /**
-     * Looks up from {@link ServicesInjector}.
+     * Looks up from {@link ServiceInjector}.
      *
      * <p>
      *     There is guaranteed to be an instance because <code>TranslationServicePo</code> (in runtime) is annotated
@@ -130,7 +130,7 @@ public class TranslationFacetFactory extends FacetFactoryAbstract implements Con
      */
     TranslationService lookupTranslationService() {
         if(translationService == null) {
-            translationService = servicesInjector.lookupServiceElseFail(TranslationService.class);
+            translationService = getTranslationService();
         }
         return translationService;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
index 8c0c747..1c6bbd6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
@@ -27,7 +27,6 @@ import java.util.Map;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.CollectionUtils;
@@ -35,8 +34,6 @@ import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 public class CollectionAccessorFacetViaAccessor
 extends PropertyOrCollectionAccessorFacetAbstract
@@ -47,11 +44,8 @@ implements ImperativeFacet {
     public CollectionAccessorFacetViaAccessor(
             final ObjectSpecification typeSpec,
             final Method method,
-            final FacetHolder holder,
-            final SpecificationLoader specificationLoader,
-            final AuthenticationSessionProvider authenticationSessionProvider,
-            final ObjectAdapterProvider adapterManager) {
-        super(typeSpec, holder, specificationLoader, authenticationSessionProvider, adapterManager);
+            final FacetHolder holder) {
+        super(typeSpec, holder);
         this.method = method;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
index 93ef1fd..ad8d977 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
@@ -23,7 +23,6 @@ import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.List;
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -32,7 +31,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacetDefault;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class CollectionAccessorFacetViaAccessorFactory
@@ -59,10 +57,7 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
         FacetUtil.addFacet(
                 new CollectionAccessorFacetViaAccessor(
-                        typeSpec, accessorMethod, holder,
-                        getSpecificationLoader(),
-                        getAuthenticationSessionProvider(), adapterProvider
-                        ));
+                        typeSpec, accessorMethod, holder));
 
         FacetUtil.addFacet(CollectionSemanticsFacetDefault.forCollection(accessorMethod, holder));
     }
@@ -111,13 +106,4 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
         // does nothing
     }
 
-
-
-    @Override public void setServicesInjector(final ServicesInjector servicesInjector) {
-        super.setServicesInjector(servicesInjector);
-        adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
-    }
-
-    ObjectAdapterProvider adapterProvider;
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
index b2d21f6..b7b9e85 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
@@ -22,7 +22,6 @@ package org.apache.isis.core.metamodel.facets.collections.clear;
 import java.lang.reflect.Method;
 
 import org.apache.isis.core.commons.lang.StringExtensions;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -31,7 +30,6 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstra
 import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class CollectionClearFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
@@ -67,22 +65,8 @@ public class CollectionClearFacetFactory extends MethodPrefixBasedFacetFactoryAb
         if (clearMethodIfAny != null) {
             return new CollectionClearFacetViaClearMethod(clearMethodIfAny, collection);
         } else {
-            return new CollectionClearFacetViaAccessor(accessorMethod, collection, adapterProvider);
+            return new CollectionClearFacetViaAccessor(accessorMethod, collection);
         }
     }
 
-    // ///////////////////////////////////////////////////////
-    // Dependencies (injected)
-    // ///////////////////////////////////////////////////////
-
-
-    @Override
-    public void setServicesInjector(final ServicesInjector servicesInjector) {
-        super.setServicesInjector(servicesInjector);
-        adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
-    }
-
-    ObjectAdapterProvider adapterProvider;
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaAccessor.java
index 83d1ffe..80ce814 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaAccessor.java
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacetAbstract;
@@ -34,16 +33,13 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearF
 public class CollectionClearFacetViaAccessor extends CollectionClearFacetAbstract implements ImperativeFacet {
 
     private final Method method;
-    private final ObjectAdapterProvider adapterProvider;
 
     public CollectionClearFacetViaAccessor(
             final Method method,
-            final FacetHolder holder,
-            final ObjectAdapterProvider adapterProvider) {
+            final FacetHolder holder) {
         
         super(holder);
         this.method = method;
-        this.adapterProvider = adapterProvider;
     }
 
     /**
@@ -75,10 +71,6 @@ public class CollectionClearFacetViaAccessor extends CollectionClearFacetAbstrac
     // Dependencies (from constructor)
     // /////////////////////////////////////////////////////////
 
-    protected ObjectAdapterProvider getObjectAdapterProvider() {
-        return adapterProvider;
-    }
-
     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
index 0ce6680..d9b4646 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
@@ -106,10 +106,10 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
                 .map(domainEvent ->
                 (CollectionDomainEventFacetAbstract)
                 new CollectionDomainEventFacetForCollectionAnnotation(
-                        defaultFromDomainObjectIfRequired(typeSpec, domainEvent), servicesInjector, getSpecificationLoader(), holder))
+                        defaultFromDomainObjectIfRequired(typeSpec, domainEvent), holder))
                 .orElse(
                         new CollectionDomainEventFacetDefault(
-                                defaultFromDomainObjectIfRequired(typeSpec, CollectionDomainEvent.Default.class), servicesInjector, getSpecificationLoader(), holder)
+                                defaultFromDomainObjectIfRequired(typeSpec, CollectionDomainEvent.Default.class), holder)
                         );
         if(!CollectionDomainEvent.Noop.class.isAssignableFrom(collectionDomainEventFacet.getEventType())) {
             FacetUtil.addFacet(collectionDomainEventFacet);
@@ -138,12 +138,14 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
 
             if(collectionDomainEventFacet instanceof CollectionDomainEventFacetForCollectionAnnotation) {
                 replacementFacet = new CollectionAddToFacetForDomainEventFromCollectionAnnotation(
-                        collectionDomainEventFacet.getEventType(), getterFacet, collectionAddToFacet, collectionDomainEventFacet, holder, servicesInjector);
+                        collectionDomainEventFacet.getEventType(), getterFacet, collectionAddToFacet, 
+                        collectionDomainEventFacet, holder, getServiceRegistry());
             } else
                 // default
             {
                 replacementFacet = new CollectionAddToFacetForDomainEventFromDefault(
-                        collectionDomainEventFacet.getEventType(), getterFacet, collectionAddToFacet, collectionDomainEventFacet, holder, servicesInjector);
+                        collectionDomainEventFacet.getEventType(), getterFacet, 
+                        collectionAddToFacet, collectionDomainEventFacet, holder, getServiceRegistry());
             }
             FacetUtil.addFacet(replacementFacet);
         }
@@ -155,11 +157,10 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
             final CollectionRemoveFromFacetForDomainEventFromAbstract replacementFacet;
 
             if(collectionDomainEventFacet instanceof CollectionDomainEventFacetForCollectionAnnotation) {
-                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation(collectionDomainEventFacet.getEventType(), getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, servicesInjector, holder);
-            } else
+                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation(collectionDomainEventFacet.getEventType(), getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, getServiceRegistry(), holder);
+            } else {
                 // default
-            {
-                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromDefault(collectionDomainEventFacet.getEventType(), getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, servicesInjector, holder);
+                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromDefault(collectionDomainEventFacet.getEventType(), getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, getServiceRegistry(), holder);
             }
             FacetUtil.addFacet(replacementFacet);
         }
@@ -227,14 +228,14 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         // check for @Collection(typeOf=...)
         final List<Collection> collections = Annotations.getAnnotations(method, Collection.class);
         TypeOfFacet facet = TypeOfFacetOnCollectionFromCollectionAnnotation
-                .create(collections, facetHolder, getSpecificationLoader());
+                .create(collections, facetHolder);
 
         // else infer from return type
         if(facet == null) {
             final Class<?> returnType = method.getReturnType();
             if (returnType.isArray()) {
                 final Class<?> componentType = returnType.getComponentType();
-                facet = new TypeOfFacetInferredFromArray(componentType, facetHolder, getSpecificationLoader());
+                facet = new TypeOfFacetInferredFromArray(componentType, facetHolder);
             }
         }
 
@@ -265,7 +266,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         final Object actualTypeArgument = actualTypeArguments[0];
         if (actualTypeArgument instanceof Class) {
             final Class<?> actualType = (Class<?>) actualTypeArgument;
-            return new TypeOfFacetInferredFromGenerics(actualType, facetHolder, getSpecificationLoader());
+            return new TypeOfFacetInferredFromGenerics(actualType, facetHolder);
         }
 
         if (actualTypeArgument instanceof TypeVariable) {
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 892446d..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
@@ -26,6 +26,7 @@ import java.util.Set;
 
 import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -34,7 +35,6 @@ import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public abstract class CollectionAddToFacetForDomainEventFromAbstract
 extends SingleValueFacetAbstract<Class<? extends CollectionDomainEvent<?,?>>>
@@ -48,21 +48,19 @@ implements CollectionAddToFacet {
 
     private final PropertyOrCollectionAccessorFacet getterFacet;
     private final CollectionAddToFacet collectionAddToFacet;
-    // TODO: seems to be unused, remove?
-    private final CollectionDomainEventFacetAbstract collectionDomainEventFacet;
 
     public CollectionAddToFacetForDomainEventFromAbstract(
             final Class<? extends CollectionDomainEvent<?, ?>> eventType,
                     final PropertyOrCollectionAccessorFacet getterFacet,
                     final CollectionAddToFacet collectionAddToFacet,
                     final CollectionDomainEventFacetAbstract collectionDomainEventFacet,
-                    final ServicesInjector servicesInjector,
+                    final ServiceRegistry serviceRegistry,
                     final FacetHolder holder) {
+    	
         super(type(), eventType, holder);
         this.getterFacet = getterFacet;
         this.collectionAddToFacet = collectionAddToFacet;
-        this.collectionDomainEventFacet = collectionDomainEventFacet;
-        this.domainEventHelper = new DomainEventHelper(servicesInjector);
+        this.domainEventHelper = DomainEventHelper.ofServiceRegistry(serviceRegistry);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromCollectionAnnotation.java
index 37961e0..0922e0e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromCollectionAnnotation.java
@@ -20,10 +20,10 @@
 package org.apache.isis.core.metamodel.facets.collections.collection.modify;
 
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class CollectionAddToFacetForDomainEventFromCollectionAnnotation
 extends CollectionAddToFacetForDomainEventFromAbstract {
@@ -33,8 +33,10 @@ extends CollectionAddToFacetForDomainEventFromAbstract {
                     final PropertyOrCollectionAccessorFacet getterFacet,
                     final CollectionAddToFacet collectionAddToFacet,
                     final CollectionDomainEventFacetAbstract collectionInteractionFacet,
-                    final FacetHolder holder, final ServicesInjector servicesInjector) {
-        super(eventType, getterFacet, collectionAddToFacet, collectionInteractionFacet, servicesInjector, holder);
+                    final FacetHolder holder, 
+                    final ServiceRegistry serviceRegistry) {
+    	
+        super(eventType, getterFacet, collectionAddToFacet, collectionInteractionFacet, serviceRegistry, holder);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromDefault.java
index 8b6d9bd..194481d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromDefault.java
@@ -20,10 +20,10 @@
 package org.apache.isis.core.metamodel.facets.collections.collection.modify;
 
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class CollectionAddToFacetForDomainEventFromDefault
 extends CollectionAddToFacetForDomainEventFromAbstract {
@@ -33,8 +33,8 @@ extends CollectionAddToFacetForDomainEventFromAbstract {
                     final PropertyOrCollectionAccessorFacet getterFacet,
                     final CollectionAddToFacet collectionAddToFacet,
                     final CollectionDomainEventFacetAbstract collectionInteractionFacet,
-                    final FacetHolder holder, final ServicesInjector servicesInjector) {
-        super(eventType, getterFacet, collectionAddToFacet, collectionInteractionFacet, servicesInjector, holder);
+                    final FacetHolder holder, final ServiceRegistry serviceRegistry) {
+        super(eventType, getterFacet, collectionAddToFacet, collectionInteractionFacet, serviceRegistry, holder);
     }
 
 
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 baf9f95..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
@@ -36,8 +36,6 @@ import org.apache.isis.core.metamodel.interactions.ProposedHolder;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class CollectionDomainEventFacetAbstract extends SingleClassValueFacetAbstract implements CollectionDomainEventFacet {
 
@@ -47,17 +45,16 @@ public abstract class CollectionDomainEventFacetAbstract extends SingleClassValu
 
     public CollectionDomainEventFacetAbstract(
             final Class<? extends CollectionDomainEvent<?, ?>> eventType,
-                    final FacetHolder holder,
-                    final ServicesInjector servicesInjector,
-                    final SpecificationLoader specificationLoader) {
-        super(CollectionDomainEventFacet.class, holder, eventType, specificationLoader);
+                    final FacetHolder holder) {
+        
+        super(CollectionDomainEventFacet.class, holder, eventType);
         this.eventType = eventType;
 
-        this.translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);;
+        this.translationService = getTranslationService();
         // sadness: same as in TranslationFactory
         this.translationContext = ((IdentifiedHolder)holder).getIdentifier().toClassAndNameIdentityString();
 
-        domainEventHelper = new DomainEventHelper(servicesInjector);
+        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/CollectionDomainEventFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetDefault.java
index bab5423..c327b3e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetDefault.java
@@ -21,15 +21,12 @@ package org.apache.isis.core.metamodel.facets.collections.collection.modify;
 
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class CollectionDomainEventFacetDefault extends CollectionDomainEventFacetAbstract {
 
     public CollectionDomainEventFacetDefault(
-            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
-                    final ServicesInjector servicesInjector, final SpecificationLoader specificationLoader, final FacetHolder holder) {
-        super(eventType, holder, servicesInjector, specificationLoader);
+            final Class<? extends CollectionDomainEvent<?, ?>> eventType, final FacetHolder holder) {
+        super(eventType, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForCollectionAnnotation.java
index 9d388fa..656fa30 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForCollectionAnnotation.java
@@ -21,26 +21,25 @@ package org.apache.isis.core.metamodel.facets.collections.collection.modify;
 
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class CollectionDomainEventFacetForCollectionAnnotation extends CollectionDomainEventFacetAbstract {
 
     static CollectionDomainEventFacet create(
             final Collection collection,
-            final ServicesInjector servicesInjector,
+            final ServiceInjector servicesInjector,
             final SpecificationLoader specificationLoader,
             final FacetHolder holder) {
         Class<? extends CollectionDomainEvent<?, ?>> collectionInteractionEventType = collection.domainEvent();
         return new CollectionDomainEventFacetForCollectionAnnotation(
-                collectionInteractionEventType, servicesInjector, specificationLoader, holder);
+                collectionInteractionEventType, holder);
     }
 
     public CollectionDomainEventFacetForCollectionAnnotation(
-            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
-                    final ServicesInjector servicesInjector, final SpecificationLoader specificationLoader, final FacetHolder holder) {
-        super(eventType, holder, servicesInjector, specificationLoader);
+            final Class<? extends CollectionDomainEvent<?, ?>> eventType, final FacetHolder holder) {
+        super(eventType, holder);
     }
 
 }
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 5bdd17b..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
@@ -22,12 +22,12 @@ package org.apache.isis.core.metamodel.facets.collections.collection.modify;
 import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
 
 import java.util.Collection;
+import java.util.Map;
 
 import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Casts;
-import java.util.Map;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -36,7 +36,6 @@ import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 
 public abstract class CollectionRemoveFromFacetForDomainEventFromAbstract
@@ -49,8 +48,6 @@ implements CollectionRemoveFromFacet {
 
     private final PropertyOrCollectionAccessorFacet getterFacet;
     private final CollectionRemoveFromFacet collectionRemoveFromFacet;
-    // TODO: seems to be unused, remove?
-    private final CollectionDomainEventFacetAbstract collectionDomainEventFacet;
 
     private final DomainEventHelper domainEventHelper;
 
@@ -59,13 +56,13 @@ implements CollectionRemoveFromFacet {
                     final PropertyOrCollectionAccessorFacet getterFacet,
                     final CollectionRemoveFromFacet collectionRemoveFromFacet,
                     final CollectionDomainEventFacetAbstract collectionDomainEventFacet,
-                    final ServicesInjector servicesInjector,
+                    final ServiceRegistry serviceRegistry,
                     final FacetHolder holder) {
+    	
         super(type(), eventType, holder);
         this.getterFacet = getterFacet;
         this.collectionRemoveFromFacet = collectionRemoveFromFacet;
-        this.collectionDomainEventFacet = collectionDomainEventFacet;
-        this.domainEventHelper = new DomainEventHelper(servicesInjector);
+        this.domainEventHelper = DomainEventHelper.ofServiceRegistry(serviceRegistry);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation.java
index 6f26398..de6c58a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation.java
@@ -20,10 +20,10 @@
 package org.apache.isis.core.metamodel.facets.collections.collection.modify;
 
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation extends
 CollectionRemoveFromFacetForDomainEventFromAbstract {
@@ -33,9 +33,11 @@ CollectionRemoveFromFacetForDomainEventFromAbstract {
                     final PropertyOrCollectionAccessorFacet getterFacet,
                     final CollectionRemoveFromFacet collectionRemoveFromFacet,
                     final CollectionDomainEventFacetAbstract collectionInteractionFacet,
-                    final ServicesInjector servicesInjector,
+                    final ServiceRegistry serviceRegistry,
                     final FacetHolder holder) {
-        super(eventType, getterFacet, collectionRemoveFromFacet, collectionInteractionFacet, servicesInjector, holder);
+    	
+        super(eventType, getterFacet, collectionRemoveFromFacet, collectionInteractionFacet, 
+        		serviceRegistry, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromDefault.java
index c27c32f..046e5aa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromDefault.java
@@ -20,10 +20,10 @@
 package org.apache.isis.core.metamodel.facets.collections.collection.modify;
 
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class CollectionRemoveFromFacetForDomainEventFromDefault extends
 CollectionRemoveFromFacetForDomainEventFromAbstract {
@@ -33,9 +33,9 @@ CollectionRemoveFromFacetForDomainEventFromAbstract {
                     final PropertyOrCollectionAccessorFacet getterFacet,
                     final CollectionRemoveFromFacet collectionRemoveFromFacet,
                     final CollectionDomainEventFacetAbstract collectionInteractionFacet,
-                    final ServicesInjector servicesInjector,
+                    final ServiceRegistry serviceRegistry,
                     final FacetHolder holder) {
-        super(eventType, getterFacet, collectionRemoveFromFacet, collectionInteractionFacet, servicesInjector, holder);
+        super(eventType, getterFacet, collectionRemoveFromFacet, collectionInteractionFacet, serviceRegistry, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/typeof/TypeOfFacetOnCollectionFromCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/typeof/TypeOfFacetOnCollectionFromCollectionAnnotation.java
index 3f8b860..286a439 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/typeof/TypeOfFacetOnCollectionFromCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/typeof/TypeOfFacetOnCollectionFromCollectionAnnotation.java
@@ -25,27 +25,24 @@ import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class TypeOfFacetOnCollectionFromCollectionAnnotation extends TypeOfFacetAbstract {
 
     public static TypeOfFacetOnCollectionFromCollectionAnnotation create(
             final List<Collection> collections,
-            final FacetedMethod facetHolder,
-            final SpecificationLoader specificationLoader) {
-
+            final FacetedMethod facetHolder) {
 
         return collections.stream()
                 .map(Collection::typeOf)
                 .filter(typeOf -> typeOf != Object.class)
                 .findFirst()
                 .map(typeOf ->
-                new TypeOfFacetOnCollectionFromCollectionAnnotation(typeOf, facetHolder, specificationLoader))
+                new TypeOfFacetOnCollectionFromCollectionAnnotation(typeOf, facetHolder))
                 .orElse(null);
     }
 
-    private TypeOfFacetOnCollectionFromCollectionAnnotation(final Class<?> type, final FacetHolder holder, final SpecificationLoader specificationLookup) {
-        super(type, holder, specificationLookup);
+    private TypeOfFacetOnCollectionFromCollectionAnnotation(final Class<?> type, final FacetHolder holder) {
+        super(type, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/CollectionFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/CollectionFacetFactory.java
index 7a605e4..d03621c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/CollectionFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/CollectionFacetFactory.java
@@ -21,7 +21,6 @@ package org.apache.isis.core.metamodel.facets.collections.javautilcollection;
 
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.commons.internal.collections._Collections;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
@@ -30,7 +29,6 @@ import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetDefaultTo
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class CollectionFacetFactory extends FacetFactoryAbstract {
 
@@ -58,12 +56,12 @@ public class CollectionFacetFactory extends FacetFactoryAbstract {
             final Class<?> collectionElementType = collectionElementType(cls);
             typeOfFacet =
                     collectionElementType != Object.class
-                    ? new TypeOfFacetInferredFromGenerics(collectionElementType, facetHolder, getSpecificationLoader())
-                            : new TypeOfFacetDefaultToObject(facetHolder, getSpecificationLoader());
+                    ? new TypeOfFacetInferredFromGenerics(collectionElementType, facetHolder)
+                            : new TypeOfFacetDefaultToObject(facetHolder);
                     facetHolder.addFacet(typeOfFacet);
         }
 
-        final CollectionFacet collectionFacet = new JavaCollectionFacet(facetHolder, adapterProvider);
+        final CollectionFacet collectionFacet = new JavaCollectionFacet(facetHolder);
 
         facetHolder.addFacet(collectionFacet);
     }
@@ -72,11 +70,11 @@ public class CollectionFacetFactory extends FacetFactoryAbstract {
         final Class<?> cls = processClassContext.getCls();
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final CollectionFacet collectionFacet = new JavaArrayFacet(facetHolder, adapterProvider);
+        final CollectionFacet collectionFacet = new JavaArrayFacet(facetHolder);
         facetHolder.addFacet(collectionFacet);
 
         final TypeOfFacet typeOfFacet =
-                new TypeOfFacetInferredFromArray(cls.getComponentType(), facetHolder, getSpecificationLoader());
+                new TypeOfFacetInferredFromArray(cls.getComponentType(), facetHolder);
         facetHolder.addFacet(typeOfFacet);
     }
 
@@ -85,17 +83,4 @@ public class CollectionFacetFactory extends FacetFactoryAbstract {
         return Object.class;
     }
 
-    // //////////////////////////////////////////////////////////////
-    // Dependencies (injected)
-    // //////////////////////////////////////////////////////////////
-
-
-    @Override
-    public void setServicesInjector(final ServicesInjector servicesInjector) {
-        super.setServicesInjector(servicesInjector);
-        adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
-    }
-
-    ObjectAdapterProvider adapterProvider;
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/JavaArrayFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/JavaArrayFacet.java
index dcee031..a635296 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/JavaArrayFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/JavaArrayFacet.java
@@ -34,11 +34,8 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class JavaArrayFacet extends CollectionFacetAbstract {
 
-    private final ObjectAdapterProvider adapterProvider;
-
-    public JavaArrayFacet(final FacetHolder holder, final ObjectAdapterProvider adapterProvider) {
+    public JavaArrayFacet(final FacetHolder holder) {
         super(holder);
-        this.adapterProvider = adapterProvider;
     }
 
     @Override
@@ -60,8 +57,11 @@ public class JavaArrayFacet extends CollectionFacetAbstract {
         if(isEmpty(array)) {
             return Stream.of();
         }
+        
+        final ObjectAdapterProvider adapterProvider = getObjectAdapterProvider();
+        
         return Stream.of(array)
-                .map(getObjectAdapterProvider()::adapterFor) //FIXME[ISIS-1976] we always generate an OA here
+                .map(adapterProvider::adapterFor) //FIXME[ISIS-1976] we always generate an OA here
                 .map(x->(T)x);
     }
     
@@ -79,18 +79,5 @@ public class JavaArrayFacet extends CollectionFacetAbstract {
         return (Object[]) arrayAdapter.getPojo();
     }
 
-    // /////////////////////////////////////////////////////
-    // Dependencies (from constructor)
-    // /////////////////////////////////////////////////////
-
-    private ObjectAdapterProvider getObjectAdapterProvider() {
-        return adapterProvider;
-    }
-
-
-
-
-
-
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/JavaCollectionFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/JavaCollectionFacet.java
index 51de333..c2e423f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/JavaCollectionFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/javautilcollection/JavaCollectionFacet.java
@@ -24,7 +24,6 @@ import java.util.function.Supplier;
 import java.util.stream.Stream;
 
 import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -34,11 +33,8 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public class JavaCollectionFacet extends CollectionFacetAbstract {
 
-    private final ObjectAdapterProvider adapterProvider;
-
-    public JavaCollectionFacet(final FacetHolder holder, final ObjectAdapterProvider adapterProvider) {
+    public JavaCollectionFacet(final FacetHolder holder) {
         super(holder);
-        this.adapterProvider = adapterProvider;
     }
     
     @Override
@@ -61,6 +57,9 @@ public class JavaCollectionFacet extends CollectionFacetAbstract {
 
     @Override
     public <T extends ManagedObject> Stream<T> stream(T collectionAdapter) {
+        
+        final ObjectAdapterProvider adapterProvider = getObjectAdapterProvider();
+        
         return pojoCollection(collectionAdapter)
                 .stream()
                 .map(adapterProvider::adapterFor) //FIXME[ISIS-1976] we always generate an OA here
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
index 5816f3f..d75075e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
@@ -39,12 +39,14 @@ public class SortedByFacetForCollectionXml extends SortedByFacetAbstract {
         if (sortedBy == null) {
             return null;
         }
-        final Class<?> sortedByClass = ClassUtil.forName(sortedBy);
+        final Class<?> sortedByClass = ClassUtil.forNameElseFail(sortedBy);
         if(sortedByClass == Comparator.class) {
             return null;
         }
 
-        return sortedByClass != null ? new SortedByFacetForCollectionXml(uncheckedCast(sortedByClass), holder) : null;
+        return sortedByClass != null 
+        		? new SortedByFacetForCollectionXml(uncheckedCast(sortedByClass), holder) 
+        				: null;
     }
 
     private SortedByFacetForCollectionXml(Class<? extends Comparator<?>> sortedBy, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java
index c1e98f0..9b48cfc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java
@@ -117,7 +117,7 @@ public class CollectionAddToRemoveFromAndValidateFacetFactory extends MethodPref
 
         final Class<?> type = addType != null ? addType : removeType;
         if (type != null) {
-            FacetUtil.addFacet(new TypeOfFacetInferredFromSupportingMethods(type, collection, getSpecificationLoader()));
+            FacetUtil.addFacet(new TypeOfFacetInferredFromSupportingMethods(type, collection));
         }
         return type;
     }
@@ -152,7 +152,7 @@ public class CollectionAddToRemoveFromAndValidateFacetFactory extends MethodPref
         processMethodContext.removeMethod(validateAddToMethod);
 
         final IdentifiedHolder facetHolder = processMethodContext.getFacetHolder();
-        final TranslationService translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);;
+        final TranslationService translationService = getTranslationService();
         // sadness: same as in TranslationFactory
         final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
 
@@ -185,7 +185,7 @@ public class CollectionAddToRemoveFromAndValidateFacetFactory extends MethodPref
         processMethodContext.removeMethod(validateRemoveFromMethod);
 
         final IdentifiedHolder facetHolder = processMethodContext.getFacetHolder();
-        final TranslationService translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);;
+        final TranslationService translationService = getTranslationService();
         // sadness: same as in TranslationFactory
         final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/TypeOfFacetInferredFromSupportingMethods.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/TypeOfFacetInferredFromSupportingMethods.java
index 6706b94..2e236fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/TypeOfFacetInferredFromSupportingMethods.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/TypeOfFacetInferredFromSupportingMethods.java
@@ -21,12 +21,11 @@ package org.apache.isis.core.metamodel.facets.collections.modify;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class TypeOfFacetInferredFromSupportingMethods extends TypeOfFacetAbstract {
 
-    public TypeOfFacetInferredFromSupportingMethods(final Class<?> type, final FacetHolder holder, final SpecificationLoader specificationLookup) {
-        super(type, holder, specificationLookup);
+    public TypeOfFacetInferredFromSupportingMethods(final Class<?> type, final FacetHolder holder) {
+        super(type, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbFacetFactory.java
index 5898dd0..13f3be3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbFacetFactory.java
@@ -34,7 +34,6 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 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.metamodel.JdoMetamodelUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -100,7 +99,7 @@ implements MetaModelValidatorRefiner {
 
         final FacetHolder holder = processClassContext.getFacetHolder();
         final XmlJavaTypeAdapterFacetDefault facet = new XmlJavaTypeAdapterFacetDefault(holder,
-                annotation.value(), getSpecificationLoader());
+                annotation.value());
 
         FacetUtil.addFacet(facet);
     }
@@ -148,7 +147,7 @@ implements MetaModelValidatorRefiner {
 
         final FacetHolder holder = processMethodContext.getFacetHolder();
         final XmlJavaTypeAdapterFacetDefault facet = new XmlJavaTypeAdapterFacetDefault(holder,
-                annotation.value(), getSpecificationLoader());
+                annotation.value());
 
         FacetUtil.addFacet(facet);
     }
@@ -276,8 +275,7 @@ implements MetaModelValidatorRefiner {
                 final ValidationFailures validationFailures) {
 
             final ObjectSpecification propertyTypeSpec = property.getSpecification();
-            final Class<?> propertyType = propertyTypeSpec.getCorrespondingClass();
-            if (!JdoMetamodelUtil.isPersistenceEnhanced(propertyType)) {
+            if (!propertyTypeSpec.isEntity()) {
                 return;
             }
 
@@ -286,7 +284,7 @@ implements MetaModelValidatorRefiner {
             if(xmlJavaTypeAdapterFacet != null) {
                 return;
             }
-
+            final Class<?> propertyType = propertyTypeSpec.getCorrespondingClass();
             validationFailures.add("JAXB view model '%s' property '%s' is of type '%s' but that type is not annotated with @XmlJavaTypeAdapter.  The type must be annotated with @XmlJavaTypeAdapter(org.apache.isis.schema.utils.jaxbadapters.PersistentEntityAdapter.class) or equivalent.",
                     objectSpec.getFullIdentifier(),
                     property.getId(),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetAbstract.java
index e79e6ce..7e82a00 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetAbstract.java
@@ -21,7 +21,6 @@ package org.apache.isis.core.metamodel.facets.jaxb;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class XmlJavaTypeAdapterFacetAbstract
 extends SingleClassValueFacetAbstract implements XmlJavaTypeAdapterFacet {
@@ -32,9 +31,8 @@ extends SingleClassValueFacetAbstract implements XmlJavaTypeAdapterFacet {
 
     public XmlJavaTypeAdapterFacetAbstract(
             final FacetHolder holder,
-            final Class<?> value,
-            final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<?> value) {
+        super(type(), holder, value);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetDefault.java
index 97d2cbd..8eb1d65 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/XmlJavaTypeAdapterFacetDefault.java
@@ -20,14 +20,12 @@
 package org.apache.isis.core.metamodel.facets.jaxb;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class XmlJavaTypeAdapterFacetDefault extends XmlJavaTypeAdapterFacetAbstract {
 
     public XmlJavaTypeAdapterFacetDefault(
             final FacetHolder holder,
-            final Class<?> value,
-            final SpecificationLoader specificationLoader) {
-        super(holder, value, specificationLoader);
+            final Class<?> value) {
+        super(holder, value);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
index e89a158..2159fba 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract.java
@@ -21,7 +21,6 @@ package org.apache.isis.core.metamodel.facets.members.cssclass;
 
 import java.util.Map;
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract2.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract2.java
index a46fbd4..94af7c8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract2.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclass/CssClassFacetAbstract2.java
@@ -19,9 +19,6 @@
 
 package org.apache.isis.core.metamodel.facets.members.cssclass;
 
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
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 bbe92d3..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
@@ -55,13 +55,14 @@ public class CssClassFacetOnActionFromConfiguredRegexFactory extends FacetFactor
         final Method method = processMethodContext.getMethod();
         final String name = method.getName();
 
-        // bit of a bodge... we want to ignore any service actions; any contributed actions will be picked up below
+        // bit of a bodge... we want to ignore any service actions; any contributed actions 
+        // will be picked up below
         // in process(final ProcessContributeeMemberContext processMemberContext)
         //
-        // 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.
+        // 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(servicesInjector.isService(owningType)) {
+        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/members/disabled/forsession/DisableForSessionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetAbstract.java
index 339c502..1bc7847 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetAbstract.java
@@ -24,22 +24,16 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 public abstract class DisableForSessionFacetAbstract extends FacetAbstract implements DisableForSessionFacet {
 
-    private final AuthenticationSessionProvider authenticationSessionProvider;
-
     public static Class<? extends Facet> type() {
         return DisableForSessionFacet.class;
     }
 
     public DisableForSessionFacetAbstract(
-            final FacetHolder holder,
-            final AuthenticationSessionProvider authenticationSessionProvider) {
+            final FacetHolder holder) {
         super(type(), holder, Derivation.NOT_DERIVED);
-        this.authenticationSessionProvider = authenticationSessionProvider;
     }
 
     @Override
@@ -47,8 +41,4 @@ public abstract class DisableForSessionFacetAbstract extends FacetAbstract imple
         return disabledReason(getAuthenticationSession());
     }
 
-    protected AuthenticationSession getAuthenticationSession() {
-        return authenticationSessionProvider.getAuthenticationSession();
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetNone.java
index 449cfd3..5454b4e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetNone.java
@@ -21,14 +21,12 @@ package org.apache.isis.core.metamodel.facets.members.disabled.forsession;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 public class DisableForSessionFacetNone extends DisableForSessionFacetAbstract {
 
     public DisableForSessionFacetNone(
-            final FacetHolder holder,
-            final AuthenticationSessionProvider authenticationSessionProvider) {
-        super(holder, authenticationSessionProvider);
+            final FacetHolder holder) {
+        super(holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethod.java
index 159b509..32f3b43 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethod.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.commons.lang.MethodExtensions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 public class DisableForSessionFacetViaMethod extends DisableForSessionFacetAbstract implements ImperativeFacet {
 
@@ -36,9 +35,8 @@ public class DisableForSessionFacetViaMethod extends DisableForSessionFacetAbstr
 
     public DisableForSessionFacetViaMethod(
             final Method method,
-            final FacetHolder holder,
-            final AuthenticationSessionProvider authenticationSessionProvider) {
-        super(holder, authenticationSessionProvider);
+            final FacetHolder holder) {
+        super(holder);
         this.method = method;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethodFactory.java
index 0b9f7b4..a623ee1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethodFactory.java
@@ -72,8 +72,7 @@ public class DisableForSessionFacetViaMethodFactory extends MethodPrefixBasedFac
         processMethodContext.removeMethod(disableForSessionMethod);
 
         final FacetHolder facetedMethod = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new DisableForSessionFacetViaMethod(disableForSessionMethod, facetedMethod,
-                authenticationSessionProvider));
+        FacetUtil.addFacet(new DisableForSessionFacetViaMethod(disableForSessionMethod, facetedMethod));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
index efe1a17..2e89e9e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
@@ -92,7 +92,7 @@ public class DisableForContextFacetViaMethodFactory extends MethodPrefixBasedFac
         processMethodContext.removeMethod(disableMethod);
 
         final FacetHolder facetHolder = processMethodContext.getFacetHolder();
-        final TranslationService translationService = this.servicesInjector.lookupService(TranslationService.class).orElse(null);;
+        final TranslationService translationService = getTranslationService();
         // sadness: same logic as in I18nFacetFactory
         final String translationContext = ((IdentifiedHolder)facetHolder).getIdentifier().toClassAndNameIdentityString();
         FacetUtil.addFacet(new DisableForContextFacetViaMethod(disableMethod, translationService, translationContext, facetHolder));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetAbstract.java
index b4e94ff..744056b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetAbstract.java
@@ -24,8 +24,6 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 /**
  * Hide a property, collection or action based on the current session.
@@ -36,17 +34,13 @@ import org.apache.isis.core.security.authentication.AuthenticationSessionProvide
  */
 public abstract class HideForSessionFacetAbstract extends FacetAbstract implements HideForSessionFacet {
 
-    private final AuthenticationSessionProvider authenticationSessionProvider;
-
     public static Class<? extends Facet> type() {
         return HideForSessionFacet.class;
     }
 
     public HideForSessionFacetAbstract(
-            final FacetHolder holder,
-            final AuthenticationSessionProvider authenticationSessionProvider) {
+            final FacetHolder holder) {
         super(type(), holder, Derivation.NOT_DERIVED);
-        this.authenticationSessionProvider = authenticationSessionProvider;
     }
 
     @Override
@@ -54,7 +48,4 @@ public abstract class HideForSessionFacetAbstract extends FacetAbstract implemen
         return hiddenReason(getAuthenticationSession());
     }
 
-    protected AuthenticationSession getAuthenticationSession() {
-        return authenticationSessionProvider.getAuthenticationSession();
-    }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetNone.java
index d5dbbf2..fabf3ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetNone.java
@@ -21,14 +21,12 @@ package org.apache.isis.core.metamodel.facets.members.hidden.forsession;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 public class HideForSessionFacetNone extends HideForSessionFacetAbstract {
 
     public HideForSessionFacetNone(
-            final FacetHolder holder,
-            final AuthenticationSessionProvider authenticationSessionProvider) {
-        super(holder, authenticationSessionProvider);
+            final FacetHolder holder) {
+        super(holder);
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetViaMethod.java
index 8935715..2474c73 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetViaMethod.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.commons.lang.MethodExtensions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 public class HideForSessionFacetViaMethod extends HideForSessionFacetAbstract implements ImperativeFacet {
 
@@ -36,8 +35,8 @@ public class HideForSessionFacetViaMethod extends HideForSessionFacetAbstract im
 
     public HideForSessionFacetViaMethod(
             final Method method,
-            final FacetHolder holder, final AuthenticationSessionProvider authenticationSessionProvider) {
-        super(holder, authenticationSessionProvider);
+            final FacetHolder holder) {
+        super(holder);
         this.method = method;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetViaMethodFactory.java
index cb4f4ad..0704235 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/forsession/HideForSessionFacetViaMethodFactory.java
@@ -73,8 +73,7 @@ public class HideForSessionFacetViaMethodFactory extends MethodPrefixBasedFacetF
         processMethodContext.removeMethod(hideForSessionMethod);
 
         final FacetHolder facetedMethod = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new HideForSessionFacetViaMethod(hideForSessionMethod, facetedMethod,
-                authenticationSessionProvider));
+        FacetUtil.addFacet(new HideForSessionFacetViaMethod(hideForSessionMethod, facetedMethod));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/order/annotprop/MemberOrderFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/order/annotprop/MemberOrderFacetFactory.java
index dc7fb2b..2847e16 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/order/annotprop/MemberOrderFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/order/annotprop/MemberOrderFacetFactory.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.members.order.annotprop;
 
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
@@ -54,7 +53,7 @@ public class MemberOrderFacetFactory extends FacetFactoryAbstract implements Con
             return new MemberOrderFacetAnnotation(
                     annotation.name(),
                     annotation.sequence(),
-                    servicesInjector.lookupService(TranslationService.class).orElse(null),
+                    getTranslationService(),
                     processMethodContext.getFacetHolder());
         }
         else {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java
index af0a881..932f830 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java
@@ -25,7 +25,6 @@ import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.ViewModel;
 import org.apache.isis.applib.annotation.ViewModelLayout;
-import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.Annotations;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
index 3132272..15b3307 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
@@ -34,10 +34,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.publishing.PublishingServiceInternal;
-import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 public abstract class AutoCompleteFacetAbstract extends FacetAbstract implements AutoCompleteFacet {
 
@@ -45,9 +42,7 @@ public abstract class AutoCompleteFacetAbstract extends FacetAbstract implements
         return AutoCompleteFacet.class;
     }
 
-    private final AuthenticationSessionProvider authenticationSessionProvider;
     private final ObjectAdapterProvider adapterProvider;
-    private final ServicesInjector servicesInjector;
     private final Class<?> repositoryClass;
     private final Method repositoryMethod;
 
@@ -59,16 +54,13 @@ public abstract class AutoCompleteFacetAbstract extends FacetAbstract implements
     public AutoCompleteFacetAbstract(
             final FacetHolder holder,
             final Class<?> repositoryClass,
-            final Method repositoryMethod,
-            final ServicesInjector servicesInjector) {
+            final Method repositoryMethod) {
+        
         super(type(), holder, Derivation.NOT_DERIVED);
 
         this.repositoryClass = repositoryClass;
         this.repositoryMethod = repositoryMethod;
-
-        this.adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
-        this.servicesInjector = servicesInjector;
-        this.authenticationSessionProvider = servicesInjector.getAuthenticationSessionProvider();
+        this.adapterProvider = getObjectAdapterProvider();
     }
 
     public Class<?> getRepositoryClass() {
@@ -108,11 +100,11 @@ public abstract class AutoCompleteFacetAbstract extends FacetAbstract implements
     }
 
     private Object getRepository() {
-        return servicesInjector.lookupService(repositoryClass).orElse(null);
+        return getServiceRegistry().lookupService(repositoryClass).orElse(null);
     }
 
     private PublishingServiceInternal getPublishingServiceInternal() {
-        return servicesInjector.lookupServiceElseFail(PublishingServiceInternal.class);
+        return getServiceRegistry().lookupServiceElseFail(PublishingServiceInternal.class);
     }
 
 
@@ -124,10 +116,6 @@ public abstract class AutoCompleteFacetAbstract extends FacetAbstract implements
         return minLength;
     }
 
-    protected AuthenticationSession getAuthenticationSession() {
-        return authenticationSessionProvider.getAuthenticationSession();
-    }
-
     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         attributeMap.put("repositoryClass", repositoryClass);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedLifecycleEventFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedLifecycleEventFacetForDomainObjectAnnotation.java
index 015be1e..bd1eda8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedLifecycleEventFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedLifecycleEventFacetForDomainObjectAnnotation.java
@@ -24,7 +24,6 @@ import org.apache.isis.applib.events.lifecycle.ObjectCreatedEvent;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class CreatedLifecycleEventFacetForDomainObjectAnnotation extends SingleClassValueFacetAbstract implements CreatedLifecycleEventFacet {
 
@@ -34,9 +33,8 @@ public class CreatedLifecycleEventFacetForDomainObjectAnnotation extends SingleC
 
     public CreatedLifecycleEventFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends ObjectCreatedEvent<?>> value,
-                    final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends ObjectCreatedEvent<?>> value) {
+        super(type(), holder, value);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedLifecycleEventFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedLifecycleEventFacetForDomainObjectAnnotation.java
index 7784e03..50dd2b6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedLifecycleEventFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedLifecycleEventFacetForDomainObjectAnnotation.java
@@ -23,7 +23,6 @@ import org.apache.isis.applib.events.lifecycle.ObjectLoadedEvent;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class LoadedLifecycleEventFacetForDomainObjectAnnotation extends SingleClassValueFacetAbstract implements LoadedLifecycleEventFacet {
 
@@ -33,9 +32,8 @@ public class LoadedLifecycleEventFacetForDomainObjectAnnotation extends SingleCl
 
     public LoadedLifecycleEventFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends ObjectLoadedEvent<?>> value,
-                    final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends ObjectLoadedEvent<?>> value) {
+        super(type(), holder, value);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedLifecycleEventFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedLifecycleEventFacetForDomainObjectAnnotation.java
index f8c4ea4..0a76576 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedLifecycleEventFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedLifecycleEventFacetForDomainObjectAnnotation.java
@@ -23,7 +23,6 @@ import org.apache.isis.applib.events.lifecycle.ObjectPersistedEvent;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class PersistedLifecycleEventFacetForDomainObjectAnnotation extends SingleClassValueFacetAbstract implements LoadedLifecycleEventFacet {
 
@@ -33,9 +32,8 @@ public class PersistedLifecycleEventFacetForDomainObjectAnnotation extends Singl
 
     public PersistedLifecycleEventFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends ObjectPersistedEvent<?>> value,
-                    final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends ObjectPersistedEvent<?>> value) {
+        super(type(), holder, value);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingLifecycleEventFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingLifecycleEventFacetForDomainObjectAnnotation.java
index 5adfb1f..eac02cd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingLifecycleEventFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingLifecycleEventFacetForDomainObjectAnnotation.java
@@ -23,7 +23,6 @@ import org.apache.isis.applib.events.lifecycle.ObjectPersistingEvent;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class PersistingLifecycleEventFacetForDomainObjectAnnotation extends SingleClassValueFacetAbstract implements LoadedLifecycleEventFacet {
 
@@ -33,9 +32,8 @@ public class PersistingLifecycleEventFacetForDomainObjectAnnotation extends Sing
 
     public PersistingLifecycleEventFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends ObjectPersistingEvent<?>> value,
-                    final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends ObjectPersistingEvent<?>> value) {
+        super(type(), holder, value);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingLifecycleEventFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingLifecycleEventFacetForDomainObjectAnnotation.java
index c199589..b5f1fc1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingLifecycleEventFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingLifecycleEventFacetForDomainObjectAnnotation.java
@@ -24,7 +24,6 @@ import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class RemovingLifecycleEventFacetForDomainObjectAnnotation extends SingleClassValueFacetAbstract implements LoadedLifecycleEventFacet {
 
@@ -34,9 +33,8 @@ public class RemovingLifecycleEventFacetForDomainObjectAnnotation extends Single
 
     public RemovingLifecycleEventFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends ObjectRemovingEvent<?>> value,
-                    final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends ObjectRemovingEvent<?>> value) {
+        super(type(), holder, value);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedLifecycleEventFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedLifecycleEventFacetForDomainObjectAnnotation.java
index e739ef4..13c1d08 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedLifecycleEventFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedLifecycleEventFacetForDomainObjectAnnotation.java
@@ -24,7 +24,6 @@ import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class UpdatedLifecycleEventFacetForDomainObjectAnnotation extends SingleClassValueFacetAbstract implements LoadedLifecycleEventFacet {
 
@@ -34,9 +33,8 @@ public class UpdatedLifecycleEventFacetForDomainObjectAnnotation extends SingleC
 
     public UpdatedLifecycleEventFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends ObjectUpdatedEvent<?>> value,
-                    final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends ObjectUpdatedEvent<?>> value) {
+        super(type(), holder, value);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingLifecycleEventFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingLifecycleEventFacetForDomainObjectAnnotation.java
index 8d2d400..e3329d7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingLifecycleEventFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingLifecycleEventFacetForDomainObjectAnnotation.java
@@ -24,7 +24,6 @@ import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class UpdatingLifecycleEventFacetForDomainObjectAnnotation extends SingleClassValueFacetAbstract implements LoadedLifecycleEventFacet {
 
@@ -34,9 +33,8 @@ public class UpdatingLifecycleEventFacetForDomainObjectAnnotation extends Single
 
     public UpdatingLifecycleEventFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends ObjectUpdatingEvent<?>> value,
-                    final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends ObjectUpdatingEvent<?>> value) {
+        super(type(), holder, value);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
index 9fc0dfd..c561379 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
@@ -19,14 +19,11 @@
 
 package org.apache.isis.core.metamodel.facets.object.choices;
 
-import java.util.List;
+import java.util.function.Predicate;
 
-import org.apache.isis.applib.query.Query;
-import org.apache.isis.applib.query.QueryFindAllInstances;
 import org.apache.isis.applib.services.wrapper.events.UsabilityEvent;
 import org.apache.isis.applib.services.wrapper.events.ValidityEvent;
-import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.commons.internal.collections._Arrays;
+import org.apache.isis.core.metamodel.MetaModelContext;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -38,11 +35,10 @@ import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
+
+import lombok.val;
 
 /**
  * A fixed number of choices because the number of instances of this class is bounded.
@@ -64,20 +60,9 @@ implements ChoicesFacet, DisablingInteractionAdvisor, ValidatingInteractionAdvis
         return ChoicesFacet.class;
     }
 
-    private final AuthenticationSessionProvider authenticationSessionProvider;
-    private final PersistenceSessionServiceInternal persistenceSessionServiceInternal;
-
     public ChoicesFacetFromBoundedAbstract(
-            final FacetHolder holder,
-            final AuthenticationSessionProvider authenticationSessionProvider,
-            final PersistenceSessionServiceInternal persistenceSessionServiceInternal) {
+            final FacetHolder holder) {
         super(type(), holder, Derivation.NOT_DERIVED);
-        this.authenticationSessionProvider = authenticationSessionProvider;
-        this.persistenceSessionServiceInternal = persistenceSessionServiceInternal;
-    }
-
-    public PersistenceSessionServiceInternal getPersistenceSessionService() {
-        return persistenceSessionServiceInternal;
     }
 
     @Override
@@ -122,18 +107,15 @@ implements ChoicesFacet, DisablingInteractionAdvisor, ValidatingInteractionAdvis
     public Object[] getChoices(
             ObjectAdapter adapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        final Query query = new QueryFindAllInstances(getObjectSpecification().getFullIdentifier());
-        final List<ObjectAdapter> allInstancesAdapter = getPersistenceSessionService().allMatchingQuery(query);
-
-        final List<ObjectAdapter> adapters =
-                ObjectAdapter.Util.visibleAdapters(allInstancesAdapter, interactionInitiatedBy);
-
-        return _NullSafe.stream(adapters)
-                .map(ObjectAdapter.Util::unwrapPojo)
-                .collect(_Arrays.toArray(Object.class, _NullSafe.size(adapters)));
+    	
+    	val context = MetaModelContext.current();
+    	val repository = context.getRepositoryService();
+    	
+    	final Predicate<ObjectAdapter> visibilityFilter = 
+    			objectAdapter -> ObjectAdapter.Util.isVisible(objectAdapter, interactionInitiatedBy); 
+    	
+        val query = new QueryFindAllChoices(getObjectSpecification().getFullIdentifier(), visibilityFilter);
+        return repository.allMatches(query).toArray();
     }
 
-    protected AuthenticationSession getAuthenticationSession() {
-        return authenticationSessionProvider.getAuthenticationSession();
-    }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetUtils.java
index eafbc29..518cfbc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetUtils.java
@@ -19,9 +19,12 @@
 
 package org.apache.isis.core.metamodel.facets.object.choices;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
+@Vetoed
 public class ChoicesFacetUtils {
 
     private ChoicesFacetUtils() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/QueryFindAllChoices.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/QueryFindAllChoices.java
new file mode 100644
index 0000000..feebfeb
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/QueryFindAllChoices.java
@@ -0,0 +1,37 @@
+package org.apache.isis.core.metamodel.facets.object.choices;
+
+import java.util.function.Predicate;
+
+import org.apache.isis.applib.query.QueryFindAllInstances;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterPredicate;
+
+/**
+ * 
+ * Specialization of QueryFindAllInstances to honor also visibility. 
+ * 
+ * @since 2.0.0-M3
+ *
+ * @param <T>
+ */
+class QueryFindAllChoices<T> extends QueryFindAllInstances<T> implements ObjectAdapterPredicate {
+
+	private static final long serialVersionUID = 1L;
+
+	private final Predicate<ObjectAdapter> visibilityFilter;
+	
+	public QueryFindAllChoices(
+			final String string, 
+			final Predicate<ObjectAdapter> visibilityFilter, 
+			final long ... range) {
+		
+        super(string, range);
+        this.visibilityFilter = visibilityFilter;
+    }
+
+	@Override
+	public boolean test(ObjectAdapter objectAdapter) {
+		return visibilityFilter.test(objectAdapter);
+	}
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java
index fce1014..902b395 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java
@@ -39,7 +39,7 @@ public class EnumFacetUsingValueFacetUsingSemanticsProviderFactory<T extends Enu
             return;
         }
 
-        addFacets(new EnumValueSemanticsProvider<T>(holder, asT(cls), getContext()));
+        addFacets(new EnumValueSemanticsProvider<T>(holder, asT(cls)));
         FacetUtil.addFacet(new ChoicesFacetEnum(holder, cls.getEnumConstants()));
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
index 5f1addc..d408ca9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
@@ -34,7 +34,6 @@ import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class EnumValueSemanticsProvider<T extends Enum<T>> extends ValueSemanticsProviderAndFacetAbstract<T> implements EnumFacet {
 
@@ -66,17 +65,16 @@ public class EnumValueSemanticsProvider<T extends Enum<T>> extends ValueSemantic
      * Required because {@link Parser} and {@link EncoderDecoder}.
      */
     public EnumValueSemanticsProvider() {
-        this(null, null, null);
+        this(null, null);
     }
 
-    public EnumValueSemanticsProvider(final FacetHolder holder, final Class<T> adaptedClass, final ServicesInjector context) {
+    public EnumValueSemanticsProvider(final FacetHolder holder, final Class<T> adaptedClass) {
         super(
                 type(), holder,  adaptedClass,
                 maxLengthFor(adaptedClass),
                 maxLengthFor(adaptedClass), Immutability.IMMUTABLE,
                 EqualByContent.HONOURED,
-                defaultFor(adaptedClass),
-                context);
+                defaultFor(adaptedClass));
 
         titleMethod = MethodFinderUtils.findMethod(
                 getAdaptedClass(), MethodScope.OBJECT,
@@ -116,7 +114,7 @@ public class EnumValueSemanticsProvider<T extends Enum<T>> extends ValueSemantic
 
     @Override
     protected String titleString(final Object object) {
-        final TranslationService translationService = getServicesInjector().lookupService(TranslationService.class).orElse(null);;
+        final TranslationService translationService = getTranslationService();
 
         if (titleMethod != null) {
             // sadness: same as in TranslationFactory
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetAbstract.java
index f6b64a3..47d347d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetAbstract.java
@@ -26,7 +26,6 @@ import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.core.commons.lang.ClassExtensions;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public abstract class DefaultedFacetAbstract extends FacetAbstract implements DefaultedFacet {
 
@@ -35,16 +34,17 @@ public abstract class DefaultedFacetAbstract extends FacetAbstract implements De
     // to delegate to
     private final DefaultedFacetUsingDefaultsProvider defaultedFacetUsingDefaultsProvider;
 
-    private final ServicesInjector dependencyInjector;
-
-    public DefaultedFacetAbstract(final String candidateEncoderDecoderName, final Class<?> candidateEncoderDecoderClass, final FacetHolder holder, final ServicesInjector dependencyInjector) {
+    public DefaultedFacetAbstract(
+            final String candidateEncoderDecoderName, 
+            final Class<?> candidateEncoderDecoderClass, 
+            final FacetHolder holder) {
+        
         super(DefaultedFacet.class, holder, Derivation.NOT_DERIVED);
 
         this.defaultsProviderClass = DefaultsProviderUtil.defaultsProviderOrNull(candidateEncoderDecoderClass, candidateEncoderDecoderName);
-        this.dependencyInjector = dependencyInjector;
         if (isValid()) {
             final DefaultsProvider<?> defaultsProvider = (DefaultsProvider<?>) ClassExtensions.newInstance(defaultsProviderClass, FacetHolder.class, holder);
-            this.defaultedFacetUsingDefaultsProvider = new DefaultedFacetUsingDefaultsProvider(defaultsProvider, holder, getDependencyInjector());
+            this.defaultedFacetUsingDefaultsProvider = new DefaultedFacetUsingDefaultsProvider(defaultsProvider, holder);
         } else {
             this.defaultedFacetUsingDefaultsProvider = null;
         }
@@ -76,13 +76,6 @@ public abstract class DefaultedFacetAbstract extends FacetAbstract implements De
         return defaultsProviderClass.getName();
     }
 
-    // //////////////////////////////////////////////////////
-    // Dependencies (from constructor)
-    // //////////////////////////////////////////////////////
-
-    private ServicesInjector getDependencyInjector() {
-        return dependencyInjector;
-    }
 
     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetUsingDefaultsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetUsingDefaultsProvider.java
index 8a027c2..ef7c0f2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetUsingDefaultsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetUsingDefaultsProvider.java
@@ -22,37 +22,26 @@ package org.apache.isis.core.metamodel.facets.object.defaults;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class DefaultedFacetUsingDefaultsProvider extends FacetAbstract implements DefaultedFacet {
 
     private final DefaultsProvider<?> defaultsProvider;
-    private final ServicesInjector dependencyInjector;
 
-    public DefaultedFacetUsingDefaultsProvider(final DefaultsProvider<?> parser, final FacetHolder holder, final ServicesInjector dependencyInjector) {
+    public DefaultedFacetUsingDefaultsProvider(final DefaultsProvider<?> parser, final FacetHolder holder) {
         super(DefaultedFacet.class, holder, Derivation.NOT_DERIVED);
         this.defaultsProvider = parser;
-        this.dependencyInjector = dependencyInjector;
     }
 
     @Override
     protected String toStringValues() {
-        getDependencyInjector().injectServicesInto(defaultsProvider);
+        getServiceInjector().injectServicesInto(defaultsProvider);
         return defaultsProvider.toString();
     }
 
     @Override
     public Object getDefault() {
-        getDependencyInjector().injectServicesInto(defaultsProvider);
+        getServiceInjector().injectServicesInto(defaultsProvider);
         return defaultsProvider.getDefaultValue();
     }
 
-    // //////////////////////////////////////////////////////
-    // Dependencies (from constructor)
-    // //////////////////////////////////////////////////////
-
-    public ServicesInjector getDependencyInjector() {
-        return dependencyInjector;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultsProviderUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultsProviderUtil.java
index b86a26e..6fc1b87 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultsProviderUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultsProviderUtil.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.facets.object.defaults;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -33,7 +34,10 @@ public final class DefaultsProviderUtil {
     public static final String DEFAULTS_PROVIDER_NAME_KEY_PREFIX = "isis.reflector.java.facets.defaulted.";
     public static final String DEFAULTS_PROVIDER_NAME_KEY_SUFFIX = ".providerName";
 
-    public static String defaultsProviderNameFromConfiguration(final Class<?> type, final IsisConfiguration configuration) {
+    public static String defaultsProviderNameFromConfiguration(final Class<?> type) {
+        
+        final IsisConfiguration configuration = _Config.getConfiguration();
+        
         final String key = DEFAULTS_PROVIDER_NAME_KEY_PREFIX + type.getCanonicalName() + DEFAULTS_PROVIDER_NAME_KEY_SUFFIX;
         final String defaultsProviderName = configuration.getString(key);
         return !_Strings.isNullOrEmpty(defaultsProviderName) ? defaultsProviderName : null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java
index 14b162d..bd98b94 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java
@@ -21,21 +21,19 @@ package org.apache.isis.core.metamodel.facets.object.defaults.annotcfg;
 
 import org.apache.isis.applib.annotation.Defaulted;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacetAbstract;
 import org.apache.isis.core.metamodel.facets.object.defaults.DefaultsProviderUtil;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class DefaultedFacetAnnotation extends DefaultedFacetAbstract {
 
-    private static String providerName(final Class<?> annotatedClass, final IsisConfiguration configuration) {
+    private static String providerName(final Class<?> annotatedClass) {
         final Defaulted annotation = annotatedClass.getAnnotation(Defaulted.class);
         final String providerName = annotation.defaultsProviderName();
         if (!_Strings.isNullOrEmpty(providerName)) {
             return providerName;
         }
-        return DefaultsProviderUtil.defaultsProviderNameFromConfiguration(annotatedClass, configuration);
+        return DefaultsProviderUtil.defaultsProviderNameFromConfiguration(annotatedClass);
     }
 
     private static Class<?> providerClass(final Class<?> annotatedClass) {
@@ -43,12 +41,16 @@ public class DefaultedFacetAnnotation extends DefaultedFacetAbstract {
         return annotation.defaultsProviderClass();
     }
 
-    public DefaultedFacetAnnotation(final Class<?> annotatedClass, final IsisConfiguration configuration, final FacetHolder holder, final ServicesInjector dependencyInjector) {
-        this(providerName(annotatedClass, configuration), providerClass(annotatedClass), holder, dependencyInjector);
+    public DefaultedFacetAnnotation(final Class<?> annotatedClass, final FacetHolder holder) {
+        this(providerName(annotatedClass), providerClass(annotatedClass), holder);
     }
 
-    private DefaultedFacetAnnotation(final String candidateProviderName, final Class<?> candidateProviderClass, final FacetHolder holder, final ServicesInjector dependencyInjector) {
-        super(candidateProviderName, candidateProviderClass, holder, dependencyInjector);
+    private DefaultedFacetAnnotation(
+            final String candidateProviderName, 
+            final Class<?> candidateProviderClass, 
+            final FacetHolder holder) {
+        
+        super(candidateProviderName, candidateProviderClass, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
index 206da57..dc7b76f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
@@ -46,16 +46,16 @@ public class DefaultedFacetAnnotationElseConfigurationFactory extends FacetFacto
 
         // create from annotation, if present
         if (annotation != null) {
-            final DefaultedFacetAbstract facet = new DefaultedFacetAnnotation(cls, getConfiguration(), holder, servicesInjector);
+            final DefaultedFacetAbstract facet = new DefaultedFacetAnnotation(cls, holder);
             if (facet.isValid()) {
                 return facet;
             }
         }
 
         // otherwise, try to create from configuration, if present
-        final String providerName = DefaultsProviderUtil.defaultsProviderNameFromConfiguration(cls, getConfiguration());
+        final String providerName = DefaultsProviderUtil.defaultsProviderNameFromConfiguration(cls);
         if (!_Strings.isNullOrEmpty(providerName)) {
-            final DefaultedFacetFromConfiguration facet = new DefaultedFacetFromConfiguration(providerName, holder, servicesInjector);
+            final DefaultedFacetFromConfiguration facet = new DefaultedFacetFromConfiguration(providerName, holder);
             if (facet.isValid()) {
                 return facet;
             }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetFromConfiguration.java
index 6bd4dc8..8912854 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetFromConfiguration.java
@@ -21,12 +21,11 @@ package org.apache.isis.core.metamodel.facets.object.defaults.annotcfg;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacetAbstract;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class DefaultedFacetFromConfiguration extends DefaultedFacetAbstract {
 
-    public DefaultedFacetFromConfiguration(final String candidateProviderName, final FacetHolder holder, final ServicesInjector dependencyInjector) {
-        super(candidateProviderName, null, holder, dependencyInjector);
+    public DefaultedFacetFromConfiguration(final String candidateProviderName, final FacetHolder holder) {
+        super(candidateProviderName, null, holder);
 
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java
index 84606b4..01b24c9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java
@@ -72,7 +72,7 @@ public class DisabledObjectFacetViaMethodFactory extends MethodPrefixBasedFacetF
             return;
         }
 
-        final TranslationService translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);;
+        final TranslationService translationService = getTranslationService();
         // sadness: same logic as in I18nFacetFactory
         final String translationContext = ((IdentifiedHolder)facetHolder).getIdentifier().toClassIdentityString();
         FacetUtil.addFacet(new DisabledObjectFacetViaMethod(method, translationService, translationContext, facetHolder));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 2e55daf..50a6a63 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -68,7 +68,6 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.domainevents.Co
 import org.apache.isis.core.metamodel.facets.object.domainobject.domainevents.PropertyDomainEventDefaultFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.editing.ImmutableFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.objectspecid.ObjectSpecIdFacetForDomainObjectAnnotation;
-import org.apache.isis.core.metamodel.facets.object.domainobject.objectspecid.ObjectSpecIdFacetForJdoPersistenceCapableAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.publishing.PublishedObjectFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.recreatable.RecreatableObjectFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
@@ -77,8 +76,6 @@ import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
@@ -86,7 +83,8 @@ import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorFor
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 import org.apache.isis.core.metamodel.util.EventUtil;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
+
+import lombok.val;
 
 
 public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
@@ -206,7 +204,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 .filter(a -> a.repositoryMethod != null)
                 .findFirst()
                 .map(a -> new AutoCompleteFacetForDomainObjectAnnotation(
-                        facetHolder, a.autoCompleteRepository, a.repositoryMethod, servicesInjector))
+                        facetHolder, a.autoCompleteRepository, a.repositoryMethod))
                 .orElse(null);
     }
 
@@ -236,7 +234,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         // check from @DomainObject(bounded=...)
-        Facet facet = ChoicesFacetForDomainObjectAnnotation.create(domainObjects, facetHolder, getAuthenticationSessionProvider(), persistenceSessionServiceInternal);
+        Facet facet = ChoicesFacetForDomainObjectAnnotation.create(domainObjects, facetHolder);
 
         // then add
         FacetUtil.addFacet(facet);
@@ -263,13 +261,14 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
         // check from @DomainObject(objectType=...)
         Facet facet = ObjectSpecIdFacetForDomainObjectAnnotation.create(domainObjects, facetHolder);
 
+//FIXME [2033] removed here (module 'metamodel'), should be re-implemented in 'jdo-common'         
         // else check for @PersistenceCapable(schema=...)
-        if(facet == null) {
-            final JdoPersistenceCapableFacet jdoPersistenceCapableFacet = facetHolder.getFacet(JdoPersistenceCapableFacet.class);
-            if(jdoPersistenceCapableFacet != null) {
-                facet = ObjectSpecIdFacetForJdoPersistenceCapableAnnotation.create(jdoPersistenceCapableFacet, facetHolder);
-            }
-        }
+//        if(facet == null) {
+//            final JdoPersistenceCapableFacet jdoPersistenceCapableFacet = facetHolder.getFacet(JdoPersistenceCapableFacet.class);
+//            if(jdoPersistenceCapableFacet != null) {
+//                facet = ObjectSpecIdFacetForJdoPersistenceCapableAnnotation.create(jdoPersistenceCapableFacet, facetHolder);
+//            }
+//        }
 
         // then add
         FacetUtil.addFacet(facet);
@@ -289,8 +288,6 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
         final PostConstructMethodCache postConstructMethodCache = this;
         final ViewModelFacet recreatableObjectFacet = RecreatableObjectFacetForDomainObjectAnnotation.create(
                 domainObjects, 
-                persistenceSessionServiceInternal, 
-                servicesInjector,
                 facetHolder, 
                 postConstructMethodCache);
 
@@ -304,7 +301,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                     .filter(domainObject -> mixinTypeValidator.ensureMixinType(cls))
                     .collect(Collectors.toList());
 
-            final MixinFacet mixinFacet = MixinFacetForDomainObjectAnnotation.create(mixinDomainObjects, cls, facetHolder, servicesInjector);
+            final MixinFacet mixinFacet = MixinFacetForDomainObjectAnnotation.create(mixinDomainObjects, cls, facetHolder, getServiceInjector());
             FacetUtil.addFacet(mixinFacet);
         }
 
@@ -358,7 +355,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 )
         .findFirst()
         .map(lifecycleEvent -> new CreatedLifecycleEventFacetForDomainObjectAnnotation(
-                holder, lifecycleEvent, getSpecificationLoader()))
+                holder, lifecycleEvent))
         .ifPresent(FacetUtil::addFacet);
     }
 
@@ -376,7 +373,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 )
         .findFirst()
         .map(lifecycleEvent -> new LoadedLifecycleEventFacetForDomainObjectAnnotation(
-                holder, lifecycleEvent, getSpecificationLoader()))
+                holder, lifecycleEvent))
         .ifPresent(FacetUtil::addFacet);
     }
 
@@ -394,7 +391,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 )
         .findFirst()
         .map(lifecycleEvent -> new PersistingLifecycleEventFacetForDomainObjectAnnotation(
-                holder, lifecycleEvent, getSpecificationLoader()))
+                holder, lifecycleEvent))
         .ifPresent(FacetUtil::addFacet);
     }
 
@@ -412,7 +409,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 )
         .findFirst()
         .map(lifecycleEvent -> new PersistedLifecycleEventFacetForDomainObjectAnnotation(
-                holder, lifecycleEvent, getSpecificationLoader()))
+                holder, lifecycleEvent))
         .ifPresent(FacetUtil::addFacet);
     }
 
@@ -430,7 +427,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 )
         .findFirst()
         .map(lifecycleEvent -> new RemovingLifecycleEventFacetForDomainObjectAnnotation(
-                holder, lifecycleEvent, getSpecificationLoader()))
+                holder, lifecycleEvent))
         .ifPresent(FacetUtil::addFacet);
     }
 
@@ -448,7 +445,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 )
         .findFirst()
         .map(lifecycleEvent -> new UpdatedLifecycleEventFacetForDomainObjectAnnotation(
-                holder, lifecycleEvent, getSpecificationLoader()))
+                holder, lifecycleEvent))
         .ifPresent(FacetUtil::addFacet);
     }
 
@@ -466,7 +463,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 )
         .findFirst()
         .map(lifecycleEvent -> new UpdatingLifecycleEventFacetForDomainObjectAnnotation(
-                holder, lifecycleEvent, getSpecificationLoader()))
+                holder, lifecycleEvent))
         .ifPresent(FacetUtil::addFacet);
     }
 
@@ -476,7 +473,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
         .filter(domainEvent -> domainEvent != ActionDomainEvent.Default.class)
         .findFirst()
         .map(domainEvent -> new ActionDomainEventDefaultFacetForDomainObjectAnnotation(
-                        holder, domainEvent, getSpecificationLoader()))
+                        holder, domainEvent))
         .ifPresent(FacetUtil::addFacet);
 
     }
@@ -487,7 +484,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
         .filter(domainEvent -> domainEvent != PropertyDomainEvent.Default.class)
         .findFirst()
         .map(domainEvent -> new PropertyDomainEventDefaultFacetForDomainObjectAnnotation(
-                        holder, domainEvent, getSpecificationLoader()))
+                        holder, domainEvent))
         .ifPresent(FacetUtil::addFacet);
     }
 
@@ -497,7 +494,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
         .filter(domainEvent -> domainEvent != CollectionDomainEvent.Default.class)
         .findFirst()
         .map(domainEvent -> new CollectionDomainEventDefaultFacetForDomainObjectAnnotation(
-                        holder, domainEvent, getSpecificationLoader()))
+                        holder, domainEvent))
         .ifPresent(FacetUtil::addFacet);
     }
 
@@ -515,18 +512,18 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
             }
 
             private void validate(final ObjectSpecification thisSpec, final ValidationFailures validationFailures) {
-                if(!thisSpec.isPersistenceCapableOrViewModel()) {
+                if(!isEntityOrViewModel(thisSpec)) {
                     return;
                 }
 
                 final Map<ObjectSpecId, ObjectSpecification> specById = _Maps.newHashMap();
-                for (final ObjectSpecification otherSpec : getSpecificationLoader().allSpecifications()) {
+                for (final ObjectSpecification otherSpec : getSpecificationLoader().currentSpecifications()) {
 
                     if(thisSpec == otherSpec) {
                         continue;
                     }
 
-                    if(!otherSpec.isPersistenceCapableOrViewModel()) {
+                    if(!isEntityOrViewModel(otherSpec)) {
                         continue;
                     }
 
@@ -550,8 +547,8 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 if(autoCompleteFacet != null && !autoCompleteFacet.isNoop() && autoCompleteFacet instanceof AutoCompleteFacetAbstract) {
                     final AutoCompleteFacetAbstract facet = (AutoCompleteFacetForDomainObjectAnnotation) autoCompleteFacet;
                     final Class<?> repositoryClass = facet.getRepositoryClass();
-                    final boolean isService = getSpecificationLoader().isServiceClass(repositoryClass);
-                    if(!isService) {
+                    final boolean isRegistered = getServiceRegistry().isService(repositoryClass);
+                    if(!isRegistered) {
                         validationFailures.add(
                                 "@DomainObject annotation on %s specifies unknown repository '%s'",
                                 thisSpec.getFullIdentifier(), repositoryClass.getName());
@@ -568,22 +565,19 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
 
     // //////////////////////////////////////
 
-    @Override
-    public void setServicesInjector(final ServicesInjector servicesInjector) {
-        super.setServicesInjector(servicesInjector);
-        this.persistenceSessionServiceInternal = servicesInjector.getPersistenceSessionServiceInternal();
-    }
-
-    // //////////////////////////////////////
-
     private final Map<Class<?>, Optional<Method>> postConstructMethods = _Maps.newHashMap();
 
     @Override
     public Method postConstructMethodFor(final Object pojo) {
         return MethodFinderUtils.findAnnotatedMethod(pojo, PostConstruct.class, postConstructMethods);
     }
-
-
-    PersistenceSessionServiceInternal persistenceSessionServiceInternal;
+    
+    // -- HELPER
+    
+    private boolean isEntityOrViewModel(ObjectSpecification spec) {
+        val type = spec.getManagedObjectSort();
+        return type.isEntity() || type.isViewModel();
+    }
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/autocomplete/AutoCompleteFacetForAutoCompleteAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/autocomplete/AutoCompleteFacetForAutoCompleteAnnotation.java
index 0b70098..1dd32ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/autocomplete/AutoCompleteFacetForAutoCompleteAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/autocomplete/AutoCompleteFacetForAutoCompleteAnnotation.java
@@ -23,7 +23,6 @@ import java.lang.reflect.Method;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacetAbstract;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 /**
  * @deprecated
@@ -34,9 +33,8 @@ public class AutoCompleteFacetForAutoCompleteAnnotation extends AutoCompleteFace
     public AutoCompleteFacetForAutoCompleteAnnotation(
             final FacetHolder holder,
             final Class<?> repositoryClass,
-            final Method actionName,
-            final ServicesInjector servicesInjector) {
-        super(holder, repositoryClass, actionName, servicesInjector);
+            final Method actionName) {
+        super(holder, repositoryClass, actionName);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/autocomplete/AutoCompleteFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/autocomplete/AutoCompleteFacetForDomainObjectAnnotation.java
index 31e4027..beeec66 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/autocomplete/AutoCompleteFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/autocomplete/AutoCompleteFacetForDomainObjectAnnotation.java
@@ -23,7 +23,6 @@ import java.lang.reflect.Method;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacetAbstract;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class AutoCompleteFacetForDomainObjectAnnotation extends AutoCompleteFacetAbstract {
 
@@ -32,9 +31,8 @@ public class AutoCompleteFacetForDomainObjectAnnotation extends AutoCompleteFace
     public AutoCompleteFacetForDomainObjectAnnotation(
             final FacetHolder facetHolder,
             final Class<?> repositoryClass,
-            final Method repositoryMethod,
-            final ServicesInjector servicesInjector) {
-        super(facetHolder, repositoryClass, repositoryMethod, servicesInjector);
+            final Method repositoryMethod) {
+        super(facetHolder, repositoryClass, repositoryMethod);
         this.actionName = repositoryMethod.getName();
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/choices/ChoicesFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/choices/ChoicesFacetForDomainObjectAnnotation.java
index 04f3d4b..8298ec4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/choices/ChoicesFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/choices/ChoicesFacetForDomainObjectAnnotation.java
@@ -26,33 +26,25 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.choices.ChoicesFacetFromBoundedAbstract;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 public class ChoicesFacetForDomainObjectAnnotation extends ChoicesFacetFromBoundedAbstract {
 
     public static Facet create(
             final List<DomainObject> domainObjects,
-            final FacetHolder facetHolder,
-            final AuthenticationSessionProvider authenticationSessionProvider,
-            final PersistenceSessionServiceInternal persistenceSessionServiceInternal) {
+            final FacetHolder facetHolder) {
 
         return domainObjects.stream()
                 .map(DomainObject::bounding)
                 .filter(bounding -> bounding != Bounding.NOT_SPECIFIED)
                 .findFirst()
                 .map(bounding -> bounding == Bounding.BOUNDED
-                ? new ChoicesFacetForDomainObjectAnnotation(
-                        facetHolder,
-                        authenticationSessionProvider, persistenceSessionServiceInternal)
-                        : null
-                        ).orElse(null);
+                ? new ChoicesFacetForDomainObjectAnnotation(facetHolder)
+                        : null).orElse(null);
     }
 
     private ChoicesFacetForDomainObjectAnnotation(
-            final FacetHolder holder,
-            final AuthenticationSessionProvider authenticationSessionProvider, final PersistenceSessionServiceInternal persistenceSessionServiceInternal) {
-        super(holder, authenticationSessionProvider, persistenceSessionServiceInternal);
+            final FacetHolder holder) {
+        super(holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/ActionDomainEventDefaultFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/ActionDomainEventDefaultFacetForDomainObjectAnnotation.java
index bc1ccf9..e19ae12 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/ActionDomainEventDefaultFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/ActionDomainEventDefaultFacetForDomainObjectAnnotation.java
@@ -24,7 +24,6 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
  * This does <i>NOT</i> implement {@link ActionDomainEventFacet}, rather it is to record the default type to use
@@ -45,9 +44,8 @@ public class ActionDomainEventDefaultFacetForDomainObjectAnnotation
 
     public ActionDomainEventDefaultFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends ActionDomainEvent<?>> value,
-            final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends ActionDomainEvent<?>> value) {
+        super(type(), holder, value);
         this.eventType = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/CollectionDomainEventDefaultFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/CollectionDomainEventDefaultFacetForDomainObjectAnnotation.java
index c92c5e2..0d7a18e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/CollectionDomainEventDefaultFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/CollectionDomainEventDefaultFacetForDomainObjectAnnotation.java
@@ -24,7 +24,6 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
  * This does <i>NOT</i> implement {@link ActionDomainEventFacet}, rather it is to record the default type to use
@@ -44,9 +43,8 @@ public class CollectionDomainEventDefaultFacetForDomainObjectAnnotation
 
     public CollectionDomainEventDefaultFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends CollectionDomainEvent<?,?>> value,
-            final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends CollectionDomainEvent<?,?>> value) {
+        super(type(), holder, value);
         this.eventType = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/PropertyDomainEventDefaultFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/PropertyDomainEventDefaultFacetForDomainObjectAnnotation.java
index 86ea13c..ebd4b24 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/PropertyDomainEventDefaultFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/domainevents/PropertyDomainEventDefaultFacetForDomainObjectAnnotation.java
@@ -24,7 +24,6 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
  * This does <i>NOT</i> implement {@link ActionDomainEventFacet}, rather it is to record the default type to use
@@ -44,9 +43,8 @@ public class PropertyDomainEventDefaultFacetForDomainObjectAnnotation
 
     public PropertyDomainEventDefaultFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final Class<? extends PropertyDomainEvent<?,?>> value,
-            final SpecificationLoader specificationLoader) {
-        super(type(), holder, value, specificationLoader);
+            final Class<? extends PropertyDomainEvent<?,?>> value) {
+        super(type(), holder, value);
         this.eventType = value;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java
index 29d3b31..b346dfe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java
@@ -22,7 +22,6 @@ package org.apache.isis.core.metamodel.facets.object.domainobject.editing;
 import java.util.List;
 import java.util.Map;
 
-
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.commons.internal.base._Strings;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetFromConfiguration.java
index c689925..b2b2d9f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetFromConfiguration.java
@@ -19,9 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobject.editing;
 
-import org.apache.isis.commons.internal.base._Strings;
 import java.util.Map;
 
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
index b9bcfd6..2b80de1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
@@ -23,20 +23,16 @@ import java.util.List;
 import java.util.Objects;
 
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
 import org.apache.isis.core.metamodel.facets.object.recreatable.RecreatableObjectFacetDeclarativeInitializingAbstract;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class RecreatableObjectFacetForDomainObjectAnnotation extends
 RecreatableObjectFacetDeclarativeInitializingAbstract {
 
     public static ViewModelFacet create(
             final List<DomainObject> domainObjects,
-            final ObjectAdapterProvider adapterProvider,
-            final ServicesInjector servicesInjector,
             final FacetHolder holder,
             final PostConstructMethodCache postConstructMethodCache) {
 
@@ -58,7 +54,7 @@ RecreatableObjectFacetDeclarativeInitializingAbstract {
                             return null;
                         }
                         return new RecreatableObjectFacetForDomainObjectAnnotation(
-                                holder, adapterProvider, servicesInjector, postConstructMethodCache);
+                                holder, postConstructMethodCache);
                     }
                     // shouldn't happen, the above switch should match all cases.
                     throw new IllegalArgumentException("nature of '" + nature + "' not recognized");
@@ -70,11 +66,9 @@ RecreatableObjectFacetDeclarativeInitializingAbstract {
 
     private RecreatableObjectFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final ObjectAdapterProvider adapterProvider,
-            final ServicesInjector servicesInjector,
             final PostConstructMethodCache postConstructMethodCache) {
-        super(holder, RecreationMechanism.INITIALIZES, adapterProvider, servicesInjector,
-                postConstructMethodCache);
+        
+        super(holder, RecreationMechanism.INITIALIZES, postConstructMethodCache);
     }
 
 }
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 5a1433d..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,7 +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.commons.internal.base._Casts;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -33,19 +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.ServicesInjector;
+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 ServicesInjector 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 1fa04e5..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,7 +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.commons.internal.base._Casts;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -33,7 +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.ServicesInjector;
+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 ServicesInjector servicesInjector,
-            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 = servicesInjector.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 91addcd..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, servicesInjector, getConfiguration(), facetHolder));
+                        domainObjectLayouts, metamodelEventService, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.create(
-                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
+                        viewModelLayouts, metamodelEventService, getConfiguration(), facetHolder));
 
         FacetUtil.addFacet(
                 IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.create(
-                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
+                        domainObjectLayouts, metamodelEventService, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.create(
-                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
+                        viewModelLayouts, metamodelEventService, getConfiguration(), facetHolder));
 
         FacetUtil.addFacet(
                 CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.create(
-                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
+                        domainObjectLayouts, metamodelEventService, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.create(
-                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
+                        viewModelLayouts, metamodelEventService, getConfiguration(), facetHolder));
 
         FacetUtil.addFacet(
                 LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.create(
-                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
+                        domainObjectLayouts, metamodelEventService, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.create(
-                        viewModelLayouts, servicesInjector, 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 1884221..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
@@ -22,28 +22,24 @@ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 import java.util.List;
 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.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.ServicesInjector;
+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 ServicesInjector servicesInjector,
+            final MetamodelEventService metamodelEventService,
             final IsisConfiguration configuration,
             final FacetHolder facetHolder) {
 
@@ -57,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
@@ -87,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 a8e715c..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.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.ServicesInjector;
+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 ServicesInjector servicesInjector,
-            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 = servicesInjector.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 71285ff..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
@@ -24,26 +24,25 @@ import java.util.Map;
 
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
-import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.events.ui.LayoutUiEvent;
 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.ServicesInjector;
+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 ServicesInjector servicesInjector,
-            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 = servicesInjector.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 67c8dbb..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
@@ -24,26 +24,25 @@ import java.util.Map;
 
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.ViewModelLayout;
-import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.events.ui.LayoutUiEvent;
 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.ServicesInjector;
+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 ServicesInjector servicesInjector,
-            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 = servicesInjector.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 141f103..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
@@ -22,11 +22,9 @@ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 import java.util.List;
 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.commons.internal.base._Casts;
@@ -35,18 +33,16 @@ 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.ServicesInjector;
+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 ServicesInjector servicesInjector,
+            final MetamodelEventService metamodelEventService,
             final IsisConfiguration configuration, 
             final FacetHolder facetHolder) {
 
@@ -60,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...
@@ -70,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);
     }
@@ -81,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
@@ -105,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 f6c3307..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
@@ -22,11 +22,9 @@ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 import java.util.List;
 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.commons.internal.base._Casts;
@@ -35,19 +33,18 @@ 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.ServicesInjector;
+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 ServicesInjector servicesInjector,
-            final IsisConfiguration configuration, final FacetHolder facetHolder) {
+            final MetamodelEventService metamodelEventService,
+            final IsisConfiguration configuration, 
+            final FacetHolder facetHolder) {
 
         return viewModelLayouts.stream()
                 .map(ViewModelLayout::titleUiEvent)
@@ -59,8 +56,6 @@ public class TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent extends Tit
                         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 TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent extends Tit
                         translationContext = null;
                     }
 
-                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
-
                     return new TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent(
-                            titleUiEventClass, translationService, translationContext, eventBusService, facetHolder);
+                            titleUiEventClass, translationContext, metamodelEventService, facetHolder);
                 })
                 .orElse(null);
     }
@@ -80,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
@@ -104,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/object/encodeable/EncodableFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/EncodableFacetAbstract.java
index e9c6d39..5c28e44 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/EncodableFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/EncodableFacetAbstract.java
@@ -22,11 +22,9 @@ package org.apache.isis.core.metamodel.facets.object.encodeable;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.core.commons.lang.ClassExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.EncodableFacetUsingEncoderDecoder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public abstract class EncodableFacetAbstract extends FacetAbstract implements EncodableFacet {
 
@@ -35,18 +33,19 @@ public abstract class EncodableFacetAbstract extends FacetAbstract implements En
     // to delegate to
     private final EncodableFacetUsingEncoderDecoder encodeableFacetUsingEncoderDecoder;
 
-    private final ObjectAdapterProvider adapterProvider;
-    private final ServicesInjector dependencyInjector;
-
-    public EncodableFacetAbstract(final String candidateEncoderDecoderName, final Class<?> candidateEncoderDecoderClass, final FacetHolder holder, final ObjectAdapterProvider adapterProvider, final ServicesInjector dependencyInjector) {
+    public EncodableFacetAbstract(
+            final String candidateEncoderDecoderName, 
+            final Class<?> candidateEncoderDecoderClass, 
+            final FacetHolder holder) {
+        
         super(EncodableFacet.class, holder, Derivation.NOT_DERIVED);
-        this.adapterProvider = adapterProvider;
-        this.dependencyInjector = dependencyInjector;
 
         this.encoderDecoderClass = EncoderDecoderUtil.encoderDecoderOrNull(candidateEncoderDecoderClass, candidateEncoderDecoderName);
         if (isValid()) {
-            final EncoderDecoder<?> encoderDecoder = (EncoderDecoder<?>) ClassExtensions.newInstance(encoderDecoderClass, FacetHolder.class, holder);
-            this.encodeableFacetUsingEncoderDecoder = new EncodableFacetUsingEncoderDecoder(encoderDecoder, holder, getObjectAdapterProvider(), getDependencyInjector());
+            final EncoderDecoder<?> encoderDecoder = 
+                    (EncoderDecoder<?>) ClassExtensions.newInstance(encoderDecoderClass, FacetHolder.class, holder);
+            this.encodeableFacetUsingEncoderDecoder = 
+                    new EncodableFacetUsingEncoderDecoder(encoderDecoder, holder);
         } else {
             this.encodeableFacetUsingEncoderDecoder = null;
         }
@@ -82,13 +81,5 @@ public abstract class EncodableFacetAbstract extends FacetAbstract implements En
     public String toEncodedString(final ObjectAdapter object) {
         return encodeableFacetUsingEncoderDecoder.toEncodedString(object);
     }
-
-    public ObjectAdapterProvider getObjectAdapterProvider() {
-        return adapterProvider;
-    }
-
-    public ServicesInjector getDependencyInjector() {
-        return dependencyInjector;
-    }
-
+    
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetFromConfiguration.java
index 69f6d20..14e7fc2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetFromConfiguration.java
@@ -21,13 +21,13 @@ package org.apache.isis.core.metamodel.facets.object.encodeable.annotcfg;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacetAbstract;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class EncodableFacetFromConfiguration extends EncodableFacetAbstract {
 
-    public EncodableFacetFromConfiguration(final String candidateEncoderDecoderName, final FacetHolder holder, final ServicesInjector servicesInjector) {
-        super(candidateEncoderDecoderName, null, holder, 
-                servicesInjector.getPersistenceSessionServiceInternal(), servicesInjector);
-
+    public EncodableFacetFromConfiguration(
+            final String candidateEncoderDecoderName, 
+            final FacetHolder holder) {
+        
+        super(candidateEncoderDecoderName, null, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java
index 91deedf..4ff1740 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java
@@ -22,23 +22,17 @@ package org.apache.isis.core.metamodel.facets.object.encodeable.encoder;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 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.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class EncodableFacetUsingEncoderDecoder extends FacetAbstract implements EncodableFacet {
 
     private final EncoderDecoder<?> encoderDecoder;
-    private final ServicesInjector dependencyInjector;
-    private final ObjectAdapterProvider adapterProvider;
 
-    public EncodableFacetUsingEncoderDecoder(final EncoderDecoder<?> encoderDecoder, final FacetHolder holder, final ObjectAdapterProvider adapterProvider, final ServicesInjector dependencyInjector) {
+    public EncodableFacetUsingEncoderDecoder(final EncoderDecoder<?> encoderDecoder, final FacetHolder holder) {
         super(EncodableFacet.class, holder, Derivation.NOT_DERIVED);
         this.encoderDecoder = encoderDecoder;
-        this.dependencyInjector = dependencyInjector;
-        this.adapterProvider = adapterProvider;
     }
 
     // TODO: is this safe? really?
@@ -46,7 +40,7 @@ public class EncodableFacetUsingEncoderDecoder extends FacetAbstract implements
 
     @Override
     protected String toStringValues() {
-        getDependencyInjector().injectServicesInto(encoderDecoder);
+        getServiceInjector().injectServicesInto(encoderDecoder);
         return encoderDecoder.toString();
     }
 
@@ -56,7 +50,7 @@ public class EncodableFacetUsingEncoderDecoder extends FacetAbstract implements
         if (ENCODED_NULL.equals(encodedData)) {
             return null;
         } else {
-            getDependencyInjector().injectServicesInto(encoderDecoder);
+            getServiceInjector().injectServicesInto(encoderDecoder);
             final Object decodedObject = encoderDecoder.fromEncodedString(encodedData);
             return getObjectAdapterProvider().adapterFor(decodedObject);
         }
@@ -65,7 +59,7 @@ public class EncodableFacetUsingEncoderDecoder extends FacetAbstract implements
 
     @Override
     public String toEncodedString(final ObjectAdapter adapter) {
-        getDependencyInjector().injectServicesInto(encoderDecoder);
+        getServiceInjector().injectServicesInto(encoderDecoder);
         return adapter == null ? ENCODED_NULL: encode(encoderDecoder, adapter.getPojo());
     }
 
@@ -75,16 +69,5 @@ public class EncodableFacetUsingEncoderDecoder extends FacetAbstract implements
         return encoderDecoder.toEncodedString(pojoAsT);
     }
 
-    // //////////////////////////////////////////////////////
-    // Dependencies (from constructor)
-    // //////////////////////////////////////////////////////
-
-    public ServicesInjector getDependencyInjector() {
-        return dependencyInjector;
-    }
-
-    public ObjectAdapterProvider getObjectAdapterProvider() {
-        return adapterProvider;
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java
similarity index 70%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java
index 6aec559..cc1b9fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java
@@ -17,15 +17,19 @@
  *  under the License.
  */
 
-package org.apache.isis.core.metamodel.facets.actcoll.typeof;
+package org.apache.isis.core.metamodel.facets.object.entity;
 
+import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
-public class TypeOfFacetDefaultToObject extends TypeOfFacetAbstract {
+/**
+ * Indicates that this class is managed by a persistence context.
+ * @since 2.0.0-M3
+ */
+public interface EntityFacet extends Facet {
 
-    public TypeOfFacetDefaultToObject(final FacetHolder holder, final SpecificationLoader specificationLookup) {
-        super(Object.class, holder, specificationLookup);
-    }
+	static EntityFacet create(FacetHolder facetHolder) {
+		return new EntityFacetSimple(facetHolder);
+	}
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacetSimple.java
similarity index 70%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacetSimple.java
index 6aec559..8da71ee 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetDefaultToObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacetSimple.java
@@ -17,15 +17,19 @@
  *  under the License.
  */
 
-package org.apache.isis.core.metamodel.facets.actcoll.typeof;
+package org.apache.isis.core.metamodel.facets.object.entity;
 
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
-public class TypeOfFacetDefaultToObject extends TypeOfFacetAbstract {
+/**
+ * Package private impl. of EntityFacet  
+ * @since 2.0.0-M3
+ */
+class EntityFacetSimple extends FacetAbstract implements EntityFacet {
 
-    public TypeOfFacetDefaultToObject(final FacetHolder holder, final SpecificationLoader specificationLookup) {
-        super(Object.class, holder, specificationLookup);
-    }
+	public EntityFacetSimple(FacetHolder holder) {
+		super(EntityFacet.class, holder, Derivation.NOT_DERIVED);
+	}
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
index 491b8aa..3a03a74 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
@@ -34,7 +34,7 @@ public class GridFacetFactory extends FacetFactoryAbstract {
     public void process(final ProcessClassContext processClassContext) {
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final GridService2 gridService = servicesInjector.lookupServiceElseFail(GridService2.class);
+        final GridService2 gridService = getServiceRegistry().lookupServiceElseFail(GridService2.class);
 
         FacetUtil.addFacet(GridFacetDefault.create(facetHolder, gridService));
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
index 36fa908..56c6fcb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
@@ -54,13 +54,8 @@ public class RemoveAnnotatedMethodsFacetFactory extends FacetFactoryAbstract {
         eventHandlerClasses = eventHandlerClassNames.stream()
         .map(name->{
             Class<? extends Annotation> eventHandlerAnnotationClass;
-            try {
-                // doing this reflectively so that don't bring in a dependency on axon.
-                eventHandlerAnnotationClass = uncheckedCast(ClassUtil.forName(name));
-            } catch(Exception ignore) {
-                // ignore
-                eventHandlerAnnotationClass = null;
-            }
+            // doing this reflectively so that don't bring in a dependency on axon.
+            eventHandlerAnnotationClass = uncheckedCast(ClassUtil.forNameElseNull(name));
             return eventHandlerAnnotationClass;
         })
         .filter(_NullSafe::isPresent)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java
index 37ef52c..9e1aa13 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java
@@ -93,17 +93,14 @@ public class RemoveMethodsFacetFactory extends FacetFactoryAbstract {
 
         }
 
-        getSpecificationLoader().streamServiceClasses()
-        .forEach(serviceClass->{
+        
          // removeInjectMethods(processClassContext);
             Method[] methods2 = processClassContext.getCls().getMethods();
             for (Method method : methods2) {
-                if(injectorMethodEvaluator.isInjectorMethodFor(method, serviceClass)) {
+            if(injectorMethodEvaluator.getTypeToBeInjected(method)!=null) {
                     processClassContext.removeMethod(method);
                 }
             }
-        });
-        
 
         removeSuperclassMethods(processClassContext.getCls(), processClassContext);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
index 75f26e1..f347caa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
@@ -24,19 +24,15 @@ import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
 
-import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public abstract class MixinFacetAbstract extends SingleValueFacetAbstract<String> implements MixinFacet {
 
     private final Class<?> mixinType;
     private final Class<?> constructorType;
-    private final ServicesInjector servicesInjector;
 
     public static Class<? extends Facet> type() {
         return MixinFacet.class;
@@ -44,13 +40,13 @@ public abstract class MixinFacetAbstract extends SingleValueFacetAbstract<String
 
     public MixinFacetAbstract(
             final Class<?> mixinType,
-            final String value, final Class<?> constructorType,
-            final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
+            final String value, 
+            final Class<?> constructorType,
+            final FacetHolder holder) {
+        
         super(type(), value, holder);
         this.mixinType = mixinType;
         this.constructorType = constructorType;
-        this.servicesInjector = servicesInjector;
     }
 
     @Override
@@ -73,7 +69,7 @@ public abstract class MixinFacetAbstract extends SingleValueFacetAbstract<String
         try {
             final Constructor<?> constructor = mixinType.getConstructor(constructorType);
             final Object mixinPojo = constructor.newInstance(domainPojo);
-            servicesInjector.injectServicesInto(mixinPojo);
+            getServiceInjector().injectServicesInto(mixinPojo);
             return mixinPojo;
         } catch (NoSuchMethodException e) {
             // shouldn't happen; ought we to fail-fast instead?
@@ -120,14 +116,6 @@ public abstract class MixinFacetAbstract extends SingleValueFacetAbstract<String
         return null;
     }
 
-    private ObjectAdapterProvider getObjectAdapterProvider() {
-        return servicesInjector.getPersistenceSessionServiceInternal();
-    }
-
-    private TitleService getTitleService() {
-        return servicesInjector.lookupServiceElseFail(TitleService.class);
-    }
-
     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         attributeMap.put("mixinType", mixinType);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
index 6ce83d4..e72d300 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
@@ -24,9 +24,9 @@ import java.util.List;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
 
@@ -36,17 +36,18 @@ public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
 
     private MixinFacetForDomainObjectAnnotation(
             final Class<?> mixinType,
-            final String value, final Class<?> constructorType,
-            final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
-        super(mixinType, value, constructorType, holder, servicesInjector);
+            final String value, 
+            final Class<?> constructorType,
+            final FacetHolder holder) {
+        
+        super(mixinType, value, constructorType, holder);
     }
 
     public static MixinFacet create(
             final List<DomainObject> domainObjects,
             final Class<?> candidateMixinType,
             final FacetHolder facetHolder,
-            final ServicesInjector servicesInjector) {
+            final ServiceInjector servicesInjector) {
         return domainObjects.stream()
                 .filter(domainObject -> domainObject.nature() == Nature.MIXIN)
                 .findFirst()
@@ -59,8 +60,8 @@ public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
                         }
                         final Class<?> constructorType = constructorTypes[0];
                         return new MixinFacetForDomainObjectAnnotation(
-                                candidateMixinType, domainObject.mixinMethod(), constructorType, facetHolder,
-                                servicesInjector);
+                                candidateMixinType, domainObject.mixinMethod(), constructorType, facetHolder
+                                );
                     }
                     // else
                     return null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
index d042eed..aa64550 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
@@ -22,9 +22,9 @@ package org.apache.isis.core.metamodel.facets.object.mixin;
 import java.lang.reflect.Constructor;
 
 import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class MixinFacetForMixinAnnotation extends MixinFacetAbstract {
 
@@ -34,15 +34,16 @@ public class MixinFacetForMixinAnnotation extends MixinFacetAbstract {
 
     private MixinFacetForMixinAnnotation(
             final Class<?> mixinType,
-            final String value, final Class<?> constructorType,
-            final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
-        super(mixinType, value, constructorType, holder, servicesInjector);
+            final String value, 
+            final Class<?> constructorType,
+            final FacetHolder holder) {
+        
+        super(mixinType, value, constructorType, holder);
     }
 
     public static MixinFacet create(
             final Class<?> candidateMixinType, final FacetHolder facetHolder,
-            final ServicesInjector servicesInjector) {
+            final ServiceInjector servicesInjector) {
         final Mixin mixin = candidateMixinType.getAnnotation(Mixin.class);
         if(mixin == null) {
             return null;
@@ -54,7 +55,7 @@ public class MixinFacetForMixinAnnotation extends MixinFacetAbstract {
                 continue;
             }
             final Class<?> constructorType = constructorTypes[0];
-            return new MixinFacetForMixinAnnotation(candidateMixinType, mixin.method(), constructorType, facetHolder, servicesInjector);
+            return new MixinFacetForMixinAnnotation(candidateMixinType, mixin.method(), constructorType, facetHolder);
         }
         return null;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
index 6f86b8e..e4597fe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
@@ -50,7 +50,7 @@ public class MixinFacetForMixinAnnotationFactory extends FacetFactoryAbstract im
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         final MixinFacet mixinFacet = MixinFacetForMixinAnnotation.create(candidateMixinType, facetHolder,
-                servicesInjector);
+                getServiceInjector());
         facetHolder.addFacet(mixinFacet);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java
index 5029f8c..afc2a56 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java
@@ -31,8 +31,6 @@ import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.navparent.method.NavigableParentFacetMethod;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
@@ -159,15 +157,6 @@ public class NavigableParentAnnotationFacetFactory extends FacetFactoryAbstract
 
         }));
     }
-
-    // -- ADAPTER INJECTION
-
-    @Override
-    public void setServicesInjector(final ServicesInjector servicesInjector) {
-        super.setServicesInjector(servicesInjector);
-        adapterManager = servicesInjector.getPersistenceSessionServiceInternal();
-    }
-
-    PersistenceSessionServiceInternal adapterManager;
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
index 8b17085..32f5e80 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
@@ -95,7 +95,7 @@ public class ObjectSpecIdFacetDerivedFromClassNameFactory
     private static boolean isService(final FacetHolder facetHolder) {
         if(facetHolder instanceof ObjectSpecification) {
             ObjectSpecification objectSpecification = (ObjectSpecification) facetHolder;
-            return objectSpecification.isService();
+            return objectSpecification.isBean();
         }
         return false;
     }
@@ -151,7 +151,7 @@ public class ObjectSpecIdFacetDerivedFromClassNameFactory
         if(objectSpec.isAbstract()) {
             return false;
         }
-        if (objectSpec.isPersistenceCapable()) {
+        if (objectSpec.isEntity()) {
             return true;
         }
         if (objectSpec.isViewModel()) {
@@ -166,7 +166,7 @@ public class ObjectSpecIdFacetDerivedFromClassNameFactory
         if(objectSpec.isMixin()) {
             return false;
         }
-        if (objectSpec.isService()) {
+        if (objectSpec.isBean()) {
             // don't check if domain service isn't a target in public API (UI/REST)
             final DomainServiceFacet domainServiceFacet = objectSpec.getFacet(DomainServiceFacet.class);
             if(domainServiceFacet != null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetAbstract.java
index a2bf04c..d43be97 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetAbstract.java
@@ -26,7 +26,6 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.parseable.parser.ParseableFacetUsingParser;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public abstract class ParseableFacetAbstract extends FacetAbstract implements ParseableFacet {
 
@@ -38,20 +37,19 @@ public abstract class ParseableFacetAbstract extends FacetAbstract implements Pa
     public ParseableFacetAbstract(
             final String candidateParserName,
             final Class<?> candidateParserClass,
-            final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
+            final FacetHolder holder) {
+        
         super(ParseableFacet.class, holder, Derivation.NOT_DERIVED);
 
         this.parserClass = ParserUtil.parserOrNull(candidateParserClass, candidateParserName);
         this.parseableFacetUsingParser = isValid()?
-                createParser(holder, servicesInjector):null;
+                createParser(holder):null;
     }
 
     private ParseableFacetUsingParser createParser(
-            final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
+            final FacetHolder holder) {
         final Parser<?> parser = (Parser<?>) ClassExtensions.newInstance(parserClass, FacetHolder.class, holder);
-        return new ParseableFacetUsingParser(parser, holder, servicesInjector);
+        return new ParseableFacetUsingParser(parser, holder);
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetFromConfiguration.java
index 0127bc8..56dd1f3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetFromConfiguration.java
@@ -19,18 +19,15 @@
 
 package org.apache.isis.core.metamodel.facets.object.parseable.annotcfg;
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacetAbstract;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 
 public class ParseableFacetFromConfiguration extends ParseableFacetAbstract {
 
     public ParseableFacetFromConfiguration(
             final String candidateParserName,
-            final FacetHolder holder,
-            final ServicesInjector servicesInjector,
-            final ObjectAdapterProvider adapterProvider) {
-        super(candidateParserName, null, holder, servicesInjector);
+            final FacetHolder holder) {
+        
+        super(candidateParserName, null, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
index 4325c33..5ccc210 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
@@ -25,7 +25,6 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.adapters.Parser;
 import org.apache.isis.applib.adapters.ParsingException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResultSet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
@@ -37,31 +36,23 @@ import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
 import org.apache.isis.core.metamodel.interactions.ParseValueContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 
 public class ParseableFacetUsingParser extends FacetAbstract implements ParseableFacet {
 
     private final Parser<?> parser;
-    private final AuthenticationSessionProvider authenticationSessionProvider;
-    private final ServicesInjector dependencyInjector;
-    private final ObjectAdapterProvider adapterProvider;
 
     public ParseableFacetUsingParser(
             final Parser<?> parser,
-            final FacetHolder holder,
-            final ServicesInjector servicesInjector) {
+            final FacetHolder holder) {
+        
         super(ParseableFacet.class, holder, Derivation.NOT_DERIVED);
         this.parser = parser;
-        this.authenticationSessionProvider = servicesInjector.getAuthenticationSessionProvider();
-        this.dependencyInjector = servicesInjector;
-        this.adapterProvider = servicesInjector.getPersistenceSessionServiceInternal();
     }
 
     @Override
     protected String toStringValues() {
-        dependencyInjector.injectServicesInto(parser);
+        getServiceInjector().injectServicesInto(parser);
         return parser.toString();
     }
 
@@ -88,7 +79,7 @@ public class ParseableFacetUsingParser extends FacetAbstract implements Parseabl
 
         final Object context = ObjectAdapter.Util.unwrapPojo(contextAdapter);
 
-        getDependencyInjector().injectServicesInto(parser);
+        getServiceInjector().injectServicesInto(parser);
 
         try {
             final Object parsed = parser.parseTextEntry(context, entry);
@@ -129,32 +120,8 @@ public class ParseableFacetUsingParser extends FacetAbstract implements Parseabl
     public String parseableTitle(final ObjectAdapter contextAdapter) {
         final Object pojo = ObjectAdapter.Util.unwrapPojo(contextAdapter);
 
-        getDependencyInjector().injectServicesInto(parser);
+        getServiceInjector().injectServicesInto(parser);
         return ((Parser)parser).parseableTitleOf(pojo);
     }
 
-    // /////////////////////////////////////////////////////////
-    // Dependencies (from constructor)
-    // /////////////////////////////////////////////////////////
-
-    /**
-     * @return the dependencyInjector
-     */
-    public ServicesInjector getDependencyInjector() {
-        return dependencyInjector;
-    }
-
-    /**
-     * @return the authenticationSessionProvider
-     */
-    public AuthenticationSessionProvider getAuthenticationSessionProvider() {
-        return authenticationSessionProvider;
-    }
-
-    /**
-     * @return the adapterProvider
-     */
-    public ObjectAdapterProvider getObjectAdapterProvider() {
-        return adapterProvider;
-    }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnPropertyDerivedFromRecreatableObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnPropertyDerivedFromRecreatableObject.java
index f3e67ad..6fb2851 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnPropertyDerivedFromRecreatableObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnPropertyDerivedFromRecreatableObject.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.object.recreatable;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetAbstract;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
@@ -43,8 +42,6 @@ public class DisabledFacetOnPropertyDerivedFromRecreatableObject extends Disable
         if (!cloneable) {
             return "Non-cloneable view models are read-only";
         }
-
-        final Facet underlyingFacet = getUnderlyingFacet();
         return null;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
index d65ccdb..0610273 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
@@ -29,25 +29,22 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.MarkerFacetAbstract;
 import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
 
 public abstract class RecreatableObjectFacetAbstract extends MarkerFacetAbstract implements ViewModelFacet {
 
     private final PostConstructMethodCache postConstructMethodCache;
     private final ViewModelFacet.RecreationMechanism recreationMechanism;
-    protected final ServicesInjector servicesInjector;
 
     public static Class<? extends Facet> type() {
         return ViewModelFacet.class;
     }
 
     public RecreatableObjectFacetAbstract(final FacetHolder holder, final RecreationMechanism recreationMechanism,
-            final PostConstructMethodCache postConstructMethodCache, final ServicesInjector servicesInjector) {
+            final PostConstructMethodCache postConstructMethodCache) {
         super(type(), holder);
         this.postConstructMethodCache = postConstructMethodCache;
         this.recreationMechanism = recreationMechanism;
-        this.servicesInjector = servicesInjector;
     }
 
     @Override
@@ -85,7 +82,7 @@ public abstract class RecreatableObjectFacetAbstract extends MarkerFacetAbstract
             throw new IllegalStateException("This view model instantiates rather than initializes");
... 38819 lines suppressed ...